/ Hex Artifact Content
Login

Artifact 6046da2a92998b8fe004ed4eadd4d7f53d6a8e4d99e5e25a0cc7de6de5f6b26b:


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 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23 20  # undef popen.# 
0de0: 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70 6f  define popen _po
0df0: 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c 6f  pen.# undef pclo
0e00: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c 6f  se.# define pclo
0e10: 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73 65  se _pclose.#else
0e20: 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  . /* Make sure i
0e30: 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70 72  satty() has a pr
0e40: 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78 74  ototype. */. ext
0e50: 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28 69  ern int isatty(i
0e60: 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66 69  nt);..# if !defi
0e70: 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20  ned(__RTP__) && 
0e80: 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45  !defined(_WRS_KE
0e90: 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65 6e  RNEL).  /* popen
0ea0: 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65 20   and pclose are 
0eb0: 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f 6e  not C89 function
0ec0: 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20 2a  s and so are.  *
0ed0: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69 74  * sometimes omit
0ee0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73 74  ted from the <st
0ef0: 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a 2f  dio.h> header */
0f00: 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45 20  .   extern FILE 
0f10: 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  *popen(const cha
0f20: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  r*,const char*);
0f30: 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 70  .   extern int p
0f40: 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23 20  close(FILE*);.# 
0f50: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 53  else.#  define S
0f60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
0f70: 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69   1.# endif.#endi
0f80: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
0f90: 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57 69  WIN32_WCE)./* Wi
0fa0: 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69  ndows CE (arm-wi
0fb0: 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63  nce-mingw32ce-gc
0fc0: 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76  c) does not prov
0fd0: 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a 20  ide isatty(). * 
0fe0: 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20 61  thus we always a
0ff0: 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68 61  ssume that we ha
1000: 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54 68  ve a console. Th
1010: 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76 65  at can be. * ove
1020: 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68 65  rridden with the
1030: 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64 20   -batch command 
1040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a 2f  line option.. */
1050: 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79 28  .#define isatty(
1060: 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  x) 1.#endif../* 
1070: 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68 61  ctype macros tha
1080: 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67 6e  t work with sign
1090: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  ed characters */
10a0: 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63 65  .#define IsSpace
10b0: 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75 6e  (X)  isspace((un
10c0: 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23  signed char)X).#
10d0: 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28 58  define IsDigit(X
10e0: 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  )  isdigit((unsi
10f0: 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64 65  gned char)X).#de
1100: 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29 20  fine ToLower(X) 
1110: 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28 28   (char)tolower((
1120: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29  unsigned char)X)
1130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
1140: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1150: 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64 65  (WIN32).#include
1160: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f 2a   <windows.h>../*
1170: 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73 69   string conversi
1180: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c 79  on routines only
1190: 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33 32   needed on Win32
11a0: 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72 20   */.extern char 
11b0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
11c0: 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c  nicode_to_utf8(L
11d0: 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e 20  PCWSTR);.extern 
11e0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
11f0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1200: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1210: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 63  , int);.extern c
1220: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
1230: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
1240: 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  v2(const char *,
1250: 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c 50   int);.extern LP
1260: 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e  WSTR sqlite3_win
1270: 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  32_utf8_to_unico
1280: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
1290: 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  Text);.#endif../
12a0: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  * On Windows, we
12b0: 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77 69   normally run wi
12c0: 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  th output mode o
12d0: 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20 5c  f TEXT so that \
12e0: 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  n characters.** 
12f0: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
1300: 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  y translated int
1310: 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65 72  o \r\n.  However
1320: 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  , this behavior 
1330: 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20 64  needs.** to be d
1340: 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65 20  isabled in some 
1350: 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e 20  cases (ex: when 
1360: 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20 6f  generating CSV o
1370: 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a 2a  utput and when.*
1380: 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f 74  * rendering quot
1390: 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74 20  ed strings that 
13a0: 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72 61  contain \n chara
13b0: 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f 6c  cters).  The fol
13c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
13d0: 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20  es take care of 
13e0: 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  that..*/.#if def
13f0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
1400: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 73  defined(WIN32).s
1410: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42 69  tatic void setBi
1420: 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a 66  naryMode(FILE *f
1430: 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75  ile, int isOutpu
1440: 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70  t){.  if( isOutp
1450: 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65  ut ) fflush(file
1460: 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66  );.  _setmode(_f
1470: 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f  ileno(file), _O_
1480: 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74 69  BINARY);.}.stati
1490: 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d 6f  c void setTextMo
14a0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
14b0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
14c0: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
14d0: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
14e0: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
14f0: 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29 3b  file), _O_TEXT);
1500: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1510: 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28  e setBinaryMode(
1520: 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73 65  X,Y).# define se
1530: 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a 23  tTextMode(X,Y).#
1540: 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65 20  endif.../* True 
1550: 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73 20  if the timer is 
1560: 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69  enabled */.stati
1570: 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d 65  c int enableTime
1580: 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75 72  r = 0;../* Retur
1590: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61  n the current wa
15a0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f  ll-clock time */
15b0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
15c0: 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79 28  int64 timeOfDay(
15d0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
15e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f  sqlite3_vfs *clo
15f0: 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c  ckVfs = 0;.  sql
1600: 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20  ite3_int64 t;.  
1610: 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20  if( clockVfs==0 
1620: 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c  ) clockVfs = sql
1630: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1640: 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73  ;.  if( clockVfs
1650: 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
1660: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1670: 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30 20  entTimeInt64!=0 
1680: 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  ){.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  >xCurrentTimeInt
16a0: 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29  64(clockVfs, &t)
16b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
16c0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f  ouble r;.    clo
16d0: 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  ckVfs->xCurrentT
16e0: 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72  ime(clockVfs, &r
16f0: 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c 69  );.    t = (sqli
1700: 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34  te3_int64)(r*864
1710: 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20  00000.0);.  }.  
1720: 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69 66  return t;.}..#if
1730: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
1740: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57 49  ) && !defined(WI
1750: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
1760: 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c 75  (__minux).#inclu
1770: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
1780: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
1790: 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56 78  source.h>../* Vx
17a0: 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20 73  Works does not s
17b0: 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67 65  upport getrusage
17c0: 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65 20  () as far as we 
17d0: 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a 2f  can determine */
17e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 52  .#if defined(_WR
17f0: 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65 66  S_KERNEL) || def
1800: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73 74  ined(__RTP__).st
1810: 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20 20  ruct rusage {.  
1820: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72  struct timeval r
1830: 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65 72  u_utime; /* user
1840: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1850: 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  /.  struct timev
1860: 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a 20  al ru_stime; /* 
1870: 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65 20  system CPU time 
1880: 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  used */.};.#defi
1890: 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c 42  ne getrusage(A,B
18a0: 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69 7a  ) memset(B,0,siz
18b0: 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66 0a  eof(*B)).#endif.
18c0: 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75 72  ./* Saved resour
18d0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
18e0: 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  or the beginning
18f0: 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e   of an operation
1900: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1910: 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e 3b  t rusage sBegin;
1920: 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61 74    /* CPU time at
1930: 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69 63   start */.static
1940: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1950: 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c 2d  Begin;  /* Wall-
1960: 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73 74  clock time at st
1970: 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65  art */../*.** Be
1980: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
1990: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
19a0: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
19b0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
19c0: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
19d0: 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
19e0: 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69 6e  GE_SELF, &sBegin
19f0: 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d 20  );.    iBegin = 
1a00: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d  timeOfDay();.  }
1a10: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
1a20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20  e difference of 
1a30: 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74 73  two time_structs
1a40: 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73   in seconds */.s
1a50: 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d  tatic double tim
1a60: 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69 6d  eDiff(struct tim
1a70: 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73 74  eval *pStart, st
1a80: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 45  ruct timeval *pE
1a90: 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  nd){.  return (p
1aa0: 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20 70  End->tv_usec - p
1ab0: 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29 2a  Start->tv_usec)*
1ac0: 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20 20  0.000001 +.     
1ad0: 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45 6e      (double)(pEn
1ae0: 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74 61  d->tv_sec - pSta
1af0: 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a 0a  rt->tv_sec);.}..
1b00: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
1b10: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
1b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1b30: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
1b40: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
1b50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b60: 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69 6d  int64 iEnd = tim
1b70: 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73 74  eOfDay();.    st
1b80: 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e 64  ruct rusage sEnd
1b90: 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28  ;.    getrusage(
1ba0: 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 45  RUSAGE_SELF, &sE
1bb0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
1bc0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
1bd0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
1be0: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
1bf0: 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a 30  iEnd - iBegin)*0
1c00: 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d  .001,.       tim
1c10: 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72 75  eDiff(&sBegin.ru
1c20: 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75  _utime, &sEnd.ru
1c30: 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20 20  _utime),.       
1c40: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1c50: 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_stime, &sEnd
1c60: 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20 7d  .ru_stime));.  }
1c70: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49  .}..#define BEGI
1c80: 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d  N_TIMER beginTim
1c90: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44  er().#define END
1ca0: 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28  _TIMER endTimer(
1cb0: 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  ).#define HAS_TI
1cc0: 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64 65  MER 1..#elif (de
1cd0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1ce0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
1cf0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1d00: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1d10: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1d20: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1d30: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e 44  n */.static HAND
1d40: 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74 61  LE hProcess;.sta
1d50: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 4b  tic FILETIME ftK
1d60: 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61 74  ernelBegin;.stat
1d70: 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55 73  ic FILETIME ftUs
1d80: 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63 20  erBegin;.static 
1d90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
1da0: 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65 64  WallBegin;.typed
1db0: 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49 20  ef BOOL (WINAPI 
1dc0: 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28 48  *GETPROCTIMES)(H
1dd0: 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ANDLE, LPFILETIM
1de0: 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a 20  E, LPFILETIME,. 
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e10: 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c     LPFILETIME, L
1e20: 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61 74  PFILETIME);.stat
1e30: 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53 20  ic GETPROCTIMES 
1e40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1e50: 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a  ddr = NULL;../*.
1e60: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1e70: 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65 72  if we have timer
1e80: 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75 72   support.  Retur
1e90: 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72 79  n 1 if necessary
1ea0: 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75 6e  .** support foun
1eb0: 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65 76  d (or found prev
1ec0: 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61 74  iously)..*/.stat
1ed0: 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72 28  ic int hasTimer(
1ee0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65 74  void){.  if( get
1ef0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
1f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1f10: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
1f20: 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54 69   /* GetProcessTi
1f30: 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70 70  mes() isn't supp
1f40: 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20 61  orted in WIN95 a
1f50: 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57 69  nd some other Wi
1f60: 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65 72  ndows.    ** ver
1f70: 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74 68  sions. See if th
1f80: 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72 65  e version we are
1f90: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73 20   running on has 
1fa0: 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20 20  it, and if it.  
1fb0: 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65 20    ** does, save 
1fc0: 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  off a pointer to
1fd0: 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72 72   it and the curr
1fe0: 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e 64  ent process hand
1ff0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 68  le..    */.    h
2000: 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75 72  Process = GetCur
2010: 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a 20  rentProcess();. 
2020: 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 20     if( hProcess 
2030: 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41 4e  ){.      HINSTAN
2040: 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c 6f  CE hinstLib = Lo
2050: 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28 22  adLibrary(TEXT("
2060: 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29 3b  Kernel32.dll"));
2070: 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20  .      if( NULL 
2080: 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a 20  != hinstLib ){. 
2090: 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65 73         getProces
20a0: 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20 20  sTimesAddr =.   
20b0: 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52 4f           (GETPRO
20c0: 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63 41  CTIMES) GetProcA
20d0: 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62 2c  ddress(hinstLib,
20e0: 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d 65   "GetProcessTime
20f0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s");.        if(
2100: 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f 63   NULL != getProc
2110: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
2120: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2140: 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61 72        FreeLibrar
2150: 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20 20  y(hinstLib);.   
2160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2170: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2180: 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67  .** Begin timing
2190: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f   an operation.*/
21a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67  .static void beg
21b0: 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  inTimer(void){. 
21c0: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
21d0: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
21e0: 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 46  mesAddr ){.    F
21f0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
2200: 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20 20  on, ftExit;.    
2210: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2220: 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74  ddr(hProcess,&ft
2230: 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74  Creation,&ftExit
2240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2250: 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65 72            &ftKer
2260: 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65 72  nelBegin,&ftUser
2270: 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57 61  Begin);.    ftWa
2280: 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66  llBegin = timeOf
2290: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
22a0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
22b0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46 49  erence of two FI
22c0: 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20 69  LETIME structs i
22d0: 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74 61  n seconds */.sta
22e0: 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65 44  tic double timeD
22f0: 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70 53  iff(FILETIME *pS
2300: 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20 2a  tart, FILETIME *
2310: 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65 5f  pEnd){.  sqlite_
2320: 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20 3d  int64 i64Start =
2330: 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34   *((sqlite_int64
2340: 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20 73   *) pStart);.  s
2350: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 45  qlite_int64 i64E
2360: 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69  nd = *((sqlite_i
2370: 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a 20  nt64 *) pEnd);. 
2380: 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65 29   return (double)
2390: 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34 53   ((i64End - i64S
23a0: 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30 30  tart) / 10000000
23b0: 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .0);.}../*.** Pr
23c0: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
23d0: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
23e0: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
23f0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2400: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2410: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 29  rocessTimesAddr)
2420: 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66  {.    FILETIME f
2430: 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69  tCreation, ftExi
2440: 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 20  t, ftKernelEnd, 
2450: 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20 73  ftUserEnd;.    s
2460: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 57  qlite3_int64 ftW
2470: 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44  allEnd = timeOfD
2480: 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72 6f  ay();.    getPro
2490: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
24a0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
24b0: 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b 65  on,&ftExit,&ftKe
24c0: 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72 45  rnelEnd,&ftUserE
24d0: 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  nd);.    printf(
24e0: 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c 20  "Run Time: real 
24f0: 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79 73  %.3f user %f sys
2500: 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20 28   %f\n",.       (
2510: 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57 61  ftWallEnd - ftWa
2520: 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a  llBegin)*0.001,.
2530: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
2540: 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26 66  &ftUserBegin, &f
2550: 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20 20  tUserEnd),.     
2560: 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b 65    timeDiff(&ftKe
2570: 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b 65  rnelBegin, &ftKe
2580: 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a 7d  rnelEnd));.  }.}
2590: 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e 5f  ..#define BEGIN_
25a0: 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65 72  TIMER beginTimer
25b0: 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54  ().#define END_T
25c0: 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29 0a  IMER endTimer().
25d0: 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45  #define HAS_TIME
25e0: 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23 65  R hasTimer()..#e
25f0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47 49  lse.#define BEGI
2600: 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65 20  N_TIMER.#define 
2610: 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e  END_TIMER.#defin
2620: 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23 65  e HAS_TIMER 0.#e
2630: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 64  ndif../*.** Used
2640: 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72 6e   to prevent warn
2650: 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73 65  ings about unuse
2660: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f 0a  d parameters.*/.
2670: 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50  #define UNUSED_P
2680: 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f 69  ARAMETER(x) (voi
2690: 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75 6d  d)(x)../*.** Num
26a0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
26b0: 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a 23  in an array.*/.#
26c0: 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a 65  define ArraySize
26d0: 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65 6f  (X)  (int)(sizeo
26e0: 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d  f(X)/sizeof(X[0]
26f0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ))../*.** If the
2700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67 20   following flag 
2710: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f 6d  is set, then com
2720: 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20 73  mand execution s
2730: 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65 72  tops.** at an er
2740: 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ror if we are no
2750: 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a 2a  t interactive..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 69  /.static int bai
2770: 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b 0a  l_on_error = 0;.
2780: 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73 74  ./*.** Threat st
2790: 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72 61  din as an intera
27a0: 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20 74  ctive input if t
27b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
27c0: 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75 65  iable.** is true
27d0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  .  Otherwise, as
27e0: 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63 6f  sume stdin is co
27f0: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69 6c  nnected to a fil
2800: 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73 74  e or pipe..*/.st
2810: 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f 69  atic int stdin_i
2820: 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20  s_interactive = 
2830: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69 6e  1;../*.** On Win
2840: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65 20  dows systems we 
2850: 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66 20  have to know if 
2860: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
2870: 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a 20  is a console.** 
2880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61 6e  in order to tran
2890: 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74 6f  slate UTF-8 into
28a0: 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c 6c   MBCS.  The foll
28b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
28c0: 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72 61  s.** true if tra
28d0: 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71 75  nslation is requ
28e0: 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ired..*/.static 
28f0: 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f  int stdout_is_co
2900: 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  nsole = 1;../*.*
2910: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2920: 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c 69  is the open SQLi
2930: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57 65  te database.  We
2940: 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72 0a   make a pointer.
2950: 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ** to this datab
2960: 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61 72  ase a static var
2970: 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74  iable so that it
2980: 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65 64   can be accessed
2990: 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49 4e  .** by the SIGIN
29a0: 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e 74  T handler to int
29b0: 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  errupt database 
29c0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73  processing..*/.s
29d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a 67  tatic sqlite3 *g
29e0: 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f 2a  lobalDb = 0;../*
29f0: 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20 69  .** True if an i
2a00: 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72 6f  nterrupt (Contro
2a10: 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72 65  l-C) has been re
2a20: 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ceived..*/.stati
2a30: 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 73  c volatile int s
2a40: 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30  eenInterrupt = 0
2a50: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ;../*.** This is
2a60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75 72   the name of our
2a70: 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73 20   program. It is 
2a80: 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20 75  set in main(), u
2a90: 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d 62  sed.** in a numb
2aa0: 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61 63  er of other plac
2ab0: 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20 65  es, mostly for e
2ac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
2ad0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 41  /.static char *A
2ae0: 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rgv0;../*.** Pro
2af0: 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e 69  mpt strings. Ini
2b00: 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69 6e  tialized in main
2b10: 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68 0a  . Settable with.
2b20: 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61 69  **   .prompt mai
2b30: 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73 74  n continue.*/.st
2b40: 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50 72  atic char mainPr
2b50: 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f 2a  ompt[20];     /*
2b60: 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f 6d   First line prom
2b70: 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73 71  pt. default: "sq
2b80: 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69 63  lite> "*/.static
2b90: 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50 72   char continuePr
2ba0: 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6e  ompt[20]; /* Con
2bb0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
2bc0: 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20 2e  . default: "   .
2bd0: 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ..> " */../*.** 
2be0: 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69  Render output li
2bf0: 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 45  ke fprintf().  E
2c00: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 75  xcept, if the ou
2c10: 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
2c20: 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65 20   the.** console 
2c30: 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 72  and if this is r
2c40: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e 64  unning on a Wind
2c50: 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72 61  ows machine, tra
2c60: 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f 75  nslate the.** ou
2c70: 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38 20  tput from UTF-8 
2c80: 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23 69  into MBCS..*/.#i
2c90: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
2ca0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
2cb0: 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70 72  32).void utf8_pr
2cc0: 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c 20  intf(FILE *out, 
2cd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ce0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2cf0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
2d00: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2d10: 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f 69  ;.  if( stdout_i
2d20: 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f 75  s_console && (ou
2d30: 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75 74  t==stdout || out
2d40: 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20 20  ==stderr) ){.   
2d50: 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c 69   char *z1 = sqli
2d60: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
2d70: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 63  rmat, ap);.    c
2d80: 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65  har *z2 = sqlite
2d90: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
2da0: 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b 0a  mbcs_v2(z1, 0);.
2db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2dc0: 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73 28  (z1);.    fputs(
2dd0: 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73 71  z2, out);.    sq
2de0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b 0a  lite3_free(z2);.
2df0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66 70    }else{.    vfp
2e00: 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72 6d  rintf(out, zForm
2e10: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20 76  at, ap);.  }.  v
2e20: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6c  a_end(ap);.}.#el
2e30: 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66 38  if !defined(utf8
2e40: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2e50: 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66 70  e utf8_printf fp
2e60: 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rintf.#endif../*
2e70: 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70 75  .** Render outpu
2e80: 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28 29  t like fprintf()
2e90: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
2ea0: 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61 6e  ot be used on an
2eb0: 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 69  ything that.** i
2ec0: 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20 66  ncludes string f
2ed0: 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e 20  ormatting (e.g. 
2ee0: 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21 64  "%s")..*/.#if !d
2ef0: 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e 74  efined(raw_print
2f00: 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77 5f  f).# define raw_
2f10: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2f20: 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63 61  endif../* Indica
2f30: 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  te out-of-memory
2f40: 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73 74   and exit. */.st
2f50: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 5f  atic void shell_
2f60: 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76 6f  out_of_memory(vo
2f70: 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74  id){.  raw_print
2f80: 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
2f90: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2fa0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
2fb0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2fc0: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2fe0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2ff0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
3000: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
3010: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
3020: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
3030: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
3040: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
3050: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
3060: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
3070: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
3080: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
3090: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
30a0: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
30b0: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
30c0: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
30d0: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
30e0: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
30f0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
3100: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
3110: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3120: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
3130: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
3140: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
3150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3160: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3170: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
3180: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
3190: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
31a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31b0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
31c0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
31d0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
31e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
31f0: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
3200: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
3210: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
3220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
3230: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
3240: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
3250: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
3260: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
3270: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3280: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3290: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
32a0: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
32b0: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
32c0: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
32d0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
32e0: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
32f0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3300: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3310: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
3320: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
3330: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
3340: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
3350: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
3360: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
3370: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3380: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3390: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
33a0: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
33b0: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
33c0: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
33d0: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
33e0: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
33f0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3400: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3410: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
3420: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
3430: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
3440: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
3450: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
3460: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
3470: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3480: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3490: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
34a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34b0: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
34c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
34d0: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
34e0: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
34f0: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3500: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3510: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
3520: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
3530: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
3540: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
3550: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
3560: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
3570: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3580: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3590: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
35a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
35b0: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
35c0: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
35d0: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
35e0: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
35f0: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3600: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
3620: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
3630: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
3640: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
3650: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
3660: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
3670: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3680: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3690: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
36a0: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
36b0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
36c0: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
36d0: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
36e0: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
36f0: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3700: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3710: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
3720: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
3730: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
3740: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3750: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
3760: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
3770: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3780: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3790: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
37a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
37b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
37c0: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
37d0: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
37e0: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
37f0: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3800: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3810: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3820: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
3830: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
3840: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
3850: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
3860: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
3870: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3880: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3890: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
38a0: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
38b0: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
38c0: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
38d0: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
38e0: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
38f0: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3900: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3910: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
3920: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
3930: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
3940: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
3950: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
3960: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
3970: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3980: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3990: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
39a0: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
39b0: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
39c0: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
39d0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
39e0: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
39f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3a00: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3a10: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
3a20: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
3a30: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
3a40: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
3a50: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
3a60: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
3a70: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3a80: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3a90: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3aa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3ab0: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3ad0: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3ae0: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3af0: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3b00: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3b10: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
3b20: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
3b30: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
3b40: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
3b50: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
3b60: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
3b70: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3b80: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3b90: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3ba0: 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
3bb0: 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
3bc0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
3bd0: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
3be0: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
3bf0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
3c00: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
3c10: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
3c20: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3c30: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3c40: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
3c60: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
3c70: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3c80: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3c90: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3ca0: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
3cb0: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
3cc0: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
3cd0: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
3ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3cf0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
3d00: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3d10: 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f  d(WIN32).  /* Fo
3d20: 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  r interactive in
3d30: 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  put on Windows s
3d40: 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74  ystems, translat
3d50: 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69  e the.  ** multi
3d60: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
3d70: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  et characters in
3d80: 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69  to UTF-8. */.  i
3d90: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
3da0: 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73  ractive && in==s
3db0: 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  tdin ){.    char
3dc0: 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   *zTrans = sqlit
3dd0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
3de0: 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20  _utf8_v2(zLine, 
3df0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61  0);.    if( zTra
3e00: 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ns ){.      int 
3e10: 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33  nTrans = strlen3
3e20: 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20  0(zTrans)+1;.   
3e30: 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c     if( nTrans>nL
3e40: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ine ){.        z
3e50: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3e60: 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  Line, nTrans);. 
3e70: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
3e80: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
3e90: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20  of_memory();.   
3ea0: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
3eb0: 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73 2c  y(zLine, zTrans,
3ec0: 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20   nTrans);.      
3ed0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72  sqlite3_free(zTr
3ee0: 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ans);.    }.  }.
3ef0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
3f00: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3f10: 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a 20  ined(WIN32) */. 
3f20: 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a 7d   return zLine;.}
3f30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
3f40: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
3f50: 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a 2a  f input text..**
3f60: 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68 65  .** If in==0 the
3f70: 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61 6e  n read from stan
3f80: 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20 70  dard input and p
3f90: 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61 63  rompt before eac
3fa0: 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69 73  h line..** If is
3fb0: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20  Continuation is 
3fc0: 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f 6e  true, then a con
3fd0: 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70 74  tinuation prompt
3fe0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
3ff0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
4000: 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20 74  ation is zero, t
4010: 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  hen the main pro
4020: 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  mpt should be us
4030: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50 72  ed..**.** If zPr
4040: 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ior is not NULL 
4050: 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75 66  then it is a buf
4060: 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  fer from a prior
4070: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a   call to this.**
4080: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63 61   routine that ca
4090: 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a 0a  n be reused..**.
40a0: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
40b0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
40c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
40d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
40e0: 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66 72   either.** be fr
40f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
4100: 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65 64  r or else passed
4110: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73 20   back into this 
4120: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65 0a  routine via the.
4130: 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d 65  ** zPrior argume
4140: 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a 2f  nt for reuse..*/
4150: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f 6e  .static char *on
4160: 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49 4c  e_input_line(FIL
4170: 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50 72  E *in, char *zPr
4180: 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74 69  ior, int isConti
4190: 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61 72  nuation){.  char
41a0: 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68 61   *zPrompt;.  cha
41b0: 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69 66  r *zResult;.  if
41c0: 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20 7a  ( in!=0 ){.    z
41d0: 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67  Result = local_g
41e0: 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 69  etline(zPrior, i
41f0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
4200: 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f 6e   zPrompt = isCon
4210: 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e 74  tinuation ? cont
4220: 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61 69  inuePrompt : mai
4230: 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48 45  nPrompt;.#if SHE
4240: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
4250: 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66 28  LINE.    printf(
4260: 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a  "%s", zPrompt);.
4270: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
4280: 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  t);.    zResult 
4290: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
42a0: 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b 0a  zPrior, stdin);.
42b0: 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28 7a  #else.    free(z
42c0: 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65 73  Prior);.    zRes
42d0: 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61 64  ult = shell_read
42e0: 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a 20  line(zPrompt);. 
42f0: 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20 26     if( zResult &
4300: 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68 65  & *zResult ) she
4310: 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 7a  ll_add_history(z
4320: 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66 0a  Result);.#endif.
4330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
4340: 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  sult;.}.../*.** 
4350: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4360: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
4370: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
4380: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
4390: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
43a0: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
43b0: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
43c0: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
43d0: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
43e0: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
43f0: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
4400: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
4410: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
4420: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
4430: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
4440: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
4450: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
4460: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
4470: 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74  t zArg as an int
4480: 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73  eger value, poss
4490: 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78  ibly with suffix
44a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  es..*/.static sq
44b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65  lite3_int64 inte
44c0: 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63  gerValue(const c
44d0: 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71  har *zArg){.  sq
44e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20  lite3_int64 v = 
44f0: 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
4500: 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72 20  t struct { char 
4510: 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d  *zSuffix; int iM
4520: 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d  ult; } aMult[] =
4530: 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20   {.    { "KiB", 
4540: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1024 },.    { "M
4550: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d  iB", 1024*1024 }
4560: 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31  ,.    { "GiB", 1
4570: 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c  024*1024*1024 },
4580: 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30  .    { "KB",  10
4590: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22  00 },.    { "MB"
45a0: 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20  ,  1000000 },.  
45b0: 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30    { "GB",  10000
45c0: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
45d0: 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20  K",   1000 },.  
45e0: 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30    { "M",   10000
45f0: 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c  00 },.    { "G",
4600: 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c     1000000000 },
4610: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
4620: 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a   int isNeg = 0;.
4630: 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
4640: 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20  -' ){.    isNeg 
4650: 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b  = 1;.    zArg++;
4660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72  .  }else if( zAr
4670: 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20  g[0]=='+' ){.   
4680: 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69   zArg++;.  }.  i
4690: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
46a0: 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
46b0: 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  ){.    int x;.  
46c0: 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20    zArg += 2;.   
46d0: 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78   while( (x = hex
46e0: 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
46f0: 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  0]))>=0 ){.     
4700: 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b   v = (v<<4) + x;
4710: 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  .      zArg++;. 
4720: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4730: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
4740: 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20  (zArg[0]) ){.   
4750: 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41     v = v*10 + zA
4760: 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20  rg[0] - '0';.   
4770: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
4780: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4790: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c  i<ArraySize(aMul
47a0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t); i++){.    if
47b0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
47c0: 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66  p(aMult[i].zSuff
47d0: 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a  ix, zArg)==0 ){.
47e0: 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74        v *= aMult
47f0: 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20  [i].iMult;.     
4800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4810: 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67  }.  return isNeg
4820: 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a  ? -v : v;.}../*.
4830: 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c 65  ** A variable le
4840: 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20 77  ngth string to w
4850: 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70 70  hich one can app
4860: 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79 70  end text..*/.typ
4870: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
4880: 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74 3b  lText ShellText;
4890: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78  .struct ShellTex
48a0: 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  t {.  char *z;. 
48b0: 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e 41   int n;.  int nA
48c0: 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lloc;.};../*.** 
48d0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
48e0: 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54 65  estroy a ShellTe
48f0: 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  xt object.*/.sta
4900: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65 78  tic void initTex
4910: 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29 7b  t(ShellText *p){
4920: 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
4930: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73  sizeof(*p));.}.s
4940: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
4950: 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70  ext(ShellText *p
4960: 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29 3b  ){.  free(p->z);
4970: 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b 0a  .  initText(p);.
4980: 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69 74  }../* zIn is eit
4990: 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  her a pointer to
49a0: 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74   a NULL-terminat
49b0: 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65 6d  ed string in mem
49c0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ory obtained.** 
49d0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20 6f  from malloc(), o
49e0: 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  r a NULL pointer
49f0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f 69  . The string poi
4a00: 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70 65  nted to by zAppe
4a10: 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 74  nd is.** added t
4a20: 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20 72  o zIn, and the r
4a30: 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 69  esult returned i
4a40: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
4a60: 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20 77  .** zIn, if it w
4a70: 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73 20  as not NULL, is 
4a80: 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
4a90: 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
4aa0: 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e 6f  nt, quote, is no
4ab0: 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74 20  t '\0', then it 
4ac0: 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  is used as a.** 
4ad0: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  quote character 
4ae0: 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f 0a  for zAppend..*/.
4af0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
4b00: 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  ndText(ShellText
4b10: 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74 20   *p, char const 
4b20: 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20 71  *zAppend, char q
4b30: 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  uote){.  int len
4b40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4b50: 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65   nAppend = strle
4b60: 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a 20  n30(zAppend);.. 
4b70: 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b 70   len = nAppend+p
4b80: 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75 6f  ->n+1;.  if( quo
4b90: 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b 3d  te ){.    len +=
4ba0: 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   2;.    for(i=0;
4bb0: 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29   i<nAppend; i++)
4bc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70 70  {.      if( zApp
4bd0: 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29 20  end[i]==quote ) 
4be0: 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  len++;.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65 6e  ..  if( p->n+len
4c00: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
4c10: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70     p->nAlloc = p
4c20: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65 6e  ->nAlloc*2 + len
4c30: 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a 20   + 20;.    p->z 
4c40: 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  = realloc(p->z, 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
4c60: 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
4c70: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
4c80: 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y();.  }..  if( 
4c90: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61  quote ){.    cha
4ca0: 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70  r *zCsr = p->z+p
4cb0: 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b  ->n;.    *zCsr++
4cc0: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f   = quote;.    fo
4cd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a  ; i++){.      *z
4cf0: 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b  Csr++ = zAppend[
4d00: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  i];.      if( zA
4d10: 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20  ppend[i]==quote 
4d20: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74  ) *zCsr++ = quot
4d30: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  e;.    }.    *zC
4d40: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
4d50: 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a    p->n = (int)(z
4d60: 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20  Csr - p->z);.   
4d70: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
4d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63   }else{.    memc
4d90: 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41  py(p->z+p->n, zA
4da0: 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b  ppend, nAppend);
4db0: 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70  .    p->n += nAp
4dc0: 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70  pend;.    p->z[p
4dd0: 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  ->n] = '\0';.  }
4de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
4df0: 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
4e00: 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61  f identifier zNa
4e10: 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71  me needs to be q
4e20: 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a  uoted, either.**
4e30: 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
4e40: 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75  ains non-alphanu
4e50: 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73  meric characters
4e60: 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  , or because it 
4e70: 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  is an.** SQLite 
4e80: 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e  keyword.  Be con
4e90: 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69  servative in thi
4ea0: 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65  s estimate:  Whe
4eb0: 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d  n in doubt assum
4ec0: 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e  e.** that quotin
4ed0: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  g is required..*
4ee0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20  *.** Return '"' 
4ef0: 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65  if quoting is re
4f00: 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20  quired.  Return 
4f10: 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20  0 if no quoting 
4f20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
4f30: 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74  static char quot
4f40: 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72  eChar(const char
4f50: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4f60: 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68  i;.  if( !isalph
4f70: 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  a((unsigned char
4f80: 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e  )zName[0]) && zN
4f90: 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65  ame[0]!='_' ) re
4fa0: 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28  turn '"';.  for(
4fb0: 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69  i=0; zName[i]; i
4fc0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73  ++){.    if( !is
4fd0: 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20  alnum((unsigned 
4fe0: 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26  char)zName[i]) &
4ff0: 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20  & zName[i]!='_' 
5000: 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20  ) return '"';.  
5010: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
5020: 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63 6b  e3_keyword_check
5030: 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22 27  (zName, i) ? '"'
5040: 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   : 0;.}../*.** C
5050: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
5060: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
5070: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5080: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5090: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
50a0: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
50b0: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
50c0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
50d0: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
50e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
50f0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5100: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
5120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5130: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
5140: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
5150: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
5160: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
5170: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5180: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5190: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
51a0: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
51b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
51c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
51d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
51e0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
51f0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5200: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5210: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
5220: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
5230: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
5240: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
5250: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
5260: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
5270: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
52a0: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
52b0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
52c0: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
52d0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
52e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
52f0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5300: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5310: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
5320: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5330: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
5340: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5350: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5360: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
5370: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5380: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5390: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
53a0: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
53b0: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
53c0: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
53d0: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
53e0: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
53f0: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5400: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5410: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
5420: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5440: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
5450: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
5460: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
5470: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5480: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5490: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
54a0: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
54b0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
54c0: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
54d0: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
54e0: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
54f0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5500: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5510: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5520: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5530: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5540: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5550: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5560: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5570: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5580: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5590: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
55a0: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
55b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
55c0: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
55d0: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
55e0: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
55f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5600: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5610: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5620: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5630: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5640: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5650: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5660: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5670: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5680: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5690: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
56a0: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
56b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
56c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
56d0: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
56e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
56f0: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5700: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5710: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5720: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5730: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5740: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5770: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5780: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5790: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
57a0: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
57b0: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
57c0: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
57d0: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
57e0: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
57f0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5800: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5810: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5820: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5830: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5840: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5850: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5860: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5870: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5880: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5890: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
58a0: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
58b0: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
58c0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
58d0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
58e0: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
58f0: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5900: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5910: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5920: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5930: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5940: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5950: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5960: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5970: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5980: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5990: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
59a0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
59b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
59c0: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
59d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
59e0: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
59f0: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5a00: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5a10: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5a20: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5a30: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5a40: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5a50: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5a70: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5a80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5a90: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
5aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5ab0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
5ac0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5ad0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
5ae0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5af0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
5b00: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b10: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
5b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
5b30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5b40: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
5b50: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
5b60: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
5b70: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
5b80: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
5b90: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
5ba0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
5bb0: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
5bc0: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
5bd0: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
5be0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
5bf0: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
5c10: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
5c20: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
5c30: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
5c40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5c50: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
5c60: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
5c70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
5c80: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
5c90: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
5ca0: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
5cb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cc0: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5cd0: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5ce0: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d00: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d10: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
5d20: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
5d30: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
5d40: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5d60: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5d70: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
5d80: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
5d90: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
5da0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5db0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
5dc0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
5dd0: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
5de0: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
5df0: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
5e00: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
5e10: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
5e20: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
5e30: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
5e50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5e60: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
5e70: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
5e80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5e90: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
5ea0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5eb0: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
5ec0: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
5ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5ee0: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
5ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5f00: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
5f10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f20: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
5f30: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
5f40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5f50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
5f60: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5f70: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5f80: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
5f90: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
5fa0: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
5fb0: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
5fc0: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
5fd0: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
5fe0: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
5ff0: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6000: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6010: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
6020: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
6030: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
6040: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
6050: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
6060: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
6070: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6080: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6090: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
60a0: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
60b0: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
60c0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
60d0: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
60e0: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
60f0: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6100: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6110: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
6120: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
6130: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
6140: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
6150: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
6160: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
6170: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6180: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6190: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
61a0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
61b0: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
61c0: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
61d0: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
61e0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
61f0: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6200: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6210: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6220: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6230: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6240: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
6250: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
6260: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
6270: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6280: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6290: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
62b0: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
62c0: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
62d0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
62e0: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
62f0: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6300: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6310: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6320: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6330: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6350: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
6360: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
6370: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63a0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
63b0: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
63c0: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
63d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
63e0: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
63f0: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6400: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6410: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6420: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6430: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
6450: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
6460: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
6470: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6480: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6490: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64a0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
64b0: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
64c0: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
64d0: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
64e0: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
64f0: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6500: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6510: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6520: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6530: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6540: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6550: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6560: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6570: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6580: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6590: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65a0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
65b0: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
65c0: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
65d0: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
65e0: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
65f0: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6600: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6610: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6620: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6630: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6640: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6650: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6660: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
6670: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
6680: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
6690: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66a0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
66b0: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
66c0: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
66d0: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
66e0: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
66f0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6700: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6710: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6720: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6730: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6740: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
6750: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
6760: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
6770: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
6780: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
6790: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67a0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
67b0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
67c0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
67d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
67e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
67f0: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6800: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6810: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6820: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6830: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6840: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
6850: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
6860: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
6870: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
6880: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
6890: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68a0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
68b0: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
68c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
68d0: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
68e0: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
68f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6900: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6910: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6930: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6940: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
6950: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
6960: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
6970: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
6980: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
6990: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69a0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
69b0: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
69c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
69d0: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
69e0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
69f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a00: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a10: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a20: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a30: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a40: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6a50: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6a60: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 73 74   mode */.  u8 st
6a70: 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20  atsOn;          
6a80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73    /* True to dis
6a90: 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
6aa0: 73 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69  s before each fi
6ab0: 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73  nalize */.  u8 s
6ac0: 63 61 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20  canstatsOn;     
6ad0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69     /* True to di
6ae0: 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
6af0: 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e   before each fin
6b00: 61 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70  alize */.  u8 op
6b10: 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
6b20: 20 20 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f    /* SHELL_OPEN_
6b30: 4e 4f 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56  NORMAL, _APPENDV
6b40: 46 53 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20  FS, or _ZIPFILE 
6b50: 2a 2f 0a 20 20 75 38 20 64 6f 58 64 67 4f 70 65  */.  u8 doXdgOpe
6b60: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  n;          /* I
6b70: 6e 76 6f 6b 65 20 73 74 61 72 74 2f 6f 70 65 6e  nvoke start/open
6b80: 2f 78 64 67 2d 6f 70 65 6e 20 69 6e 20 6f 75 74  /xdg-open in out
6b90: 70 75 74 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20  put_reset() */. 
6ba0: 20 75 38 20 6e 45 71 70 4c 65 76 65 6c 3b 20 20   u8 nEqpLevel;  
6bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68          /* Depth
6bc0: 20 6f 66 20 74 68 65 20 45 51 50 20 6f 75 74 70   of the EQP outp
6bd0: 75 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 75 6e  ut graph */.  un
6be0: 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73  signed mEqpLines
6bf0: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6c00: 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20  veritical lines 
6c10: 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75  in the EQP outpu
6c20: 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74  t graph */.  int
6c30: 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20   outCount;      
6c40: 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f      /* Revert to
6c50: 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61   stdout when rea
6c60: 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ching zero */.  
6c70: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6c80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6c90: 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70   of records disp
6ca0: 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  layed so far */.
6cb0: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6cd0: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6ce0: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6cf0: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6d00: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6d10: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6d20: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d40: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6d50: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6d70: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6d80: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6d90: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6da0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6db0: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6dd0: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6de0: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6df0: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6e00: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6e10: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6e20: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6e30: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6e40: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6e50: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6e60: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6e70: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6e80: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6e90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ea0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
6eb0: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
6ec0: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
6ed0: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
6ee0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6ef0: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
6f00: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
6f10: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
6f20: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
6f30: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 68 61 72 20  flags */.  char 
6f40: 2a 7a 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20  *zDestTable;    
6f50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73    /* Name of des
6f60: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77  tination table w
6f70: 68 65 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  hen MODE_Insert 
6f80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6f90: 46 69 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  File;       /* T
6fa0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68  emporary file th
6fb0: 61 74 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65  at might need de
6fc0: 6c 65 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  leting */.  char
6fd0: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6fe0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6ff0: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
7000: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
7010: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
7020: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
7030: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
7040: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
7050: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
7060: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
7070: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
7080: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
7090: 69 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53  i */.  char colS
70a0: 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a  epPrior[20];  /*
70b0: 20 53 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65   Saved column se
70c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61  parator */.  cha
70d0: 72 20 72 6f 77 53 65 70 50 72 69 6f 72 5b 32 30  r rowSepPrior[20
70e0: 5d 3b 20 20 2f 2a 20 53 61 76 65 64 20 72 6f 77  ];  /* Saved row
70f0: 20 73 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20   separator */.  
7100: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
7110: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73  ];     /* Reques
7120: 74 65 64 20 77 69 64 74 68 20 6f 66 20 65 61 63  ted width of eac
7130: 68 20 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e  h column when in
7140: 20 63 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20   column mode*/. 
7150: 20 69 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68   int actualWidth
7160: 5b 31 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61  [100];  /* Actua
7170: 6c 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20  l width of each 
7180: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
7190: 20 6e 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20   nullValue[20]; 
71a0: 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74     /* The text t
71b0: 6f 20 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e  o print when a N
71c0: 55 4c 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66  ULL comes back f
71d0: 72 6f 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rom.            
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
71f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
7200: 20 20 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46    char outfile[F
7210: 49 4c 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a  ILENAME_MAX]; /*
7220: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f   Filename for *o
7230: 75 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ut */.  const ch
7240: 61 72 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b  ar *zDbFilename;
7250: 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74      /* name of t
7260: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7270: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65   */.  char *zFre
7280: 65 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20  eOnClose;       
7290: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f    /* Filename to
72a0: 20 66 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69   free when closi
72b0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
72c0: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20  ar *zVfs;       
72d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
72e0: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73  FS to use */.  s
72f0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
7300: 6d 74 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  mt;   /* Current
7310: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e   statement if an
7320: 79 2e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c  y. */.  FILE *pL
7330: 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  og;            /
7340: 2a 20 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70  * Write log outp
7350: 75 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ut here */.  int
7360: 20 2a 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20   *aiIndent;     
7370: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
7380: 69 6e 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20  indents used in 
7390: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a  MODE_Explain */.
73a0: 20 20 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20    int nIndent;  
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
73c0: 20 6f 66 20 61 72 72 61 79 20 61 69 49 6e 64 65   of array aiInde
73d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nt[] */.  int iI
73e0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  ndent;          
73f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
7400: 72 65 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64  rent op in aiInd
7410: 65 6e 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72  ent[] */.  EQPGr
7420: 61 70 68 20 73 47 72 61 70 68 3b 20 20 20 20 20  aph sGraph;     
7430: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
7440: 20 66 6f 72 20 74 68 65 20 67 72 61 70 68 69 63   for the graphic
7450: 61 6c 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  al EXPLAIN QUERY
7460: 20 50 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66   PLAN */.#if def
7470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7480: 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e  LE_SESSION).  in
7490: 74 20 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20  t nSession;     
74a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
74b0: 72 20 6f 66 20 61 63 74 69 76 65 20 73 65 73 73  r of active sess
74c0: 69 6f 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65  ions */.  OpenSe
74d0: 73 73 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34  ssion aSession[4
74e0: 5d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ];  /* Array of 
74f0: 73 65 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69  sessions.  [0] i
7500: 73 20 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23  s in focus. */.#
7510: 65 6e 64 69 66 0a 20 20 45 78 70 65 72 74 49 6e  endif.  ExpertIn
7520: 66 6f 20 65 78 70 65 72 74 3b 20 20 20 20 20 20  fo expert;      
7530: 20 20 2f 2a 20 56 61 6c 69 64 20 69 66 20 70 72    /* Valid if pr
7540: 65 76 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77  evious command w
7550: 61 73 20 22 2e 65 78 70 65 72 74 20 4f 50 54 2e  as ".expert OPT.
7560: 2e 2e 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41  .." */.};.../* A
7570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
7580: 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 75 74  r ShellState.aut
7590: 6f 45 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  oEQP.*/.#define 
75a0: 41 55 54 4f 45 51 50 5f 6f 66 66 20 20 20 20 20  AUTOEQP_off     
75b0: 20 30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0           /* 
75c0: 41 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49  Automatic EXPLAI
75d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 73 20  N QUERY PLAN is 
75e0: 6f 66 66 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41  off */.#define A
75f0: 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20  UTOEQP_on       
7600: 31 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1           /* A
7610: 75 74 6f 6d 61 74 69 63 20 45 51 50 20 69 73 20  utomatic EQP is 
7620: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55  on */.#define AU
7630: 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 20 32  TOEQP_trigger  2
7640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
7650: 20 61 6e 64 20 61 6c 73 6f 20 73 68 6f 77 20 70   and also show p
7660: 6c 61 6e 73 20 66 6f 72 20 74 72 69 67 67 65 72  lans for trigger
7670: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  s */.#define AUT
7680: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 20  OEQP_full     3 
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f            /* Sho
76a0: 77 20 66 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a  w full EXPLAIN *
76b0: 2f 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /../* Allowed va
76c0: 6c 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74  lues for ShellSt
76d0: 61 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a  ate.openMode.*/.
76e0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
76f0: 45 4e 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20  EN_UNSPEC     0 
7700: 20 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d       /* No open-
7710: 6d 6f 64 65 20 73 70 65 63 69 66 69 65 64 20 2a  mode specified *
7720: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7730: 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20  OPEN_NORMAL     
7740: 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c  1      /* Normal
7750: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7760: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7770: 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20  OPEN_APPENDVFS  
7780: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7790: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
77a0: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
77b0: 50 46 49 4c 45 20 20 20 20 33 20 20 20 20 20 20  PFILE    3      
77c0: 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69  /* Use the zipfi
77d0: 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  le virtual table
77e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
77f0: 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  L_OPEN_READONLY 
7800: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7810: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7820: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7830: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
7840: 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65   the allowed she
7850: 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f  llFlgs values.*/
7860: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7870: 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78  agecache      0x
7880: 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20  00000001 /* The 
7890: 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69  --pagecache opti
78a0: 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64  on is used */.#d
78b0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b  efine SHFLG_Look
78c0: 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30  aside      0x000
78d0: 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69  00002 /* Lookasi
78e0: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  de memory is use
78f0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7900: 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20  LG_Backslash    
7910: 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20    0x00000004 /* 
7920: 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20  The --backslash 
7930: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a  option is used *
7940: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7950: 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30  PreserveRowid  0
7960: 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75  x00000008 /* .du
7970: 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77  mp preserves row
7980: 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  id values */.#de
7990: 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69  fine SHFLG_Newli
79a0: 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30  nes       0x0000
79b0: 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d  0010 /* .dump --
79c0: 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a  newline flag */.
79d0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f  #define SHFLG_Co
79e0: 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30  untChanges   0x0
79f0: 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e  0000020 /* .chan
7a00: 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23  ges setting */.#
7a10: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68  define SHFLG_Ech
7a20: 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  o           0x00
7a30: 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20  000040 /* .echo 
7a40: 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e  or --echo settin
7a50: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g */../*.** Macr
7a60: 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  os for testing a
7a70: 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c  nd setting shell
7a80: 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  Flgs.*/.#define 
7a90: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58  ShellHasFlag(P,X
7aa0: 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c  )    (((P)->shel
7ab0: 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29  lFlgs & (X))!=0)
7ac0: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65  .#define ShellSe
7ad0: 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28  tFlag(P,X)    ((
7ae0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28  P)->shellFlgs|=(
7af0: 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  X)).#define Shel
7b00: 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20  lClearFlag(P,X) 
7b10: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
7b20: 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a  &=(~(X)))../*.**
7b30: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
7b40: 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f  llowed modes..*/
7b50: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
7b60: 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65  ne     0  /* One
7b70: 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65   column per line
7b80: 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65  .  Blank line be
7b90: 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f  tween records */
7ba0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f  .#define MODE_Co
7bb0: 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65  lumn   1  /* One
7bc0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
7bd0: 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73   in neat columns
7be0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7bf0: 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20  _List     2  /* 
7c00: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
7c10: 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72  ine with a separ
7c20: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
7c30: 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20  MODE_Semi     3 
7c40: 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45   /* Same as MODE
7c50: 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64  _List but append
7c60: 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e   ";" to each lin
7c70: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  e */.#define MOD
7c80: 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a  E_Html     4  /*
7c90: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54   Generate an XHT
7ca0: 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  ML table */.#def
7cb0: 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  ine MODE_Insert 
7cc0: 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    5  /* Generate
7cd0: 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74   SQL "insert" st
7ce0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  atements */.#def
7cf0: 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20  ine MODE_Quote  
7d00: 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61    6  /* Quote va
7d10: 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20  lues as for SQL 
7d20: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7d30: 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47  Tcl      7  /* G
7d40: 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f  enerate ANSI-C o
7d50: 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65  r TCL quoted ele
7d60: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
7d70: 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38   MODE_Csv      8
7d80: 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e    /* Quote strin
7d90: 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  gs, numbers are 
7da0: 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  plain */.#define
7db0: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39   MODE_Explain  9
7dc0: 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43    /* Like MODE_C
7dd0: 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f  olumn, but do no
7de0: 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20  t truncate data 
7df0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7e00: 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55  Ascii   10  /* U
7e10: 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e  se ASCII unit an
7e20: 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74  d record separat
7e30: 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20  ors (0x1F/0x1E) 
7e40: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7e50: 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50  Pretty  11  /* P
7e60: 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65  retty-print sche
7e70: 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mas */.#define M
7e80: 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20  ODE_EQP     12  
7e90: 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c  /* Converts EXPL
7ea0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f  AIN QUERY PLAN o
7eb0: 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61  utput into a gra
7ec0: 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f  ph */..static co
7ed0: 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65  nst char *modeDe
7ee0: 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e  scr[] = {.  "lin
7ef0: 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a  e",.  "column",.
7f00: 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d    "list",.  "sem
7f10: 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20  i",.  "html",.  
7f20: 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f  "insert",.  "quo
7f30: 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  te",.  "tcl",.  
7f40: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
7f50: 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20  n",.  "ascii",. 
7f60: 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a   "prettyprint",.
7f70: 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a    "eqp".};../*.*
7f80: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7f90: 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20  column/row/line 
7fa0: 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20  separators used 
7fb0: 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  by the various.*
7fc0: 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20  * import/export 
7fd0: 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  modes..*/.#defin
7fe0: 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20  e SEP_Column    
7ff0: 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  "|".#define SEP_
8000: 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23  Row       "\n".#
8010: 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20  define SEP_Tab  
8020: 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e       "\t".#defin
8030: 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20  e SEP_Space     
8040: 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  " ".#define SEP_
8050: 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64  Comma     ",".#d
8060: 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20  efine SEP_CrLf  
8070: 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69      "\r\n".#defi
8080: 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20  ne SEP_Unit     
8090: 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20   "\x1F".#define 
80a0: 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c  SEP_Record    "\
80b0: 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  x1E"../*.** A ca
80c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
80d0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
80e0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
80f0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
8100: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
8110: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
8120: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
8130: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
8140: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
8150: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
8160: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
8170: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
8180: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
8190: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
81a0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
81b0: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  og);.}../*.** SQ
81c0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
81d0: 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a  ll_putsnl(X).**.
81e0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78  ** Write the tex
81f0: 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65  t X to the scree
8200: 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f  n (or whatever o
8210: 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64  utput is being d
8220: 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69  irected).** addi
8230: 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20  ng a newline at 
8240: 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65  the end, and the
8250: 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73  n return X..*/.s
8260: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
8270: 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69  PutsFunc(.  sqli
8280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
8290: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
82a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
82b0: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c  *apVal.){.  Shel
82c0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
82d0: 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33  llState*)sqlite3
82e0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
82f0: 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a  ;.  (void)nVal;.
8300: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
8310: 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
8320: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8330: 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73  (apVal[0]));.  s
8340: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
8350: 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b  lue(pCtx, apVal[
8360: 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  0]);.}../*.** SQ
8370: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64  L function:   ed
8380: 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20  it(VALUE).**    
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
83a0: 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a  t(VALUE,EDITOR).
83b0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70  **.** These step
83c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  s:.**.**     (1)
83d0: 20 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74   Write VALUE int
83e0: 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
83f0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  le..**     (2) R
8400: 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f  un program EDITO
8410: 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  R on that tempor
8420: 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ary file..**    
8430: 20 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65   (3) Read the te
8440: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63  mporary file bac
8450: 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  k and return its
8460: 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20   content as the 
8470: 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28  result..**     (
8480: 34 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65  4) Delete the te
8490: 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a  mporary file.**.
84a0: 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52  ** If the EDITOR
84b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69   argument is omi
84c0: 74 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61  tted, use the va
84d0: 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41  lue in the VISUA
84e0: 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  L.** environment
84f0: 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73   variable.  If s
8500: 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f  till there is no
8510: 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68   EDITOR, through
8520: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
8530: 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65   Also throw an e
8540: 72 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54  rror if the EDIT
8550: 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72  OR program retur
8560: 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78  ns a non-zero ex
8570: 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e  it code..*/.#ifn
8580: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
8590: 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20  E_SYSTEM.static 
85a0: 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20  void editFunc(. 
85b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
85c0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
85d0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
85e0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
85f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8600: 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a  Editor;.  char *
8610: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
8620: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8630: 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a  char *zCmd = 0;.
8640: 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e    int bBin;.  in
8650: 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43  t rc;.  int hasC
8660: 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  RNL = 0;.  FILE 
8670: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8680: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8690: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
86a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
86b0: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
86c0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
86d0: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
86e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
86f0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
8700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
8710: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8720: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8730: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8750: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8760: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8770: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8780: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8790: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
87a0: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
87b0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
87c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
87d0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
87e0: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
87f0: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
8800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8810: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8820: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8830: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8840: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8850: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8860: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8870: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8880: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8890: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
88a0: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
88b0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
88c0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
88d0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
88e0: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
88f0: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
8900: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
8910: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8920: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8940: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8950: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8960: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8970: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8980: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8990: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
89a0: 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68  TE_BLOB;.  /* Wh
89b0: 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  en writing the f
89c0: 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64  ile to be edited
89d0: 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20  , do \n to \r\n 
89e0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73  conversions on s
89f0: 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74  ystems.  ** that
8a00: 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20   want \r\n line 
8a10: 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d  endings */.  f =
8a20: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
8a30: 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20  , bBin ? "wb" : 
8a40: 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "w");.  if( f==0
8a50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8a60: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8a70: 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61  text, "edit() ca
8a80: 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66  nnot open temp f
8a90: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
8aa0: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
8ab0: 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71  d;.  }.  sz = sq
8ac0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
8ad0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  s(argv[0]);.  if
8ae0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
8af0: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
8b00: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
8b10: 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b  [0]), 1, sz, f);
8b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
8b30: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
8b40: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8b50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8b60: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52  gv[0]);.    /* R
8b70: 65 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20  emember whether 
8b80: 6f 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65  or not the value
8b90: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74   originally cont
8ba0: 61 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20  ained \r\n */.  
8bb0: 20 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74    if( z && strst
8bc0: 72 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29  r(z,"\r\n")!=0 )
8bd0: 20 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20   hasCRNL = 1;.  
8be0: 20 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c    x = fwrite(sql
8bf0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8c00: 61 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c  argv[0]), 1, sz,
8c10: 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73   f);.  }.  fclos
8c20: 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20  e(f);.  f = 0;. 
8c30: 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20   if( x!=sz ){.  
8c40: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8c50: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
8c60: 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f  "edit() could no
8c70: 74 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c  t write the whol
8c80: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
8c90: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8ca0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  _end;.  }.  zCmd
8cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8cc0: 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20  tf("%s \"%s\"", 
8cd0: 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69  zEditor, zTempFi
8ce0: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  le);.  if( zCmd=
8cf0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8d00: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
8d10: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
8d20: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
8d30: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20  c_end;.  }.  rc 
8d40: 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a  = system(zCmd);.
8d50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8d60: 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cmd);.  if( rc )
8d70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8d80: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8d90: 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75  xt, "EDITOR retu
8da0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20  rned non-zero", 
8db0: 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  -1);.    goto ed
8dc0: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
8dd0: 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65  .  f = fopen(zTe
8de0: 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  mpFile, "rb");. 
8df0: 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
8e00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8e10: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20  error(context,. 
8e20: 20 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e       "edit() can
8e30: 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20  not reopen temp 
8e40: 66 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22  file after edit"
8e50: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
8e60: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
8e70: 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c   }.  fseek(f, 0,
8e80: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a   SEEK_END);.  sz
8e90: 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72   = ftell(f);.  r
8ea0: 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20  ewind(f);.  p = 
8eb0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8ec0: 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29  ( sz+(bBin==0) )
8ed0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
8ee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ef0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8f00: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
8f10: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
8f20: 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64  .  }.  x = fread
8f30: 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  (p, 1, sz, f);. 
8f40: 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20   fclose(f);.  f 
8f50: 3d 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a  = 0;.  if( x!=sz
8f60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8f70: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8f80: 74 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  text, "could not
8f90: 20 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77   read back the w
8fa0: 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b  hole file", -1);
8fb0: 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66  .    goto edit_f
8fc0: 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  unc_end;.  }.  i
8fd0: 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73  f( bBin ){.    s
8fe0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
8ff0: 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c  ob64(context, p,
9000: 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   sz, sqlite3_fre
9010: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
9020: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
9030: 2c 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73  , j;.    if( has
9040: 43 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CRNL ){.      /*
9050: 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
9060: 20 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74   contains \r\n t
9070: 68 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72  hen do no conver
9080: 73 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e  sions back to \n
9090: 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a   */.      j = sz
90a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
90b0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
90c0: 65 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  e did not origin
90d0: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c  ally contain \r\
90e0: 6e 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61  n then convert a
90f0: 6e 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20  ny new.      ** 
9100: 5c 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c  \r\n back into \
9110: 6e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  n */.      for(i
9120: 3d 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29  =j=0; i<sz; i++)
9130: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b  {.        if( p[
9140: 69 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b  i]=='\r' && p[i+
9150: 31 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a  1]=='\n' ) i++;.
9160: 20 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d          p[j++] =
9170: 20 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   p[i];.      }. 
9180: 20 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20       sz = j;.   
9190: 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20     p[sz] = 0;.  
91a0: 20 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33    } .    sqlite3
91b0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63  _result_text64(c
91c0: 6f 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63  ontext, (const c
91d0: 68 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20  har*)p, sz,.    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9200: 65 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ee, SQLITE_UTF8)
9210: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a  ;.  }.  p = 0;..
9220: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20  edit_func_end:. 
9230: 20 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28   if( f ) fclose(
9240: 66 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65  f);.  unlink(zTe
9250: 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74  mpFile);.  sqlit
9260: 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c  e3_free(zTempFil
9270: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
9280: 65 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ee(p);.}.#endif 
9290: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  /* SQLITE_NOHAVE
92a0: 5f 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _SYSTEM */../*.*
92b0: 2a 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72  * Save or restor
92c0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  e the current ou
92d0: 74 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61  tput mode.*/.sta
92e0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d  tic void outputM
92f0: 6f 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61  odePush(ShellSta
9300: 74 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64  te *p){.  p->mod
9310: 65 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65  ePrior = p->mode
9320: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f  ;.  memcpy(p->co
9330: 6c 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f  lSepPrior, p->co
9340: 6c 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  lSeparator, size
9350: 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
9360: 6f 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  or));.  memcpy(p
9370: 2d 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70  ->rowSepPrior, p
9380: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
9390: 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
93a0: 61 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74  arator));.}.stat
93b0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
93c0: 64 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65  dePop(ShellState
93d0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20   *p){.  p->mode 
93e0: 3d 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a  = p->modePrior;.
93f0: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53    memcpy(p->colS
9400: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c  eparator, p->col
9410: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9420: 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
9430: 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ));.  memcpy(p->
9440: 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d  rowSeparator, p-
9450: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69  >rowSepPrior, si
9460: 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
9470: 61 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ator));.}../*.**
9480: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
9490: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65  n string as a he
94a0: 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28  x-encoded blob (
94b0: 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f  eg. X'1234' ).*/
94c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
94d0: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c  put_hex_blob(FIL
94e0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f  E *out, const vo
94f0: 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  id *pBlob, int n
9500: 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Blob){.  int i;.
9510: 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20    char *zBlob = 
9520: 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20  (char *)pBlob;. 
9530: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9540: 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  "X'");.  for(i=0
9550: 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b  ; i<nBlob; i++){
9560: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9570: 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26  "%02x",zBlob[i]&
9580: 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70  0xff); }.  raw_p
9590: 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a  rintf(out,"'");.
95a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
95b0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e  string that is n
95c0: 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72  ot found anywher
95d0: 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72  e in z[].  Retur
95e0: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
95f0: 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a  o that string..*
9600: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20  *.** Try to use 
9610: 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e  zA and zB first.
9620: 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f    If both of tho
9630: 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66  se are already f
9640: 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74  ound in z[].** t
9650: 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65  hen make up some
9660: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72   string and stor
9670: 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66  e it in the buff
9680: 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
9690: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
96a0: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20  nused_string(.  
96b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20  const char *z,  
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74    /* Result must
96e0: 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77   not appear anyw
96f0: 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63  here in z */.  c
9700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
9710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20  onst char *zB,  
9720: 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69   /* Try these fi
9730: 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  rst */.  char *z
9740: 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Buf             
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
9760: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67  ace to store a g
9770: 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20  enerated string 
9780: 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
9790: 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74   i = 0;.  if( st
97a0: 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29  rstr(z, zA)==0 )
97b0: 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66   return zA;.  if
97c0: 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d  ( strstr(z, zB)=
97d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a  =0 ) return zB;.
97e0: 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65    do{.    sqlite
97f0: 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42  3_snprintf(20,zB
9800: 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c  uf,"(%s%u)", zA,
9810: 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28   i++);.  }while(
9820: 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21   strstr(z,zBuf)!
9830: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
9840: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  Buf;.}../*.** Ou
9850: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9860: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
9870: 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53  d string using S
9880: 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65  QL quoting conve
9890: 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65  ntions..**.** Se
98a0: 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71  e also: output_q
98b0: 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74  uoted_escaped_st
98c0: 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63  ring().*/.static
98d0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
98e0: 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  ted_string(FILE 
98f0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
9900: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
9910: 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69   char c;.  setBi
9920: 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29  naryMode(out, 1)
9930: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
9940: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9950: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9960: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
9970: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9980: 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c  "'%s'",z);.  }el
9990: 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
99a0: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
99b0: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
99c0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
99d0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
99e0: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
99f0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
9a00: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) i++;.      if
9a10: 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ( i ){.        u
9a20: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
9a30: 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20  "%.*s", i, z);. 
9a40: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20         z += i;. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9a60: 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
9a70: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9a80: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20  ut, "'");.      
9a90: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9aa0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
9ab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
9ac0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9ad0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     z++;.    }.  
9ae0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9af0: 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65  , "'");.  }.  se
9b00: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
9b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9b20: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9b30: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
9b40: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c  string using SQL
9b50: 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74   quoting convent
9b60: 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f  ions..** Additio
9b70: 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20  nallly , escape 
9b80: 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72  the "\n" and "\r
9b90: 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20  " characters so 
9ba0: 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74  that they do not
9bb0: 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65  .** get corrupte
9bc0: 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  d by end-of-line
9bd0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63   translation fac
9be0: 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20  ilities in some 
9bf0: 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73  operating.** sys
9c00: 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tems..**.** This
9c10: 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f   is like output_
9c20: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20  quoted_string() 
9c30: 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64  but with the add
9c40: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c  ition of the \r\
9c50: 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68  n.** escape mech
9c60: 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  anism..*/.static
9c70: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f   void output_quo
9c80: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
9c90: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
9ca0: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9cb0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b  int i;.  char c;
9cc0: 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  .  setBinaryMode
9cd0: 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28  (out, 1);.  for(
9ce0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9cf0: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26  =0 && c!='\'' &&
9d00: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
9d10: 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  \r'; i++){}.  if
9d20: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( c==0 ){.    ut
9d30: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27  f8_printf(out,"'
9d40: 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65  %s'",z);.  }else
9d50: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9d60: 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63   *zNL = 0;.    c
9d70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d  onst char *zCR =
9d80: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20   0;.    int nNL 
9d90: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52  = 0;.    int nCR
9da0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a   = 0;.    char z
9db0: 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b  Buf1[20], zBuf2[
9dc0: 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  20];.    for(i=0
9dd0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
9de0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
9df0: 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20  n' ) nNL++;.    
9e00: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27    if( z[i]=='\r'
9e10: 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a   ) nCR++;.    }.
9e20: 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20      if( nNL ){. 
9e30: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
9e40: 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29  out, "replace(")
9e50: 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e  ;.      zNL = un
9e60: 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22  used_string(z, "
9e70: 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a  \\n", "\\012", z
9e80: 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Buf1);.    }.   
9e90: 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20   if( nCR ){.    
9ea0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9eb0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
9ec0: 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65       zCR = unuse
9ed0: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72  d_string(z, "\\r
9ee0: 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66  ", "\\015", zBuf
9ef0: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  2);.    }.    ra
9f00: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
9f10: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ");.    while( *
9f20: 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  z ){.      for(i
9f30: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9f40: 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20  0 && c!='\n' && 
9f50: 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c  c!='\r' && c!='\
9f60: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
9f70: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
9f80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
9f90: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
9fa0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
9fb0: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
9fc0: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
9fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9fe0: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
9ff0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a000: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
a010: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a020: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
a030: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
a040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
a050: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
a060: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
a070: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a080: 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20   "%s", zNL);.   
a090: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
a0b0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
a0c0: 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20  ", zCR);.    }. 
a0d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a0e0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28  t, "'");.    if(
a0f0: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
a100: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a110: 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c  '%s',char(13))",
a120: 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20   zCR);.    }.   
a130: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
a140: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a150: 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30  , ",'%s',char(10
a160: 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d  ))", zNL);.    }
a170: 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f  .  }.  setTextMo
a180: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f  de(out, 1);.}../
a190: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a1a0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
a1b0: 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69  a quoted accordi
a1c0: 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71  ng to C or TCL q
a1d0: 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f  uoting rules..*/
a1e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a1f0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c  put_c_string(FIL
a200: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
a210: 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar *z){.  unsign
a220: 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74  ed int c;.  fput
a230: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77  c('"', out);.  w
a240: 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b  hile( (c = *(z++
a250: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
a260: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
a270: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a280: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
a290: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a2a0: 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
a2b0: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a2c0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a2d0: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('"', out);.   
a2e0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
a2f0: 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  t' ){.      fput
a300: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a310: 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f      fputc('t', o
a320: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a330: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  f( c=='\n' ){.  
a340: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a350: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a360: 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('n', out);.   
a370: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
a380: 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  r' ){.      fput
a390: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a3a0: 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f      fputc('r', o
a3b0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a3c0: 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78  f( !isprint(c&0x
a3d0: 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ff) ){.      raw
a3e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c  _printf(out, "\\
a3f0: 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a  %03o", c&0xff);.
a400: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a410: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a420: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74      }.  }.  fput
a430: 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a  c('"', out);.}..
a440: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
a450: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69   given string wi
a460: 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68  th characters th
a470: 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74  at are special t
a480: 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65  o.** HTML escape
a490: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a4a0: 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74  d output_html_st
a4b0: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
a4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a4d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a    int i;.  if( z
a4e0: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
a4f0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
a500: 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d   for(i=0;   z[i]
a510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a520: 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20  z[i]!='<'.      
a530: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
a540: 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  &'.            &
a550: 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20  & z[i]!='>'.    
a560: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a570: 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20  ='\"'.          
a580: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b    && z[i]!='\'';
a590: 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a  .        i++){}.
a5a0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
a5b0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
a5c0: 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29  (out,"%.*s",i,z)
a5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a5e0: 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20  z[i]=='<' ){.   
a5f0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a600: 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&lt;");.    }
a610: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
a620: 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  &' ){.      raw_
a630: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70  printf(out,"&amp
a640: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a650: 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a  f( z[i]=='>' ){.
a660: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a670: 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20  (out,"&gt;");.  
a680: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
a690: 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  =='\"' ){.      
a6a0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
a6b0: 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65  &quot;");.    }e
a6c0: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
a6d0: 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  '' ){.      raw_
a6e0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39  printf(out,"&#39
a6f0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ;");.    }else{.
a700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a710: 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20   }.    z += i + 
a720: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
a730: 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61  If a field conta
a740: 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65  ins any characte
a750: 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  r identified by 
a760: 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  a 1 in the follo
a770: 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74  wing.** array, t
a780: 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d  hen the string m
a790: 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f  ust be quoted fo
a7a0: 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63  r CSV..*/.static
a7b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64   const char need
a7c0: 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20  CsvQuote[] = {. 
a7d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a7e0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
a7f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a800: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
a810: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
a820: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a830: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31   1, 1,.  1, 0, 1
a840: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c  , 0, 0, 0, 0, 1,
a850: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a860: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
a870: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a880: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
a890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
a8a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8b0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
a8c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a8d0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
a8e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
a8f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a900: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
a910: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a920: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a930: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
a940: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a950: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
a960: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20  0, 0, 0, 0, 1,. 
a970: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a980: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
a990: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a9a0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
a9b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
a9c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9d0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
a9e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9f0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
aa00: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
aa10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aa20: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
aa30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
aa40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa50: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
aa60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aa70: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
aa80: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
aa90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aaa0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
aab0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
aac0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
aad0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
aae0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aaf0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
ab00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d  1, 1, 1, 1, 1,.}
ab10: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  ;../*.** Output 
ab20: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  a single term of
ab30: 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c   CSV.  Actually,
ab40: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
ab50: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
ab60: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77  the separator, w
ab70: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
ab80: 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20  not be a comma. 
ab90: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73   p->nullValue is
aba0: 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c  .** the null val
abb0: 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65  ue.  Strings are
abc0: 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73   quoted if neces
abd0: 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72  sary.  The separ
abe0: 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  ator.** is only 
abf0: 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69  issued if bSep i
ac00: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
ac10: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73  c void output_cs
ac20: 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  v(ShellState *p,
ac30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
ac40: 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c  int bSep){.  FIL
ac50: 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b  E *out = p->out;
ac60: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20  .  if( z==0 ){. 
ac70: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
ac80: 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56  ut,"%s",p->nullV
ac90: 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  alue);.  }else{.
aca0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
acb0: 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e  nt nSep = strlen
acc0: 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  30(p->colSeparat
acd0: 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  or);.    for(i=0
ace0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
acf0: 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51      if( needCsvQ
ad00: 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20  uote[((unsigned 
ad10: 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20  char*)z)[i]].   
ad20: 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d        || (z[i]==
ad30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b  p->colSeparator[
ad40: 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  0] &&.          
ad50: 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d     (nSep==1 || m
ad60: 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53  emcmp(z, p->colS
ad70: 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d  eparator, nSep)=
ad80: 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  =0)) ){.        
ad90: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  i = 0;.        b
ada0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
adb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30    }.    if( i==0
adc0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
add0: 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65  zQuoted = sqlite
ade0: 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c  3_mprintf("\"%w\
adf0: 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74  "", z);.      ut
ae00: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
ae10: 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20  %s", zQuoted);. 
ae20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ae30: 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  e(zQuoted);.    
ae40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
ae50: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
ae60: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  s", z);.    }.  
ae70: 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a  }.  if( bSep ){.
ae80: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
ae90: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
aea0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
aeb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
aec0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77  s routine runs w
aed0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65  hen the user pre
aee0: 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73  sses Ctrl-C.*/.s
aef0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72  tatic void inter
af00: 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74  rupt_handler(int
af10: 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55   NotUsed){.  UNU
af20: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
af30: 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e  tUsed);.  seenIn
af40: 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28  terrupt++;.  if(
af50: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32   seenInterrupt>2
af60: 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66   ) exit(1);.  if
af70: 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c  ( globalDb ) sql
af80: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67  ite3_interrupt(g
af90: 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66  lobalDb);.}..#if
afa0: 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
afb0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
afc0: 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64  32)) && !defined
afd0: 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a  (_WIN32_WCE)./*.
afe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aff0: 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65  runs for console
b000: 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74   events (e.g. Ct
b010: 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a  rl-C) on Win32.*
b020: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49  /.static BOOL WI
b030: 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c  NAPI ConsoleCtrl
b040: 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44  Handler(.  DWORD
b050: 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f   dwCtrlType /* O
b060: 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a  ne of the CTRL_*
b070: 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73  _EVENT constants
b080: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43   */.){.  if( dwC
b090: 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f  trlType==CTRL_C_
b0a0: 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74  EVENT ){.    int
b0b0: 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30  errupt_handler(0
b0c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  );.    return TR
b0d0: 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  UE;.  }.  return
b0e0: 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66   FALSE;.}.#endif
b0f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b100: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
b110: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  ION./*.** When t
b120: 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73  he ".auth ON" is
b130: 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   set, the follow
b140: 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63  ing authorizer c
b150: 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e  allback is.** in
b160: 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79  voked.  It alway
b170: 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
b180: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
b190: 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20  nt shellAuth(.  
b1a0: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
b1b0: 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63  a,.  int op,.  c
b1c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a  onst char *zA1,.
b1d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
b1e0: 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2,.  const char 
b1f0: 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *zA3,.  const ch
b200: 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65  ar *zA4.){.  She
b210: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
b220: 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e  ellState*)pClien
b230: 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20  tData;.  static 
b240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63  const char *azAc
b250: 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20  tion[] = { 0,.  
b260: 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58     "CREATE_INDEX
b270: 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41  ",         "CREA
b280: 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  TE_TABLE",      
b290: 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f     "CREATE_TEMP_
b2a0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52  INDEX",.     "CR
b2b0: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22  EATE_TEMP_TABLE"
b2c0: 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d  ,    "CREATE_TEM
b2d0: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52  P_TRIGGER",  "CR
b2e0: 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c  EATE_TEMP_VIEW",
b2f0: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52  .     "CREATE_TR
b300: 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43  IGGER",       "C
b310: 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20  REATE_VIEW",    
b320: 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a        "DELETE",.
b330: 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58       "DROP_INDEX
b340: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52  ",           "DR
b350: 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  OP_TABLE",      
b360: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
b370: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52  INDEX",.     "DR
b380: 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20  OP_TEMP_TABLE", 
b390: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
b3a0: 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52  TRIGGER",    "DR
b3b0: 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20  OP_TEMP_VIEW",. 
b3c0: 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45      "DROP_TRIGGE
b3d0: 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f  R",         "DRO
b3e0: 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  P_VIEW",        
b3f0: 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20      "INSERT",.  
b400: 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20     "PRAGMA",    
b410: 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44             "READ
b420: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
b430: 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20     "SELECT",.   
b440: 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c    "TRANSACTION",
b450: 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54            "UPDAT
b460: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
b470: 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20    "ATTACH",.    
b480: 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20   "DETACH",      
b490: 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f           "ALTER_
b4a0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b4b0: 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20   "REINDEX",.    
b4c0: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20   "ANALYZE",     
b4d0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
b4e0: 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  _VTABLE",       
b4f0: 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a   "DROP_VTABLE",.
b500: 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c       "FUNCTION",
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41               "SA
b520: 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20  VEPOINT",       
b530: 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22       "RECURSIVE"
b540: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b   const char *az[
b560: 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41  4];.  az[0] = zA
b570: 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32  1;.  az[1] = zA2
b580: 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b  ;.  az[2] = zA3;
b590: 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a  .  az[3] = zA4;.
b5a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b5b0: 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65  >out, "authorize
b5c0: 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e  r: %s", azAction
b5d0: 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [op]);.  for(i=0
b5e0: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
b5f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b600: 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66  ut, " ");.    if
b610: 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20  ( az[i] ){.     
b620: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
b630: 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b  (p->out, az[i]);
b640: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b650: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b660: 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  out, "NULL");.  
b670: 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72    }.  }.  raw_pr
b680: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
b690: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
b6a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
b6b0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  ../*.** Print a 
b6c0: 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74  schema statement
b6d0: 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f  .  Part of MODE_
b6e0: 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72  Semi and MODE_Pr
b6f0: 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a  etty output..**.
b700: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b710: 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52  converts some CR
b720: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b730: 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77  ments for shadow
b740: 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54   tables.** in FT
b750: 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41  S3/4/5 into CREA
b760: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
b770: 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74  EXISTS statement
b780: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
b790: 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e  d printSchemaLin
b7a0: 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  e(FILE *out, con
b7b0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73  st char *z, cons
b7c0: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a  t char *zTail){.
b7d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
b7e0: 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41  rglob("CREATE TA
b7f0: 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d  BLE ['\"]*", z)=
b800: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
b810: 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41  rintf(out, "CREA
b820: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
b830: 45 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b  EXISTS %s%s", z+
b840: 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65  13, zTail);.  }e
b850: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
b860: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22  intf(out, "%s%s"
b870: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d  , z, zTail);.  }
b880: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
b890: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
b8a0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20  FILE *out, char 
b8b0: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74  *z, int n, const
b8c0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
b8d0: 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a   char c = z[n];.
b8e0: 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72    z[n] = 0;.  pr
b8f0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75  intSchemaLine(ou
b900: 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  t, z, zTail);.  
b910: 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a  z[n] = c;.}../*.
b920: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
b930: 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73  f string z[] has
b940: 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69   nothing but whi
b950: 74 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d  tespace and comm
b960: 65 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65  ents to the.** e
b970: 6e 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  nd of the first 
b980: 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  line..*/.static 
b990: 69 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73  int wsToEol(cons
b9a0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
b9b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b9c0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
b9d0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
b9e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
b9f0: 66 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  f( IsSpace(z[i])
ba00: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ba10: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26   if( z[i]=='-' &
ba20: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20  & z[i+1]=='-' ) 
ba30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
ba40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
ba50: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
ba60: 20 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79   Add a new entry
ba70: 20 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20   to the EXPLAIN 
ba80: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a  QUERY PLAN data.
ba90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
baa0: 71 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53  qp_append(ShellS
bab0: 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71  tate *p, int iEq
bac0: 70 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e  pId, int p2, con
bad0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
bae0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
baf0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78  pNew;.  int nTex
bb00: 74 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65  t = strlen30(zTe
bb10: 78 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75  xt);.  if( p->au
bb20: 74 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20  toEQPtest ){.   
bb30: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bb40: 6f 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e  out, "%d,%d,%s\n
bb50: 22 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a  ", iEqpId, p2, z
bb60: 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  Text);.  }.  pNe
bb70: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
bb80: 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e  oc64( sizeof(*pN
bb90: 65 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20  ew) + nText );. 
bba0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73   if( pNew==0 ) s
bbb0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
bbc0: 72 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45  ry();.  pNew->iE
bbd0: 71 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20  qpId = iEqpId;. 
bbe0: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64   pNew->iParentId
bbf0: 20 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28   = p2;.  memcpy(
bc00: 70 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65  pNew->zText, zTe
bc10: 78 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20  xt, nText+1);.  
bc20: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
bc30: 0a 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68  .  if( p->sGraph
bc40: 2e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  .pLast ){.    p-
bc50: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70  >sGraph.pLast->p
bc60: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Next = pNew;.  }
bc70: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72  else{.    p->sGr
bc80: 61 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b  aph.pRow = pNew;
bc90: 0a 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68  .  }.  p->sGraph
bca0: 2e 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d  .pLast = pNew;.}
bcb0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64  ../*.** Free and
bcc0: 20 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41   reset the EXPLA
bcd0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61  IN QUERY PLAN da
bce0: 74 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  ta that has been
bcf0: 20 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e   collected.** in
bd00: 20 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73   p->sGraph..*/.s
bd10: 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72  tatic void eqp_r
bd20: 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
bd30: 2a 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52  *p){.  EQPGraphR
bd40: 6f 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74  ow *pRow, *pNext
bd50: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70  ;.  for(pRow = p
bd60: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70  ->sGraph.pRow; p
bd70: 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78  Row; pRow = pNex
bd80: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
bd90: 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pRow->pNext;.   
bda0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
bdb0: 6f 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  ow);.  }.  memse
bdc0: 74 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c  t(&p->sGraph, 0,
bdd0: 20 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70   sizeof(p->sGrap
bde0: 68 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  h));.}../* Retur
bdf0: 6e 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41  n the next EXPLA
be00: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69  IN QUERY PLAN li
be10: 6e 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74  ne with iEqpId t
be20: 68 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72  hat occurs after
be30: 0a 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74  .** pOld, or ret
be40: 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75  urn the first su
be50: 63 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20  ch line if pOld 
be60: 69 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69  is NULL.*/.stati
be70: 63 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65  c EQPGraphRow *e
be80: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c  qp_next_row(Shel
be90: 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69  lState *p, int i
bea0: 45 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52  EqpId, EQPGraphR
beb0: 6f 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50  ow *pOld){.  EQP
bec0: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
bed0: 20 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e   pOld ? pOld->pN
bee0: 65 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e  ext : p->sGraph.
bef0: 70 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70  pRow;.  while( p
bf00: 52 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61  Row && pRow->iPa
bf10: 72 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29  rentId!=iEqpId )
bf20: 20 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e   pRow = pRow->pN
bf30: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ext;.  return pR
bf40: 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72  ow;.}../* Render
bf50: 20 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   a single level 
bf60: 6f 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61  of the graph tha
bf70: 74 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20  t has iEqpId as 
bf80: 69 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c  its parent.  Cal
bf90: 6c 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65  led.** recursive
bfa0: 6c 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62  ly to render sub
bfb0: 6c 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  levels..*/.stati
bfc0: 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65  c void eqp_rende
bfd0: 72 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61  r_level(ShellSta
bfe0: 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49  te *p, int iEqpI
bff0: 64 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  d){.  EQPGraphRo
c000: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
c010: 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65  .  int n = strle
c020: 6e 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n30(p->sGraph.zP
c030: 72 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a  refix);.  char *
c040: 7a 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20  z;.  for(pRow = 
c050: 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20  eqp_next_row(p, 
c060: 69 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77  iEqpId, 0); pRow
c070: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c080: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70  .    pNext = eqp
c090: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c0a0: 70 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20  pId, pRow);.    
c0b0: 7a 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b  z = pRow->zText;
c0c0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
c0d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73  (p->out, "%s%s%s
c0e0: 5c 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a  \n", p->sGraph.z
c0f0: 50 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20  Prefix, pNext ? 
c100: 22 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a  "|--" : "`--", z
c110: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e  );.    if( n<(in
c120: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61  t)sizeof(p->sGra
c130: 70 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b  ph.zPrefix)-7 ){
c140: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
c150: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c160: 5b 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20  [n], pNext ? "| 
c170: 20 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a   " : "   ", 4);.
c180: 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
c190: 5f 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e  _level(p, pRow->
c1a0: 69 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70  iEqpId);.      p
c1b0: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c1c0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [n] = 0;.    }. 
c1d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70   }.}../*.** Disp
c1e0: 6c 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68  lay and reset th
c1f0: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
c200: 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61  PLAN data.*/.sta
c210: 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e  tic void eqp_ren
c220: 64 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  der(ShellState *
c230: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
c240: 77 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72  w *pRow = p->sGr
c250: 61 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20  aph.pRow;.  if( 
c260: 70 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20  pRow ){.    if( 
c270: 70 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d  pRow->zText[0]==
c280: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '-' ){.      if(
c290: 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20   pRow->pNext==0 
c2a0: 29 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72  ){.        eqp_r
c2b0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20  eset(p);.       
c2c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
c2d0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
c2e0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
c2f0: 22 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33  ", pRow->zText+3
c300: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61  );.      p->sGra
c310: 70 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e  ph.pRow = pRow->
c320: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
c330: 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b  ite3_free(pRow);
c340: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c350: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c360: 3e 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41  >out, "QUERY PLA
c370: 4e 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  N\n");.    }.   
c380: 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66   p->sGraph.zPref
c390: 69 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65  ix[0] = 0;.    e
c3a0: 71 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28  qp_render_level(
c3b0: 70 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72  p, 0);.    eqp_r
c3c0: 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  eset(p);.  }.}..
c3d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
c3e0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
c3f0: 6e 65 20 74 68 61 74 20 74 68 65 20 73 68 65 6c  ne that the shel
c400: 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72  l.** invokes for
c410: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71   each row of a q
c420: 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  uery result..*/.
c430: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
c440: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
c450: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e  d *pArg,.  int n
c460: 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Arg,        /* N
c470: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
c480: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
c490: 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a  r **azArg,    /*
c4a0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 72 65   Text of each re
c4b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
c4c0: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20   char **azCol,  
c4d0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
c4e0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79  s */.  int *aiTy
c4f0: 70 65 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  pe      /* Colum
c500: 6e 20 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20  n types */.){.  
c510: 69 6e 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74  int i;.  ShellSt
c520: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
c530: 74 61 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69  tate*)pArg;..  i
c540: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
c550: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
c560: 28 20 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20  ( p->cMode ){.  
c570: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65    case MODE_Line
c580: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20  : {.      int w 
c590: 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61  = 5;.      if( a
c5a0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
c5b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c5c0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
c5d0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
c5e0: 73 74 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69  strlen30(azCol[i
c5f0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
c600: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
c610: 6c 65 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b  len>w ) w = len;
c620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c630: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20  f( p->cnt++>0 ) 
c640: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c650: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
c660: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c670: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c680: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c690: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c6a0: 6f 75 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22  out,"%*s = %s%s"
c6b0: 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20  , w, azCol[i],. 
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
c6d0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
c6e0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
c6f0: 65 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  e, p->rowSeparat
c700: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
c710: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c720: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78      case MODE_Ex
c730: 70 6c 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20  plain:.    case 
c740: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20  MODE_Column: {. 
c750: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
c760: 74 20 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69  t int aExplainWi
c770: 64 74 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c  dths[] = {4, 13,
c780: 20 34 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c   4, 4, 4, 13, 2,
c790: 20 31 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73   13};.      cons
c7a0: 74 20 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b  t int *colWidth;
c7b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48  .      int showH
c7c0: 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dr;.      char *
c7d0: 72 6f 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66  rowSep;.      if
c7e0: 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  ( p->cMode==MODE
c7f0: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
c800: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d     colWidth = p-
c810: 3e 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  >colWidth;.     
c820: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e     showHdr = p->
c830: 73 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20  showHeader;.    
c840: 20 20 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e      rowSep = p->
c850: 72 6f 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20  rowSeparator;.  
c860: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c870: 20 20 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45     colWidth = aE
c880: 78 70 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20  xplainWidths;.  
c890: 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20        showHdr = 
c8a0: 31 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65  1;.        rowSe
c8b0: 70 20 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20  p = SEP_Row;.   
c8c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
c8d0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20  ->cnt++==0 ){.  
c8e0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c8f0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c900: 20 20 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b         int w, n;
c910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c920: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  <ArraySize(p->co
c930: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
c940: 20 20 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69         w = colWi
c950: 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  dth[i];.        
c960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c970: 20 20 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20       w = 0;.    
c980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c990: 20 20 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20    if( w==0 ){.  
c9a0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74            w = st
c9b0: 72 6c 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69  rlenChar(azCol[i
c9c0: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
c9d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
c9e0: 69 66 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31  if( w<10 ) w = 1
c9f0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
ca00: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
ca10: 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  Arg && azArg[i] 
ca20: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
ca30: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
ca40: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20          if( w<n 
ca50: 29 20 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  ) w = n;.       
ca60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
ca70: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
ca80: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20 29  ->actualWidth) )
ca90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
caa0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20  >actualWidth[i] 
cab0: 3d 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = w;.          }
cac0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
cad0: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
cae0: 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68        utf8_width
caf0: 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77  _print(p->out, w
cb00: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
cb10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
cb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
cb30: 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72  ", i==nArg-1 ? r
cb40: 6f 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20  owSep : "  ");. 
cb50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
cb60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
cb70: 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20   showHdr ){.    
cb80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cb90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cba0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a           int w;.
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cbc0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
cbd0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
cbf0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
cc00: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
cc10: 20 20 20 20 69 66 28 20 77 3c 30 20 29 20 77 20      if( w<0 ) w 
cc20: 3d 20 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20  = -w;.          
cc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cc40: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
cc60: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
cc70: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d  rintf(p->out,"%-
cc80: 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20  *.*s%s",w,w,.   
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20  -----------".   
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20  -----------",.  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f    i==nArg-1 ? ro
cd50: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
cd60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
cd80: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
cd90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
cda0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
cdb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
cdc0: 20 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   w;.        if( 
cdd0: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
cde0: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
cdf0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
ce00: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
ce10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ce20: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 31             w = 1
ce30: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ce40: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64       if( p->cMod
ce50: 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
ce60: 26 26 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73  && azArg[i] && s
ce70: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b  trlenChar(azArg[
ce80: 69 5d 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20  i])>w ){.       
ce90: 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61     w = strlenCha
cea0: 72 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  r(azArg[i]);.   
ceb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cec0: 66 28 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69  f( i==1 && p->ai
ced0: 49 6e 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74  Indent && p->pSt
cee0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
cef0: 69 66 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70  if( p->iIndent<p
cf00: 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20  ->nIndent ){.   
cf10: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
cf20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a  intf(p->out, "%*
cf30: 2e 73 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .s", p->aiIndent
cf40: 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22  [p->iIndent], ""
cf50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cf60: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64           p->iInd
cf70: 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  ent++;.        }
cf80: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 77 69  .        utf8_wi
cf90: 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74  dth_print(p->out
cfa0: 2c 20 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  , w, azArg[i] ? 
cfb0: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
cfc0: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
cfd0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
cfe0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e  >out, "%s", i==n
cff0: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
d000: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "  ");.      }.
d010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d020: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d030: 5f 53 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73  _Semi: {   /* .s
d040: 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73  chema and .fulls
d050: 63 68 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a  chema output */.
d060: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
d070: 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a  aLine(p->out, az
d080: 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a  Arg[0], ";\n");.
d090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d0a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
d0b0: 5f 50 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e  _Pretty: {  /* .
d0c0: 73 63 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c  schema and .full
d0d0: 73 63 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e  schema with --in
d0e0: 64 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68  dent */.      ch
d0f0: 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ar *z;.      int
d100: 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   j;.      int nP
d110: 61 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  aren = 0;.      
d120: 63 68 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20  char cEnd = 0;. 
d130: 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20       char c;.   
d140: 20 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30     int nLine = 0
d150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d160: 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
d170: 20 69 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30   if( azArg[0]==0
d180: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d190: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  if( sqlite3_strl
d1a0: 69 6b 65 28 22 43 52 45 41 54 45 20 56 49 45 57  ike("CREATE VIEW
d1b0: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
d1c0: 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  ==0.       || sq
d1d0: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
d1e0: 52 45 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a  REATE TRIG%", az
d1f0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
d200: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75      ){.        u
d210: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d220: 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72  t, "%s;\n", azAr
d230: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62  g[0]);.        b
d240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d250: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
d260: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
d270: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a  Arg[0]);.      j
d280: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
d290: 69 3d 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69  i=0; IsSpace(z[i
d2a0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
d2b0: 20 66 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d   for(; (c = z[i]
d2c0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
d2d0: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
d2e0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
d2f0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27  if( z[j-1]=='\r'
d300: 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27   ) z[j-1] = '\n'
d310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d320: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
d330: 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29  || z[j-1]=='(' )
d340: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d350: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
d360: 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20  ='(' || c==')') 
d370: 26 26 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  && j>0 && IsSpac
d380: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20  e(z[j-1]) ){.   
d390: 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
d3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b      }.        z[
d3b0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
d3c0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  }.      while( j
d3d0: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
d3e0: 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  j-1]) ){ j--; }.
d3f0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
d400: 20 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e        if( strlen
d410: 33 30 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20  30(z)>=79 ){.   
d420: 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20       for(i=j=0; 
d430: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69  (c = z[i])!=0; i
d440: 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68  ++){  /* Copy ch
d450: 61 6e 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20  anges from z[i] 
d460: 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a  back to z[j] */.
d470: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
d480: 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =cEnd ){.       
d490: 20 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20       cEnd = 0;. 
d4a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
d4b0: 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d  f( c=='"' || c==
d4c0: 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29  '\'' || c=='`' )
d4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
d4e0: 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  nd = c;.        
d4f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d500: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  [' ){.          
d510: 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20    cEnd = ']';.  
d520: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d530: 28 20 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b  ( c=='-' && z[i+
d540: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  1]=='-' ){.     
d550: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c         cEnd = '\
d560: 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  n';.          }e
d570: 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29  lse if( c=='(' )
d580: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
d590: 61 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  aren++;.        
d5a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
d5b0: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )' ){.          
d5c0: 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20    nParen--;.    
d5d0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e          if( nLin
d5e0: 65 3e 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30  e>0 && nParen==0
d5f0: 20 26 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20   && j>0 ){.     
d600: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63           printSc
d610: 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74  hemaLineN(p->out
d620: 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20  , z, j, "\n");. 
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d               j =
d640: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
d650: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
d660: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
d670: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   c;.          if
d680: 28 20 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63  ( nParen==1 && c
d690: 45 6e 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  End==0.         
d6a0: 20 20 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20    && (c=='(' || 
d6b0: 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27  c=='\n' || (c=='
d6c0: 2c 27 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a  ,' && !wsToEol(z
d6d0: 2b 69 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20  +i+1))).        
d6e0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
d6f0: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a   if( c=='\n' ) j
d700: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
d710: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
d720: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22  (p->out, z, j, "
d730: 5c 6e 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  \n  ");.        
d740: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
d750: 20 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a         nLine++;.
d760: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
d770: 65 28 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31  e( IsSpace(z[i+1
d780: 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ i++; }.   
d790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7a0: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20   }.        z[j] 
d7b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d7c0: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
d7d0: 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b  ne(p->out, z, ";
d7e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
d7f0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
d800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d810: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69      case MODE_Li
d820: 73 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  st: {.      if( 
d830: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
d840: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
d850: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
d860: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
d870: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
d880: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25  intf(p->out,"%s%
d890: 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  s",azCol[i],.   
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d8b0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f  ==nArg-1 ? p->ro
d8c0: 77 53 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e  wSeparator : p->
d8d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
d8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d8f0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
d900: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
d910: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
d920: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
d930: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
d940: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  g[i];.        if
d950: 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e  ( z==0 ) z = p->
d960: 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20  nullValue;.     
d970: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d980: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
d990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
d9a0: 41 72 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Arg-1 ){.       
d9b0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
d9c0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
d9d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
d9e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d9f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
da10: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
da20: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
da30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
da40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
da50: 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20  e MODE_Html: {. 
da60: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
da70: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
da80: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
da90: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
daa0: 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20  ut,"<TR>");.    
dab0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
dac0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
dad0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
dae0: 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a  p->out,"<TH>");.
daf0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
db00: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
db10: 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  out, azCol[i]);.
db20: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
db30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
db40: 48 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  H>\n");.        
db50: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
db60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
db70: 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  R>\n");.      }.
db80: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
db90: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
dba0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
dbb0: 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20  out,"<TR>");.   
dbc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
dbd0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
dbe0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
dbf0: 6f 75 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20  out,"<TD>");.   
dc00: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
dc10: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
dc20: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
dc30: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
dc40: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ue);.        raw
dc50: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
dc60: 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TD>\n");.     
dc70: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
dc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52  ntf(p->out,"</TR
dc90: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  >\n");.      bre
dca0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
dcb0: 73 65 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20  se MODE_Tcl: {. 
dcc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
dcd0: 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48  +==0 && p->showH
dce0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  eader ){.       
dcf0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
dd00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dd10: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
dd20: 67 28 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69  g(p->out,azCol[i
dd30: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
dd40: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
dd50: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
dd60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
dd70: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
dd80: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
dd90: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
dda0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ddb0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
ddc0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ddd0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
dde0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
ddf0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
de00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75  i++){.        ou
de10: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
de20: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
de30: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
de40: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
de50: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
de60: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
de70: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
de80: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
de90: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
dea0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
deb0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
dec0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
ded0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
dee0: 65 20 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20  e MODE_Csv: {.  
def0: 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
df00: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
df10: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
df20: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
df30: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
df40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
df50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
df60: 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61   output_csv(p, a
df70: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
df80: 69 5d 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d  i] : "", i<nArg-
df90: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
dfa0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
dfb0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
dfc0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
dfd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dfe0: 69 66 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20  if( nArg>0 ){.  
dff0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e000: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e010: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
e020: 76 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69  v(p, azArg[i], i
e030: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
e040: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e050: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e060: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e070: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e080: 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
e090: 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
e0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e0b0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49  .    case MODE_I
e0c0: 6e 73 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69  nsert: {.      i
e0d0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e0e0: 65 61 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  eak;.      utf8_
e0f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49  printf(p->out,"I
e100: 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70  NSERT INTO %s",p
e110: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
e120: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77       if( p->show
e130: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
e140: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e150: 6f 75 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20  out,"(");.      
e160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e170: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e180: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
e190: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e1a0: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
e1b0: 69 66 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a  if( quoteChar(az
e1c0: 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  Col[i]) ){.     
e1d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
e1e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
e1f0: 28 22 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c  ("\"%w\"", azCol
e200: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
e210: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e220: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
e230: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e240: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20  te3_free(z);.   
e250: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e260: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
e270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e280: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
e290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e2a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
e2b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
e2c0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
e2d0: 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20    p->cnt++;.    
e2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e2f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e300: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e310: 75 74 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20  ut, i>0 ? "," : 
e320: 22 20 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20  " VALUES(");.   
e330: 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b       if( (azArg[
e340: 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70  i]==0) || (aiTyp
e350: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e360: 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
e370: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e380: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55  rintf(p->out,"NU
e390: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  LL");.        }e
e3a0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
e3b0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
e3c0: 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20  ITE_TEXT ){.    
e3d0: 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48        if( ShellH
e3e0: 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
e3f0: 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20  Newlines) ){.   
e400: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
e410: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
e420: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
e430: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
e450: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
e460: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
e470: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
e480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e490: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e4a0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e4b0: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
e4c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e4d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e4e0: 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "%s", azArg[i]);
e4f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
e500: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
e510: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46  ype[i]==SQLITE_F
e520: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
e530: 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20    char z[50];.  
e540: 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
e550: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e560: 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d  n_double(p->pStm
e570: 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
e580: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
e590: 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  ur;.          me
e5a0: 6d 63 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65  mcpy(&ur,&r,size
e5b0: 6f 66 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20  of(r));.        
e5c0: 20 20 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30    if( ur==0x7ff0
e5d0: 30 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29  000000000000LL )
e5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
e5f0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e600: 20 22 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20   "1e999");.     
e610: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75       }else if( u
e620: 72 3d 3d 30 78 66 66 66 30 30 30 30 30 30 30 30  r==0xfff00000000
e630: 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20  00000LL ){.     
e640: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e650: 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39  f(p->out, "-1e99
e660: 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  9");.          }
e670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e680: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e690: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
e6a0: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
e6b0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e6c0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e6d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e6e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
e6f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
e700: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
e710: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
e720: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
e730: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
e740: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
e750: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
e760: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
e770: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
e780: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
e790: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
e7a0: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
e7b0: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
e7c0: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
e7d0: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
e7e0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
e7f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e800: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e810: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
e820: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e830: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
e840: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
e850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ) ){.          o
e860: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
e870: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e880: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
e890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e8a0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
e8b0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  caped_string(p->
e8c0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8e0: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
e8f0: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22  tf(p->out,");\n"
e900: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e910: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e920: 4f 44 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20  ODE_Quote: {.   
e930: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e940: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
e950: 66 28 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20  f( p->cnt==0 && 
e960: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
e970: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
e980: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e990: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
e9a0: 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  0 ) raw_printf(p
e9b0: 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20  ->out, ",");.   
e9c0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e9d0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
e9e0: 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ut, azCol[i]);. 
e9f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ea00: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea10: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
ea20: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
ea30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ea40: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ea50: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ea60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ea70: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
ea80: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
ea90: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
eaa0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
eab0: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
eac0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ead0: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
eae0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
eaf0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
eb00: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
eb10: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
eb20: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
eb30: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
eb40: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
eb50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
eb60: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
eb70: 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  ==SQLITE_INTEGER
eb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
eb90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eba0: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
ebb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ebc0: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ebd0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ebe0: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
ebf0: 20 20 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20     char z[50];. 
ec00: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
ec10: 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
ec20: 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74  mn_double(p->pSt
ec30: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
ec40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ec50: 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22  tf(50,z,"%!.20g"
ec60: 2c 20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , r);.          
ec70: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ec80: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
ec90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
eca0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ecb0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  i]==SQLITE_BLOB 
ecc0: 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  && p->pStmt ){. 
ecd0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76           const v
ece0: 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c  oid *pBlob = sql
ecf0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
ed00: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
ed10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c           int nBl
ed20: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
ed30: 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74  umn_bytes(p->pSt
ed40: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
ed50: 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f    output_hex_blo
ed60: 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c  b(p->out, pBlob,
ed70: 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20   nBlob);.       
ed80: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d   }else if( isNum
ed90: 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29  ber(azArg[i], 0)
eda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
edb0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
edc0: 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  ,"%s", azArg[i])
edd0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ede0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
edf0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
ee00: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
ee10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ee20: 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70     }.      raw_p
ee30: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e  rintf(p->out,"\n
ee40: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
ee50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ee60: 4d 4f 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20  MODE_Ascii: {.  
ee70: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
ee80: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
ee90: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
eea0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
eeb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
eec0: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
eed0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
eee0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
eef0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ator);.         
ef00: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ef10: 6f 75 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69  out,"%s",azCol[i
ef20: 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22  ] ? azCol[i] : "
ef30: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
ef40: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ef50: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ef60: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
ef70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef80: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
ef90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
efa0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
efb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
efc0: 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66  >0 ) utf8_printf
efd0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
efe0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
eff0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
f000: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f010: 2c 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72  ,azArg[i] ? azAr
f020: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
f030: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
f040: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f050: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f060: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
f070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f080: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f090: 5f 45 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71  _EQP: {.      eq
f0a0: 70 5f 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69  p_append(p, atoi
f0b0: 28 61 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69  (azArg[0]), atoi
f0c0: 28 61 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72  (azArg[1]), azAr
f0d0: 67 5b 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65  g[3]);.      bre
f0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
f0f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f100: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
f110: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
f120: 74 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20  that the SQLite 
f130: 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b  library.** invok
f140: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
f150: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
f160: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f170: 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a   callback(void *
f180: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
f190: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
f1a0: 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f  ar **azCol){.  /
f1b0: 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74  * since we don't
f1c0: 20 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c   have type info,
f1d0: 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f   call the shell_
f1e0: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20  callback with a 
f1f0: 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NULL value */.  
f200: 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c  return shell_cal
f210: 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67  lback(pArg, nArg
f220: 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20  , azArg, azCol, 
f230: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NULL);.}../*.** 
f240: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
f250: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f  back routine fro
f260: 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  m sqlite3_exec()
f270: 20 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c   that appends al
f280: 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f  l.** output onto
f290: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68   the end of a Sh
f2a0: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a  ellText object..
f2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
f2c0: 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
f2d0: 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
f2e0: 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
f2f0: 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
f300: 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20  z){.  ShellText 
f310: 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a  *p = (ShellText*
f320: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
f330: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f340: 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a  ER(az);.  if( az
f350: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
f360: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20  0;.  if( p->n ) 
f370: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c  appendText(p, "|
f380: 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ", 0);.  for(i=0
f390: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f3a0: 20 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65      if( i ) appe
f3b0: 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30  ndText(p, ",", 0
f3c0: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67  );.    if( azArg
f3d0: 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74  [i] ) appendText
f3e0: 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29  (p, azArg[i], 0)
f3f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
f400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
f410: 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ate an appropria
f420: 74 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  te SELFTEST tabl
f430: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
f440: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
f450: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c  c void createSel
f460: 66 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c  ftestTable(Shell
f470: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61  State *p){.  cha
f480: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
f490: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
f4a0: 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50  ->db,.    "SAVEP
f4b0: 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e  OINT selftest_in
f4c0: 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41  it;\n".    "CREA
f4d0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
f4e0: 45 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28  EXISTS selftest(
f4f0: 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49  \n".    "  tno I
f500: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
f510: 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74  EY,\n"   /* Test
f520: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22   number */.    "
f530: 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20    op TEXT,\n"   
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65  /* Operator:  me
f560: 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20  mo run */.    " 
f570: 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20   cmd TEXT,\n"   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f590: 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a  * Command text *
f5a0: 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58  /.    "  ans TEX
f5b0: 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  T\n"            
f5c0: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
f5d0: 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20  d answer */.    
f5e0: 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45  ");".    "CREATE
f5f0: 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68   TEMP TABLE [_sh
f600: 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64  ell$self](op,cmd
f610: 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49  ,ans);\n".    "I
f620: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
f630: 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f  ll$self](rowid,o
f640: 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20  p,cmd)\n".    " 
f650: 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65   VALUES(coalesce
f660: 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e  ((SELECT (max(tn
f670: 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20  o)+100)/10 FROM 
f680: 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e  selftest),10),\n
f690: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20  ".    "         
f6a0: 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65  'memo','Tests ge
f6b0: 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69  nerated by --ini
f6c0: 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  t');\n".    "INS
f6d0: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
f6e0: 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
f6f0: 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e   SELECT 'run',\n
f700: 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
f710: 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
f720: 79 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c  y(''SELECT type,
f730: 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71  name,tbl_name,sq
f740: 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  l ".            
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74       "FROM sqlit
f770: 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42  e_master ORDER B
f780: 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  Y 2'',224))',\n"
f790: 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
f7a0: 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54  a3_query('SELECT
f7b0: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
f7c0: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
f7f0: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
f800: 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20   2',224));\n".  
f810: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
f820: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
f830: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
f840: 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27  un',".    "    '
f850: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
f860: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a  query(''SELECT *
f870: 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20   FROM \"' ||".  
f880: 20 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74    "        print
f890: 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20  f('%w',name) || 
f8a0: 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  '\" NOT INDEXED'
f8b0: 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
f8c0: 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
f8d0: 75 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c  uery(printf('SEL
f8e0: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
f8f0: 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e  " NOT INDEXED',n
f900: 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20  ame),224))\n".  
f910: 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20    "  FROM (\n". 
f920: 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e     "    SELECT n
f930: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
f940: 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20  master\n".    " 
f950: 20 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27      WHERE type='
f960: 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20  table'\n".    " 
f970: 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e        AND name<>
f980: 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20  'selftest'\n".  
f990: 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f    "       AND co
f9a0: 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c  alesce(rootpage,
f9b0: 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29  0)>0\n".    "  )
f9c0: 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  \n".    " ORDER 
f9d0: 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20  BY name;\n".    
f9e0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
f9f0: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
fa00: 20 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e    "  VALUES('run
fa10: 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72  ','PRAGMA integr
fa20: 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29  ity_check','ok')
fa30: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
fa40: 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74   INTO selftest(t
fa50: 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a  no,op,cmd,ans)".
fa60: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f      "  SELECT ro
fa70: 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e  wid*10,op,cmd,an
fa80: 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73  s FROM [_shell$s
fa90: 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52  elf];\n".    "DR
faa0: 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  OP TABLE [_shell
fab0: 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c  $self];".    ,0,
fac0: 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  0,&zErrMsg);.  i
fad0: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
fae0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
faf0: 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20  derr, "SELFTEST 
fb00: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
fb10: 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a  ailure: %s\n", z
fb20: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
fb30: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
fb40: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
fb50: 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52  3_exec(p->db, "R
fb60: 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f  ELEASE selftest_
fb70: 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a  init",0,0,0);.}.
fb80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fb90: 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c  destination tabl
fba0: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53  e field of the S
fbb0: 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74  hellState struct
fbc0: 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  ure to.** the na
fbd0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
fbe0: 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61  given.  Escape a
fbf0: 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ny quote charact
fc00: 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61  ers in the.** ta
fc10: 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ble name..*/.sta
fc20: 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62  tic void set_tab
fc30: 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61  le_name(ShellSta
fc40: 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
fc50: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
fc60: 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51   i, n;.  char cQ
fc70: 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  uote;.  char *z;
fc80: 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74  ..  if( p->zDest
fc90: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65  Table ){.    fre
fca0: 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29  e(p->zDestTable)
fcb0: 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61  ;.    p->zDestTa
fcc0: 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ble = 0;.  }.  i
fcd0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
fce0: 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d  turn;.  cQuote =
fcf0: 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65   quoteChar(zName
fd00: 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  );.  n = strlen3
fd10: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  0(zName);.  if( 
fd20: 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b  cQuote ) n += n+
fd30: 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73  2;.  z = p->zDes
fd40: 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  tTable = malloc(
fd50: 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d   n+1 );.  if( z=
fd60: 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
fd70: 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20  f_memory();.  n 
fd80: 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74  = 0;.  if( cQuot
fd90: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
fda0: 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ote;.  for(i=0; 
fdb0: 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zName[i]; i++){.
fdc0: 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61      z[n++] = zNa
fdd0: 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  me[i];.    if( z
fde0: 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20  Name[i]==cQuote 
fdf0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
fe00: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75  e;.  }.  if( cQu
fe10: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
fe20: 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20  Quote;.  z[n] = 
fe30: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  0;.}.../*.** Exe
fe40: 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74 61  cute a query sta
fe50: 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
fe60: 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75   generate SQL ou
fe70: 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20  tput.  Print.** 
fe80: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
fe90: 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  ns, comma-separa
fea0: 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61  ted, on a line a
feb0: 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a  nd then add a.**
fec0: 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
fed0: 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  nator to the end
fee0: 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a   of that line..*
fef0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
ff00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73  er of columns is
ff10: 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   1 and that colu
ff20: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74  mn contains text
ff30: 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72   "--".** then wr
ff40: 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ite the semicolo
ff50: 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20  n on a separate 
ff60: 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c  line.  That way,
ff70: 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f   if a.** "--" co
ff80: 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20  mment occurs at 
ff90: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
ffa0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f  tatement, the co
ffb0: 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63  mment.** won't c
ffc0: 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63  onsume the semic
ffd0: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e  olon terminator.
ffe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
fff0: 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
10000 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ery(.  ShellStat
10010 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
10020 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74  /* Query context
10030 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10040 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f   *zSelect,     /
10050 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
10060 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f  nt to extract co
10070 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntent */.  const
10080 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77   char *zFirstRow
10090 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66      /* Print bef
100a0 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69  ore first row, i
100b0 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
100c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
100d0 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  *pSelect;.  int 
100e0 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c  rc;.  int nResul
100f0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  t;.  int i;.  co
10100 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72  nst char *z;.  r
10110 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
10120 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
10130 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c  elect, -1, &pSel
10140 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ect, 0);.  if( r
10150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
10160 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  !pSelect ){.    
10170 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10180 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10190 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
101a0 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
101b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
101c0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
101d0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
101e0 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
101f0 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
10200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10210 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10220 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10230 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c  .  nResult = sql
10240 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
10250 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68  t(pSelect);.  wh
10260 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10270 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ROW ){.    if( z
10280 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20  FirstRow ){.    
10290 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
102a0 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72  >out, "%s", zFir
102b0 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46  stRow);.      zF
102c0 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20  irstRow = 0;.   
102d0 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73   }.    z = (cons
102e0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
102f0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10300 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66  ect, 0);.    utf
10310 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10320 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66   "%s", z);.    f
10330 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c  or(i=1; i<nResul
10340 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  t; i++){.      u
10350 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10360 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65  t, ",%s", sqlite
10370 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
10380 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20  elect, i));.    
10390 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  }.    if( z==0 )
103a0 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69   z = "";.    whi
103b0 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30  le( z[0] && (z[0
103c0 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d  ]!='-' || z[1]!=
103d0 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  '-') ) z++;.    
103e0 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  if( z[0] ){.    
103f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
10400 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20  out, "\n;\n");. 
10410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10420 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10430 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  t, ";\n");.    }
10440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10450 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b  3_step(pSelect);
10460 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10470 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65  te3_finalize(pSe
10480 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21  lect);.  if( rc!
10490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
104a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
104b0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
104c0 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
104d0 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
104e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
104f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
10500 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
10510 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
10520 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
10530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
10550 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20 73  cate space and s
10560 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20  ave off current 
10570 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f  error string..*/
10580 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 61  .static char *sa
10590 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71  ve_err_msg(.  sq
105a0 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20 20  lite3 *db       
105b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
105c0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   to query */.){.
105d0 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20    int nErrMsg = 
105e0 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  1+strlen30(sqlit
105f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
10600 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10610 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
10620 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69  64(nErrMsg);.  i
10630 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
10640 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67    memcpy(zErrMsg
10650 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
10660 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a  (db), nErrMsg);.
10670 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
10680 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rMsg;.}..#ifdef 
10690 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20  __linux__./*.** 
106a0 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c  Attempt to displ
106b0 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20  ay I/O stats on 
106c0 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f  Linux using /pro
106d0 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74  c/PID/io.*/.stat
106e0 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c  ic void displayL
106f0 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45  inuxIoStats(FILE
10700 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a   *out){.  FILE *
10710 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30  in;.  char z[200
10720 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
10730 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
10740 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f   z, "/proc/%d/io
10750 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  ", getpid());.  
10760 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72  in = fopen(z, "r
10770 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
10780 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
10790 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a  le( fgets(z, siz
107a0 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29  eof(z), in)!=0 )
107b0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
107c0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
107d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
107e0 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f  attern;.      co
107f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b  nst char *zDesc;
10800 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20  .    } aTrans[] 
10810 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68  = {.      { "rch
10820 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
10830 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
10840 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64 28  eceived by read(
10850 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ):" },.      { "
10860 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20  wchar: ",       
10870 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
10880 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28  s sent to write(
10890 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  ):"    },.      
108a0 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20  { "syscr: ",    
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
108c0 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ead() system cal
108d0 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  ls:"      },.   
108e0 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20     { "syscw: ", 
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65 6d   "Write() system
10910 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a   calls:"     },.
10920 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79        { "read_by
10930 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
10940 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64 20      "Bytes read 
10950 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20  from storage:"  
10960 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74  },.      { "writ
10970 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  e_bytes: ",     
10980 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77 72         "Bytes wr
10990 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65  itten to storage
109a0 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63  :" },.      { "c
109b0 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62  ancelled_write_b
109c0 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65  ytes: ",  "Cance
109d0 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65 73  lled write bytes
109e0 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  :"    },.    };.
109f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10a00 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
10a10 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b  ize(aTrans); i++
10a20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
10a30 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73   strlen30(aTrans
10a40 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20  [i].zPattern);. 
10a50 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
10a60 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74  (aTrans[i].zPatt
10a70 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b  ern, z, n)==0 ){
10a80 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
10a90 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
10aa0 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e   %s", aTrans[i].
10ab0 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20  zDesc, &z[n]);. 
10ac0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10ae0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a    fclose(in);.}.
10af0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69  #endif../*.** Di
10b00 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c  splay a single l
10b10 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75 73  ine of status us
10b20 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65  ing 64-bit value
10b30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10b40 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e  d displayStatLin
10b50 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  e(.  ShellState 
10b60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10b70 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74  * The shell cont
10b80 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ext */.  char *z
10b90 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Label,          
10ba0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
10bb0 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f  this one line */
10bc0 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  .  char *zFormat
10bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10be0 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72  Format for the r
10bf0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esult */.  int i
10c00 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20  StatusCtrl,     
10c10 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74       /* Which st
10c20 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20  atus to display 
10c30 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20  */.  int bReset 
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c50 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
10c60 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a  the stats */.){.
10c70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10c80 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  iCur = -1;.  sql
10c90 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74  ite3_int64 iHiwt
10ca0 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c  r = -1;.  int i,
10cb0 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61   nPercent;.  cha
10cc0 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20  r zLine[200];.  
10cd0 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34  sqlite3_status64
10ce0 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69  (iStatusCtrl, &i
10cf0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
10d00 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30  eset);.  for(i=0
10d10 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46  , nPercent=0; zF
10d20 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  ormat[i]; i++){.
10d30 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b      if( zFormat[
10d40 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65  i]=='%' ) nPerce
10d50 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
10d60 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20  nPercent>1 ){.  
10d70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10d80 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
10d90 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
10da0 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b  , iCur, iHiwtr);
10db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10dc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
10dd0 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c  izeof(zLine), zL
10de0 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48  ine, zFormat, iH
10df0 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77  iwtr);.  }.  raw
10e00 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10e10 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c  "%-36s %s\n", zL
10e20 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a  abel, zLine);.}.
10e30 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d  ./*.** Display m
10e40 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a  emory stats..*/.
10e50 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
10e60 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69  ay_stats(.  sqli
10e70 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10e80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10e90 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
10ea0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
10eb0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rg,           /*
10ec0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
10ed0 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  lState */.  int 
10ee0 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20  bReset          
10ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10f00 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
10f10 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
10f20 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74  Cur;.  int iHiwt
10f30 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a  r;.  FILE *out;.
10f40 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c    if( pArg==0 ||
10f50 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20   pArg->out==0 ) 
10f60 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20  return 0;.  out 
10f70 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20  = pArg->out;..  
10f80 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20  if( pArg->pStmt 
10f90 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f  && (pArg->statsO
10fa0 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e  n & 2) ){.    in
10fb0 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20  t nCol, i, x;.  
10fc0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10fd0 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53  pStmt = pArg->pS
10fe0 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  tmt;.    char z[
10ff0 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  100];.    nCol =
11000 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11010 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
11020 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
11030 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20  , "%-36s %d\n", 
11040 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75  "Number of outpu
11050 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f  t columns:", nCo
11060 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l);.    for(i=0;
11070 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11090 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
110a0 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e  z,"Column %d %nn
110b0 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20  ame:", i, &x);. 
110c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
110d0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
110e0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
110f0 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
11100 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ,i));.#ifndef SQ
11110 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
11120 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  PE.      sqlite3
11130 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
11140 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79 70  x, "declared typ
11150 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38  e:");.      utf8
11160 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d  _printf(out, "%-
11170 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71  36s %s\n", z, sq
11180 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
11190 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29  ltype(pStmt, i))
111a0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
111b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
111c0 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
111d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
111e0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64  intf(30, z+x, "d
111f0 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b  atabase name:");
11200 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11210 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11220 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
11230 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
11240 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11260 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11270 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b   "table name:");
11280 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
11290 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
112a0 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
112b0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
112c0 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
112d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
112e0 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f  intf(30, z+x, "o
112f0 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20  rigin name:");. 
11300 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11310 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11320 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11330 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
11340 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e  e(pStmt,i));.#en
11350 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
11360 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11370 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55  (pArg, "Memory U
11380 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  sed:",.     "%ll
11390 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74  d (max %lld) byt
113a0 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
113b0 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20  US_MEMORY_USED, 
113c0 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
113d0 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
113e0 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73   "Number of Outs
113f0 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69  tanding Allocati
11400 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ons:",.     "%ll
11410 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
11420 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11430 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65  LOC_COUNT, bRese
11440 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t);.  if( pArg->
11450 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c  shellFlgs & SHFL
11460 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20  G_Pagecache ){. 
11470 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
11480 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11490 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65 73   of Pcache Pages
114a0 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20   Used:",.       
114b0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
114c0 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f   pages", SQLITE_
114d0 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
114e0 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a  _USED, bReset);.
114f0 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61    }.  displaySta
11500 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d  tLine(pArg, "Num
11510 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76  ber of Pcache Ov
11520 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a  erflow Bytes:",.
11530 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11540 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51  %lld) bytes", SQ
11550 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11560 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20  CACHE_OVERFLOW, 
11570 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c  bReset);.  displ
11580 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11590 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
115a0 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tion:",.     "%l
115b0 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  ld bytes", SQLIT
115c0 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
115d0 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  SIZE, bReset);. 
115e0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
115f0 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11600 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f  Pcache Allocatio
11610 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  n:",.     "%lld 
11620 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11630 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
11640 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23  SIZE, bReset);.#
11650 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58  ifdef YYTRACKMAX
11660 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73  STACKDEPTH.  dis
11670 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11680 67 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73  g, "Deepest Pars
11690 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20  er Stack:",.    
116a0 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
116b0 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  )", SQLITE_STATU
116c0 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20  S_PARSER_STACK, 
116d0 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a  bReset);.#endif.
116e0 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
116f0 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
11700 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f  Flgs & SHFLG_Loo
11710 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20  kaside ){.      
11720 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11730 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
11740 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11750 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11760 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a  LOOKASIDE_USED,.
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
11790 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
117a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
117b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
117c0 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b             "Look
117d0 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64  aside Slots Used
117e0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
117f0 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c   %d (max %d)\n",
11800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
11810 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
11820 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
11830 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
11840 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
11850 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20  IDE_HIT,.       
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11880 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
11890 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
118a0 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66 75  >out, "Successfu
118b0 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65  l lookaside atte
118c0 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e  mpts:       %d\n
118d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
118e0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
118f0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11900 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11910 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11920 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20  MISS_SIZE,.     
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
11950 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11960 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11970 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
11980 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
11990 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64  to size:      %d
119a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
119b0 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
119c0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
119d0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
119e0 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
119f0 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20  E_MISS_FULL,.   
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
11a20 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
11a30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
11a40 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
11a50 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
11a60 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20  e to OOM:       
11a70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11a80 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
11a90 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d    }.    iHiwtr =
11aa0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
11ab0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11ac0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11ad0 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44  TATUS_CACHE_USED
11ae0 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11af0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11b00 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11b10 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61 70  out, "Pager Heap
11b20 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
11b30 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79             %d by
11b40 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
11b50 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69      iCur);.    i
11b60 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11b70 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11b80 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11b90 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11ba0 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26  HE_HIT, &iCur, &
11bb0 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11bc0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11bd0 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11be0 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20 20  e hits:         
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11c00 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11c10 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11c30 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11c40 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11c50 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26  E_MISS, &iCur, &
11c60 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
11c70 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11c80 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
11c90 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20  e misses:       
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11cb0 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
11cc0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
11cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
11ce0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
11cf0 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
11d00 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20  E_WRITE, &iCur, 
11d10 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
11d20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11d30 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
11d40 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20 20  he writes:      
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
11d60 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
11d70 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11d80 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11d90 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11da0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11db0 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c  HE_SPILL, &iCur,
11dc0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11dd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11de0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11df0 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20  che spills:     
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11e10 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11e20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11e30 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11e40 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11e50 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43  LITE_DBSTATUS_SC
11e60 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72  HEMA_USED, &iCur
11e70 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
11e80 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11e90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
11ea0 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67 65  chema Heap Usage
11eb0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11ec0 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
11ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75  .            iCu
11ee0 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
11ef0 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
11f00 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11f10 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11f20 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c  TATUS_STMT_USED,
11f30 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
11f40 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11f50 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11f60 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48  ut, "Statement H
11f70 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73  eap/Lookaside Us
11f80 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79 74  age:      %d byt
11f90 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
11fa0 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20     iCur);.  }.. 
11fb0 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74   if( pArg->pStmt
11fc0 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73   ){.    iCur = s
11fd0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
11fe0 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
11ff0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12000 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12040 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12050 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65  t, "Fullscan Ste
12060 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ps:             
12070 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12080 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12090 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
120a0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
120b0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
120c0 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65  ATUS_SORT, bRese
120d0 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
120e0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
120f0 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20  ort Operations: 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12120 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
12130 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
12140 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12150 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12160 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74  AUTOINDEX,bReset
12170 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12180 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75  f(pArg->out, "Au
12190 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a  toindex Inserts:
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121b0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
121c0 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
121d0 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
121e0 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
121f0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56  ITE_STMTSTATUS_V
12200 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b  M_STEP, bReset);
12210 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12220 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74  pArg->out, "Virt
12230 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70  ual Machine Step
12240 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
12250 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12260 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12270 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12280 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12290 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50  E_STMTSTATUS_REP
122a0 52 45 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b  REPARE, bReset);
122b0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
122c0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72  pArg->out, "Repr
122d0 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73  epare operations
122e0 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
122f0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12300 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12310 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12320 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12330 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e  E_STMTSTATUS_RUN
12340 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
12350 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12360 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  out, "Number of 
12370 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20  times run:      
12380 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12390 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
123a0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
123b0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
123c0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
123d0 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20  STATUS_MEMUSED, 
123e0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
123f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12400 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20  t, "Memory used 
12410 62 79 20 70 72 65 70 61 72 65 64 20 73 74 6d 74  by prepared stmt
12420 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  :        %d\n", 
12430 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64  iCur);.  }..#ifd
12440 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64  ef __linux__.  d
12450 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61  isplayLinuxIoSta
12460 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23  ts(pArg->out);.#
12470 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e  endif..  /* Do n
12480 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d  ot remove this m
12490 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20  achine readable 
124a0 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73  comment: extra-s
124b0 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65  tats-output-here
124c0 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   */..  return 0;
124d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  .}../*.** Displa
124e0 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f  y scan stats..*/
124f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
12500 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a  play_scanstats(.
12510 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
12540 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
12550 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20 20  lState *pArg    
12560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12570 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
12580 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  tate */.){.#ifnd
12590 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
125a0 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
125b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
125c0 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
125d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
125e0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69  );.#else.  int i
125f0 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61  , k, n, mx;.  ra
12600 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12610 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63  ut, "-------- sc
12620 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d  anstats --------
12630 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a  \n");.  mx = 0;.
12640 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78    for(k=0; k<=mx
12650 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62  ; k++){.    doub
12660 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e  le rEstLoop = 1.
12670 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  0;.    for(i=n=0
12680 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ; 1; i++){.     
12690 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
126a0 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a   = pArg->pStmt;.
126b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
126c0 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69  t64 nLoop, nVisi
126d0 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  t;.      double 
126e0 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  rEst;.      int 
126f0 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73  iSid;.      cons
12700 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e  t char *zExplain
12710 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
12720 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
12730 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
12740 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c  _SCANSTAT_NLOOP,
12750 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20   (void*)&nLoop) 
12760 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
12770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12780 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12790 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
127a0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45  LITE_SCANSTAT_SE
127b0 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26  LECTID, (void*)&
127c0 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  iSid);.      if(
127d0 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20   iSid>mx ) mx = 
127e0 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iSid;.      if( 
127f0 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e  iSid!=k ) contin
12800 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ue;.      if( n=
12810 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45  =0 ){.        rE
12820 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65  stLoop = (double
12830 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  )nLoop;.        
12840 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72  if( k>0 ) raw_pr
12850 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12860 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65  "-------- subque
12870 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  ry %d -------\n"
12880 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , k);.      }.  
12890 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73      n++;.      s
128a0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
128b0 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c  status(p, i, SQL
128c0 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49  ITE_SCANSTAT_NVI
128d0 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69  SIT, (void*)&nVi
128e0 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sit);.      sqli
128f0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
12900 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
12910 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
12920 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
12930 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12940 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12950 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12960 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
12970 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
12980 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
12990 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70  pArg->out, "Loop
129a0 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20   %2d: %s\n", n, 
129b0 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
129c0 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73   rEstLoop *= rEs
129d0 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  t;.      raw_pri
129e0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
129f0 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
12a00 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20     nLoop=%-8lld 
12a10 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  nRow=%-8lld estR
12a20 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
12a30 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20  /Loop=%-8g\n",. 
12a40 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20           nLoop, 
12a50 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33  nVisit, (sqlite3
12a60 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70  _int64)(rEstLoop
12a70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20  +0.5), rEst.    
12a80 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
12a90 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12aa0 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  ->out, "--------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ac0 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a  ---\n");.#endif.
12ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
12ae0 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74  er azArray point
12af0 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d  s to a zero-term
12b00 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66 20  inated array of 
12b10 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a  strings. zStr.**
12b20 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e   points to a sin
12b30 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  gle nul-terminat
12b40 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72  ed string. Retur
12b50 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53  n non-zero if zS
12b60 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20  tr.** is equal, 
12b70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72  according to str
12b80 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66  cmp(), to any of
12b90 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20   the strings in 
12ba0 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74  the array..** Ot
12bb0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
12bc0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
12bd0 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  int str_in_array
12be0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
12bf0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
12c00 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20  azArray){.  int 
12c10 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a  i;.  for(i=0; az
12c20 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  Array[i]; i++){.
12c30 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12c40 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b  p(zStr, azArray[
12c50 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i]) ) return 1;.
12c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
12c70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70  }../*.** If comp
12c80 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70  iled statement p
12c90 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62  Sql appears to b
12ca0 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  e an EXPLAIN sta
12cb0 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65  tement, allocate
12cc0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
12cd0 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
12ce0 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79  aiIndent[] array
12cf0 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
12d00 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61   of.** spaces ea
12d10 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64  ch opcode should
12d20 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66   be indented bef
12d30 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75 74  ore it is output
12d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
12d50 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a  nting rules are:
12d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
12d70 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50   each "Next", "P
12d80 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72  rev", "VNext" or
12d90 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75 63   "VPrev" instruc
12da0 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20  tion, indent.** 
12db0 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65        all opcode
12dc0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 74  s that occur bet
12dd0 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70  ween the p2 jump
12de0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64   destination and
12df0 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20   the opcode.**  
12e00 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20 32       itself by 2
12e10 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   spaces..**.**  
12e20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47     * For each "G
12e30 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d  oto", if the jum
12e40 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  p destination is
12e50 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
12e60 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20  program.**      
12e70 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65   and ends on one
12e80 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20   of:.**         
12e90 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20   Yield  SeekGt  
12ea0 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65  SeekLt  RowSetRe
12eb0 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20  ad  Rewind.**   
12ec0 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50 31      or if the P1
12ed0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e   parameter is on
12ee0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72  e instead of zer
12ef0 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  o,.**       then
12f00 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f   indent all opco
12f10 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  des between the 
12f20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74  earlier instruct
12f30 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ion.**       and
12f40 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61   "Goto" by 2 spa
12f50 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
12f60 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61  oid explain_data
12f70 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74  _prepare(ShellSt
12f80 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ate *p, sqlite3_
12f90 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63  stmt *pSql){.  c
12fa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fc0 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74 68  * The text of th
12fd0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
12fe0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12ff0 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
13000 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13010 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  check if this is
13020 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20   an EXPLAIN */. 
13030 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20   int *abYield = 
13040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13050 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69   /* True if op i
13060 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f  s an OP_Yield */
13070 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
13080 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13090 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
130a0 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64  size of p->aiInd
130b0 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a  ent[], abYield *
130c0 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20  /.  int iOp;    
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
130f0 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e  operation in p->
13100 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20  aiIndent[] */.. 
13110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e   const char *azN
13120 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22  ext[] = { "Next"
13130 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65 76  , "Prev", "VPrev
13140 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72  ", "VNext", "Sor
13150 74 65 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20  terNext", 0 };. 
13160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59   const char *azY
13170 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c  ield[] = { "Yiel
13180 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53  d", "SeekLT", "S
13190 65 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52  eekGT", "RowSetR
131a0 65 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ead",.          
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b    "Rewind", 0 };
131d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
131e0 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74  zGoto[] = { "Got
131f0 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54  o", 0 };..  /* T
13200 72 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ry to figure out
13210 20 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c   if this is real
13220 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74  ly an EXPLAIN st
13230 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73  atement. If this
13240 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  .  ** cannot be 
13250 76 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e  verified, return
13260 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66   early.  */.  if
13270 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
13280 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20  _count(pSql)!=8 
13290 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
132a0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
132b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71  eturn;.  }.  zSq
132c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
132d0 70 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71  pSql);.  if( zSq
132e0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
132f0 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d   for(z=zSql; *z=
13300 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27  =' ' || *z=='\t'
13310 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20   || *z=='\n' || 
13320 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\f' || *z==
13330 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66  '\r'; z++);.  if
13340 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  ( sqlite3_strnic
13350 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c  mp(z, "explain",
13360 20 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d   7) ){.    p->cM
13370 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
13390 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c    for(iOp=0; SQL
133a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
133b0 5f 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70  _step(pSql); iOp
133c0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ++){.    int i;.
133d0 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
133e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
133f0 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  nt(pSql, 0);.   
13400 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
13410 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
13430 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20  ext(pSql, 1);.. 
13440 20 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20     /* Set p2 to 
13450 74 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20  the P2 field of 
13460 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f  the current opco
13470 64 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69  de. Then, assumi
13480 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70  ng that.    ** p
13490 32 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74  2 is an instruct
134a0 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74  ion address, set
134b0 20 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74   variable p2op t
134c0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
134d0 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  hat.    ** instr
134e0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69  uction in the ai
134f0 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20  Indent[] array. 
13500 70 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20  p2 and p2op may 
13510 62 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a  be different if.
13520 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
13530 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
13540 73 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d  s part of a sub-
13550 70 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65  program generate
13560 64 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53  d by an.    ** S
13570 51 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f  QL trigger or fo
13580 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20  reign key.  */. 
13590 20 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69     int p2 = sqli
135a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
135b0 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74  Sql, 3);.    int
135c0 20 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69   p2op = (p2 + (i
135d0 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20  Op-iAddr));..   
135e0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e   /* Grow the p->
135f0 61 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61  aiIndent array a
13600 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
13610 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f    if( iOp>=nAllo
13620 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  c ){.      if( i
13630 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Op==0 ){.       
13640 20 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76   /* Do further v
13650 65 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20  erfication that 
13660 74 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20  this is explain 
13670 6f 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69  output.  Abort i
13680 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  f.        ** it 
13690 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  is not */.      
136a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
136b0 68 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73  har *explainCols
136c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
136d0 20 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64    "addr", "opcod
136e0 65 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20  e", "p1", "p2", 
136f0 22 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22  "p3", "p4", "p5"
13700 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20  , "comment" };. 
13710 20 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20         int jj;. 
13720 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b         for(jj=0;
13730 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78   jj<ArraySize(ex
13740 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b  plainCols); jj++
13750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13760 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f   strcmp(sqlite3_
13770 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c  column_name(pSql
13780 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73  ,jj),explainCols
13790 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20  [jj])!=0 ){.    
137a0 20 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65          p->cMode
137b0 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
137c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
137d0 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20  reset(pSql);.   
137e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
137f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13810 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31       nAlloc += 1
13820 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49  00;.      p->aiI
13830 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71  ndent = (int*)sq
13840 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
13850 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c  p->aiIndent, nAl
13860 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  loc*sizeof(int))
13870 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
13880 69 49 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65  iIndent==0 ) she
13890 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
138a0 28 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c  ();.      abYiel
138b0 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  d = (int*)sqlite
138c0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69  3_realloc64(abYi
138d0 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  eld, nAlloc*size
138e0 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
138f0 69 66 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29  if( abYield==0 )
13900 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
13910 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
13920 20 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d    abYield[iOp] =
13930 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
13940 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20  p, azYield);.   
13950 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70   p->aiIndent[iOp
13960 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49  ] = 0;.    p->nI
13970 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a  ndent = iOp+1;..
13980 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61      if( str_in_a
13990 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74  rray(zOp, azNext
139a0 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) ){.      for(i
139b0 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
139c0 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
139d0 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
139e0 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
139f0 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20  ay(zOp, azGoto) 
13a00 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65  && p2op<p->nInde
13a10 6e 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69  nt.     && (abYi
13a20 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c  eld[p2op] || sql
13a30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13a40 70 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b  pSql, 2)).    ){
13a50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
13a60 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
13a70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
13a80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   2;.    }.  }.. 
13a90 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
13aa0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13ab0 61 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69  abYield);.  sqli
13ac0 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
13ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
13ae0 68 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74  he array allocat
13af0 65 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61  ed by explain_da
13b00 74 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f  ta_prepare()..*/
13b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
13b20 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
13b30 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
13b40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13b50 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20  p->aiIndent);.  
13b60 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b  p->aiIndent = 0;
13b70 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20  .  p->nIndent = 
13b80 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  0;.  p->iIndent 
13b90 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  = 0;.}../*.** Di
13ba0 73 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72  sable and restor
13bb0 65 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e  e .wheretrace an
13bc0 64 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73  d .selecttrace s
13bd0 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20  ettings..*/.#if 
13be0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13bf0 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
13c00 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
13c10 45 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65  ELECTTRACE).exte
13c20 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65  rn int sqlite3Se
13c30 6c 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69  lectTrace;.stati
13c40 63 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63  c int savedSelec
13c50 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
13c60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13c70 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
13c80 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
13c90 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78  E_WHERETRACE).ex
13ca0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
13cb0 57 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74  WhereTrace;.stat
13cc0 69 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72  ic int savedWher
13cd0 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73  eTrace;.#endif.s
13ce0 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
13cf0 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
13d00 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20  odes(void){.#if 
13d10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
13d20 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
13d30 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
13d40 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61  ELECTTRACE).  sa
13d50 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d  vedSelectTrace =
13d60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
13d70 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ace;.  sqlite3Se
13d80 6c 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23  lectTrace = 0;.#
13d90 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
13da0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
13db0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
13dc0 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52  E_ENABLE_WHERETR
13dd0 41 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72  ACE).  savedWher
13de0 65 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  eTrace = sqlite3
13df0 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71  WhereTrace;.  sq
13e00 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
13e10 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74  = 0;.#endif.}.st
13e20 61 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72  atic void restor
13e30 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13e40 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
13e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13e60 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13e70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
13e80 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c  LECTTRACE).  sql
13e90 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
13ea0 3d 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  = savedSelectTra
13eb0 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
13ec0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13ed0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
13ee0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
13ef0 45 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ERETRACE).  sqli
13f00 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
13f10 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b  savedWhereTrace;
13f20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13f30 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
13f40 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
13f50 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
13f60 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
13f70 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
13fb0 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
13fc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
13fd0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ff0 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
14000 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
14010 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
14020 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
14030 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
14040 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
14050 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
14060 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
14070 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
14080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
14090 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
140a0 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
140b0 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
140c0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
140d0 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
140e0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
140f0 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
14100 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
14110 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
14120 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
14130 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
14140 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
14150 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
14160 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
14170 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
14180 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
14190 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
141a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
141b0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
141c0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
141d0 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
141e0 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
141f0 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
14200 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
14210 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
14220 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
14230 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
14240 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
14250 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
14260 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
14270 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
14280 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
14290 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
142a0 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
142b0 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
142c0 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
142d0 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
142e0 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
142f0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
14300 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
14310 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
14320 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
14330 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
14340 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
14350 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
14360 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
14370 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
14380 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14390 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
143a0 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
143b0 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
143c0 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
143d0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
143e0 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
143f0 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
14400 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
14410 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
14420 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
14430 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
14440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14450 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
14460 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
14470 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
14480 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
14490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
144a0 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
144b0 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
144c0 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
144d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
144e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
144f0 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
14500 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
14510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14520 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
14530 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
14540 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
14550 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
14560 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
14570 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
14580 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
14590 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
145a0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
145b0 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
145c0 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
145d0 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
145e0 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
145f0 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
14600 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
14610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
14620 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
14630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
14640 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
14650 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
14660 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
14670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14680 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
14690 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
146a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
146b0 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
146c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
146d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
146e0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
146f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14700 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
14710 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
14720 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
14730 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
14740 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
14750 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
14760 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14770 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
14780 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
14790 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
147a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
147b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
147c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
147d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
147e0 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
147f0 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
14800 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
14810 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14820 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
14830 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
14840 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
14850 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
14860 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
14870 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
14880 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
14890 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
148a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
148b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
148c0 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
148d0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
148e0 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
148f0 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
14900 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
14910 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
14920 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
14930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
14940 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
14950 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
14960 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
14970 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
14980 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
14990 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
149a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
149b0 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
149c0 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
149d0 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
149e0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
149f0 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
14a00 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
14a10 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
14a20 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
14a30 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
14a40 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
14a50 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
14a60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
14a70 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
14a80 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
14a90 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
14aa0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
14ab0 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
14ac0 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
14ad0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
14ae0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
14af0 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
14b00 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
14b10 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
14b20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14b30 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
14b40 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
14b50 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
14b60 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
14b70 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
14b80 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
14b90 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
14ba0 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
14bb0 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
14bc0 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
14bd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14be0 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
14bf0 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
14c00 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
14c10 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
14c20 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
14c30 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
14c40 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
14c50 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
14c60 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
14c70 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
14c80 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
14c90 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
14ca0 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
14cb0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
14cc0 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
14cd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14cf0 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
14d00 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
14d10 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
14d20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
14d30 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
14d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
14d50 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
14d60 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
14d70 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
14d80 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
14d90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14da0 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
14db0 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
14dd0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
14de0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
14df0 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
14e00 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
14e10 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
14e20 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
14e30 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
14e40 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
14e50 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
14e60 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
14e70 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
14e80 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
14e90 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
14ea0 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
14eb0 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
14ec0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14ed0 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
14ee0 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
14ef0 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
14f00 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
14f10 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
14f20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
14f30 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
14f40 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
14f50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
14f60 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
14f70 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
14f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
14fa0 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
14fb0 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
14fc0 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
14fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14fe0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14ff0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
15000 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
15010 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
15020 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
15030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
15040 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
15050 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
15060 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15070 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
15080 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
15090 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
150a0 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
150b0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
150c0 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
150d0 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
150e0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
150f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
15100 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
15110 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
15120 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
15130 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
15140 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
15150 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
15160 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
15170 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
15180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15190 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
151a0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
151b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
151c0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
151d0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
151e0 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
151f0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
15200 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15210 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
15220 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
15230 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
15240 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
15250 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
15260 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
15270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
15280 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
15290 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
152a0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
152b0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
152c0 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
152d0 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
152e0 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
152f0 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
15300 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
15310 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15320 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
15330 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
15340 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
15350 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
15360 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
15370 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
15380 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
15390 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
153a0 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
153b0 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
153c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
153d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
153e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
153f0 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
15400 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
15410 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
15420 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
15430 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
15440 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
15450 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
15460 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
15470 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
15480 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
15490 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
154a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
154b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
154c0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
154d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
154e0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
154f0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
15500 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15530 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
15540 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
15550 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15560 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
15570 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
15580 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15590 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
155a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
155b0 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
155c0 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
155d0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
155e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
155f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15600 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
15610 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
15620 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
15630 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
15640 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
15650 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
15660 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
15680 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
15690 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
156a0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
156b0 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
156c0 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
156d0 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
156e0 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
156f0 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
15700 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
15710 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
15720 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
15730 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
15740 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
15750 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
15760 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
15770 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
15780 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
15790 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
157a0 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
157b0 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
157c0 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
157d0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
157e0 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
157f0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
15800 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15820 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
15830 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
15840 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
15870 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
15880 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
158b0 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
158c0 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
158d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
158e0 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
158f0 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
15900 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
15910 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
15920 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
15930 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
15940 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
15950 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
15960 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
15970 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
15980 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
15990 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
159a0 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
159b0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
159c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
159d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
159e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
159f0 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
15a00 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
15a10 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
15a20 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
15a30 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
15a40 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
15a50 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
15a60 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
15a70 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
15a80 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
15a90 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
15aa0 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
15ab0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
15ac0 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
15ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
15ae0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
15af0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
15b00 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
15b10 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
15b20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
15b30 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
15b40 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
15b50 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
15b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
15b80 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
15b90 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
15ba0 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
15bb0 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
15bc0 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
15bd0 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
15be0 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
15bf0 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
15c00 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
15c10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
15c20 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
15c30 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
15c40 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
15c50 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
15c60 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
15c70 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
15c80 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
15c90 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
15ca0 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
15cb0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15cc0 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
15cd0 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
15ce0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
15cf0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
15d00 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
15d10 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
15d20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
15d30 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
15d40 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
15d50 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
15d60 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
15d70 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
15d80 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
15d90 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
15da0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
15db0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
15dc0 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
15dd0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
15de0 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
15df0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
15e00 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
15e10 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
15e20 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
15e30 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
15e40 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41  3_strlike("EXPLA
15e50 49 4e 25 22 2c 7a 53 74 6d 74 53 71 6c 2c 30 29  IN%",zStmtSql,0)
15e60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
15e70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
15e80 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 63  plain;.        c
15e90 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20  har *zEQP;.     
15ea0 20 20 20 69 6e 74 20 74 72 69 67 67 65 72 45 51     int triggerEQ
15eb0 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 64  P = 0;.        d
15ec0 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
15ed0 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20  ce_modes();.    
15ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63      sqlite3_db_c
15ef0 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45  onfig(db, SQLITE
15f00 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
15f10 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69 67  R_EQP, -1, &trig
15f20 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20 20  gerEQP);.       
15f30 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
15f40 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
15f50 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ger ){.         
15f60 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
15f70 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
15f80 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
15f90 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  QP, 1, 0);.     
15fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45 51     }.        zEQ
15fb0 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
15fc0 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45  ntf("EXPLAIN QUE
15fd0 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74  RY PLAN %s", zSt
15fe0 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
15ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16000 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
16010 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
16020 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16040 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
16050 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
16060 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54  pExplain)==SQLIT
16070 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  E_ROW ){.       
16080 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16090 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e  *zEQPLine = (con
160a0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
160b0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
160c0 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20  plain,3);.      
160d0 20 20 20 20 20 20 69 6e 74 20 69 45 71 70 49 64        int iEqpId
160e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
160f0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
16100 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
16110 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d 20  int iParentId = 
16120 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
16130 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b  nt(pExplain, 1);
16140 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
16150 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d   zEQPLine[0]=='-
16160 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28 70  ' ) eqp_render(p
16170 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
16180 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41 72    eqp_append(pAr
16190 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72 65  g, iEqpId, iPare
161a0 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b  ntId, zEQPLine);
161b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
161c0 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65         eqp_rende
161d0 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  r(pArg);.       
161e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
161f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
16200 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lain);.        s
16210 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51 50  qlite3_free(zEQP
16220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16230 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
16240 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20  TOEQP_full ){.  
16250 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20          /* Also 
16260 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f  do an EXPLAIN fo
16270 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f  r ".eqp full" mo
16280 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
16290 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zEQP = sqlite3_m
162a0 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
162b0 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
162c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
162d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
162e0 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
162f0 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
16300 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
16310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16320 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16330 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16340 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
16350 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70    explain_data_p
16360 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 45 78  repare(pArg, pEx
16370 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
16380 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
16390 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45 78  d_stmt(pArg, pEx
163a0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
163b0 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
163c0 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20  _delete(pArg);. 
163d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
163e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
163f0 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
16400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16410 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20  e3_free(zEQP);. 
16420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16430 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
16440 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69 67  QP>=AUTOEQP_trig
16450 67 65 72 20 26 26 20 74 72 69 67 67 65 72 45 51  ger && triggerEQ
16460 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  P==0 ){.        
16470 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16480 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16490 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
164a0 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  EQP, 0, 0);.    
164b0 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70 61        /* Reprepa
164c0 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65 20  re pStmt before 
164d0 72 65 61 63 74 69 76 69 6e 67 20 74 72 61 63 65  reactiving trace
164e0 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20 20   modes */.      
164f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
16500 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
16510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
16520 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
16530 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
16540 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
16550 28 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e 70  ( pArg ) pArg->p
16560 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
16570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16580 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
16590 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
165a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
165b0 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  pArg ){.        
165c0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41  pArg->cMode = pA
165d0 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  rg->mode;.      
165e0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
165f0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
16600 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16610 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
16620 74 6d 74 29 3d 3d 38 0a 20 20 20 20 20 20 20 20  tmt)==8.        
16630 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74     && sqlite3_st
16640 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
16650 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d 3d 30  , zStmtSql,0)==0
16660 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
16670 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
16680 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
16690 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
166a0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
166b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
166c0 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 34 0a 20  ount(pStmt)==4. 
166d0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
166e0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58  ite3_strlike("EX
166f0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
16700 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29 3d  %", zStmtSql,0)=
16710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
16720 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
16730 4d 4f 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20  MODE_EQP;.      
16740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16750 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
16760 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
16770 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
16780 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
16790 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
167a0 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
167b0 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
167c0 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
167d0 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
167e0 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
167f0 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
16800 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
16810 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
16820 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
16830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16840 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
16850 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
16860 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  t);.      explai
16870 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
16880 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72  rg);.      eqp_r
16890 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20 20  ender(pArg);..  
168a0 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73 61      /* print usa
168b0 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61 74  ge stats if stat
168c0 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
168d0 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
168e0 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
168f0 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73     display_stats
16900 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20  (db, pArg, 0);. 
16910 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16920 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e   print loop-coun
16930 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65 64  ters if required
16940 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
16950 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61 6e  rg && pArg->scan
16960 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20  statsOn ){.     
16970 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73     display_scans
16980 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b 0a  tats(db, pArg);.
16990 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
169a0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 73  * Finalize the s
169b0 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65 78  tatement just ex
169c0 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73 20  ecuted. If this 
169d0 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20 20  fails, save a.  
169e0 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
169f0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
16a00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  . Otherwise, set
16a10 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74   zSql to point t
16a20 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e  o the.      ** n
16a30 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ext statement to
16a40 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20   execute. */.   
16a50 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
16a60 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
16a70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72  SQLITE_NOMEM ) r
16a90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
16aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   ){.        zSql
16ac0 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
16ad0 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
16ae0 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
16af0 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  zSql++;.      }e
16b00 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73 67  lse if( pzErrMsg
16b10 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
16b20 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72  rrMsg = save_err
16b30 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20  _msg(db);.      
16b40 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65 61  }..      /* clea
16b50 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61 6e  r saved stmt han
16b60 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dle */.      if(
16b70 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
16b80 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e   pArg->pStmt = N
16b90 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
16ba0 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68   }.  } /* end wh
16bb0 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  ile */..  return
16bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16bd0 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72 65  lease memory pre
16be0 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
16bf0 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e  d by tableColumn
16c00 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  List()..*/.stati
16c10 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d  c void freeColum
16c20 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a 43  nList(char **azC
16c30 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
16c40 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
16c50 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
16c60 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b  ite3_free(azCol[
16c70 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a  i]);.  }.  /* az
16c80 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61 74  Col[0] is a stat
16c90 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73  ic string */.  s
16ca0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
16cb0 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  l);.}../*.** Ret
16cc0 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 6f  urn a list of po
16cd0 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
16ce0 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
16cf0 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20  names of all.** 
16d00 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
16d10 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65 6d   zTab.   The mem
16d20 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
16d30 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69 63  names is dynamic
16d40 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
16d50 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  d and must be re
16d60 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63 61  leased by the ca
16d70 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75 62  ller using a sub
16d80 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
16d90 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  to freeColumnLis
16da0 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t()..**.** The a
16db0 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73  zCol[0] entry is
16dc0 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20   usually NULL.  
16dd0 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61 62  However, if zTab
16de0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77 69   contains a rowi
16df0 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74 20  d.** value that 
16e00 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65 73  needs to be pres
16e10 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f  erved, then azCo
16e20 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20 69  l[0] is filled i
16e30 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61  n with the.** na
16e40 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  me of the rowid 
16e50 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  column..**.** Th
16e60 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72 20  e first regular 
16e70 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
16e80 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e  ble is azCol[1].
16e90 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74 65    The list is te
16ea0 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61  rminated.** by a
16eb0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a 43  n entry with azC
16ec0 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61  ol[i]==0..*/.sta
16ed0 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c 65  tic char **table
16ee0 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c  ColumnList(Shell
16ef0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
16f00 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63  char *zTab){.  c
16f10 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b  har **azCol = 0;
16f20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16f30 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *pStmt;.  char *
16f40 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  zSql;.  int nCol
16f50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c   = 0;.  int nAll
16f60 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  oc = 0;.  int nP
16f70 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  K = 0;       /* 
16f80 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41 52  Number of PRIMAR
16f90 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65  Y KEY columns se
16fa0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50  en */.  int isIP
16fb0 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  K = 0;     /* Tr
16fc0 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41 52  ue if one PRIMAR
16fd0 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20  Y KEY column of 
16fe0 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a  type INTEGER */.
16ff0 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52 6f    int preserveRo
17000 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c  wid = ShellHasFl
17010 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73  ag(p, SHFLG_Pres
17020 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e  erveRowid);.  in
17030 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20  t rc;..  zSql = 
17040 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17050 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e  "PRAGMA table_in
17060 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20  fo=%Q", zTab);. 
17070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17080 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
17090 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
170a0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
170b0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66  free(zSql);.  if
170c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
170d0 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
170e0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
170f0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
17100 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f   if( nCol>=nAllo
17110 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  c-2 ){.      nAl
17120 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b  loc = nAlloc*2 +
17130 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20   nCol + 10;.    
17140 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65    azCol = sqlite
17150 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c  3_realloc(azCol,
17160 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61   nAlloc*sizeof(a
17170 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20  zCol[0]));.     
17180 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
17190 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d  shell_out_of_mem
171a0 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ory();.    }.   
171b0 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d   azCol[++nCol] =
171c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
171d0 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
171e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
171f0 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73  , 1));.    if( s
17200 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17210 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20  t(pStmt, 5) ){. 
17220 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20       nPK++;.    
17230 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20    if( nPK==1.   
17240 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
17250 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  tricmp((const ch
17260 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
17270 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
17280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17290 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 54              "INT
172a0 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20  EGER")==0.      
172b0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  ){.        isIPK
172c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
172d0 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b  e{.        isIPK
172e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
172f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
17300 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17310 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d  );.  if( azCol==
17320 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17330 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  azCol[0] = 0;.  
17340 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20  azCol[nCol+1] = 
17350 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63  0;..  /* The dec
17360 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72  ision of whether
17370 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20   or not a rowid 
17380 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20  really needs to 
17390 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a  be preserved.  *
173a0 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65  * is tricky.  We
173b0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70   never need to p
173c0 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64 20  reserve a rowid 
173d0 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
173e0 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  WID table.  ** o
173f0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61  r a table with a
17400 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
17410 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75  Y KEY.  We are u
17420 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76  nable to preserv
17430 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e  e.  ** rowids on
17440 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74 68   tables where th
17450 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63  e rowid is inacc
17460 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65 20  essible because 
17470 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a  there are other.
17480 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
17490 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
174a0 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
174b0 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20  _", and "oid".. 
174c0 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72   */.  if( preser
174d0 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b  veRowid && isIPK
174e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
174f0 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b  single PRIMARY K
17500 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74  EY column with t
17510 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73 20  ype INTEGER was 
17520 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20  seen, then it.  
17530 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e    ** might be an
17540 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52   alise for the R
17550 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69  OWID.  But it mi
17560 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49  ght also be a WI
17570 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
17580 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e  ** table or a IN
17590 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
175a0 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e  Y DESC column, n
175b0 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
175c0 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44  are.    ** ROWID
175d0 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69   aliases.  To di
175e0 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65 20  stinguish these 
175f0 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20  cases, check to 
17600 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  see if.    ** th
17610 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e  ere is a "pk" en
17620 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69  try in "PRAGMA i
17630 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65  ndex_list".  The
17640 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  re will be.    *
17650 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20  * no "pk" index 
17660 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  if the PRIMARY K
17670 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  EY really is an 
17680 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f  alias for the RO
17690 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  WID..    */.    
176a0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
176b0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31  printf("SELECT 1
176c0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64   FROM pragma_ind
176d0 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20  ex_list(%Q)".   
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
17700 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54  origin='pk'", zT
17710 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ab);.    rc = sq
17720 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
17730 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
17740 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
17750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17760 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
17770 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f   ){.      freeCo
17780 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
17790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
177a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
177b0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
177c0 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
177d0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
177e0 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52 6f  ;.    preserveRo
177f0 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  wid = rc==SQLITE
17800 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _ROW;.  }.  if( 
17810 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b  preserveRowid ){
17820 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65  .    /* Only pre
17830 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64 20  serve the rowid 
17840 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61  if we can find a
17850 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72   name to use for
17860 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69   the.    ** rowi
17870 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  d */.    static 
17880 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20  char *azRowid[] 
17890 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72  = { "rowid", "_r
178a0 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b  owid_", "oid" };
178b0 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
178c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
178d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   j++){.      for
178e0 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69  (i=1; i<=nCol; i
178f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17900 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
17910 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f  (azRowid[j],azCo
17920 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b  l[i])==0 ) break
17930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17940 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20  if( i>nCol ){.  
17950 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
17960 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
17970 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20  that azRowid[j] 
17980 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
17990 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a  of any.        *
179a0 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d  * ordinary colum
179b0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  n in the table. 
179c0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a 52   Verify that azR
179d0 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c  owid[j] is a val
179e0 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61  id.        ** na
179f0 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  me for the rowid
17a00 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69   before adding i
17a10 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20  t to azCol[0].  
17a20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
17a30 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
17a40 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c  will fail this l
17a50 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20  ast check */.   
17a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17a70 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
17a80 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c  etadata(p->db,0,
17a90 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c  zTab,azRowid[j],
17aa0 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  0,0,0,0,0);.    
17ab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17ac0 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d  TE_OK ) azCol[0]
17ad0 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20   = azRowid[j];. 
17ae0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17af0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17b00 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a    return azCol;.
17b10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20  }../*.** Toggle 
17b20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  the reverse_unor
17b30 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65  dered_selects se
17b40 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tting..*/.static
17b50 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65   void toggleSele
17b60 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20  ctOrder(sqlite3 
17b70 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *db){.  sqlite3_
17b80 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
17b90 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20  .  int iSetting 
17ba0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d  = 0;.  char zStm
17bb0 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  t[100];.  sqlite
17bc0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
17bd0 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73 65   "PRAGMA reverse
17be0 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
17bf0 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  ts", -1, &pStmt,
17c00 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
17c10 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17c20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17c30 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c    iSetting = sql
17c40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17c50 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  pStmt, 0);.  }. 
17c60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17c70 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69  e(pStmt);.  sqli
17c80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
17c90 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d  eof(zStmt), zStm
17ca0 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d  t,.       "PRAGM
17cb0 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  A reverse_unorde
17cc0 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22  red_selects(%d)"
17cd0 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20  , !iSetting);.  
17ce0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
17cf0 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29   zStmt, 0, 0, 0)
17d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17d10 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  is a different c
17d20 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
17d30 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67  used for dumping
17d40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17d50 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65 69  * Each row recei
17d60 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c  ved by this call
17d70 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
17d80 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a   a table name,.*
17d90 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70 65  * the table type
17da0 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61   ("index" or "ta
17db0 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f  ble") and SQL to
17dc0 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
17dd0 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
17de0 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20  ne should print 
17df0 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74 20  text sufficient 
17e00 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
17e10 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
17e20 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61   int dump_callba
17e30 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
17e40 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
17e50 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
17e60 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20  NotUsed){.  int 
17e70 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
17e80 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73   *zTable;.  cons
17e90 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
17ea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
17eb0 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  l;.  ShellState 
17ec0 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
17ed0 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53   *)pArg;..  UNUS
17ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e  ED_PARAMETER(azN
17ef0 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  otUsed);.  if( n
17f00 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d  Arg!=3 || azArg=
17f10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17f20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
17f30 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a  0];.  zType = az
17f40 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d  Arg[1];.  zSql =
17f50 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66   azArg[2];..  if
17f60 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c  ( strcmp(zTable,
17f70 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
17f80 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  e")==0 ){.    ra
17f90 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
17fa0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71   "DELETE FROM sq
17fb0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e  lite_sequence;\n
17fc0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
17fd0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
17fe0 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20  "sqlite_stat?", 
17ff0 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20  zTable)==0 ){.  
18000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
18010 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71  out, "ANALYZE sq
18020 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29  lite_master;\n")
18030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
18040 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  rncmp(zTable, "s
18050 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
18060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
18070 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
18080 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54  cmp(zSql, "CREAT
18090 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22  E VIRTUAL TABLE"
180a0 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 20)==0 ){.    
180b0 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20  char *zIns;.    
180c0 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65  if( !p->writable
180d0 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
180e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
180f0 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61  t, "PRAGMA writa
18100 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e  ble_schema=ON;\n
18110 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
18120 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b  tableSchema = 1;
18130 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20  .    }.    zIns 
18140 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
18150 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  f(.       "INSER
18160 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
18170 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74  ster(type,name,t
18180 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65  bl_name,rootpage
18190 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56  ,sql)".       "V
181a0 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25  ALUES('table','%
181b0 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b  q','%q',0,'%q');
181c0 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ",.       zTable
181d0 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b  , zTable, zSql);
181e0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
181f0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
18200 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69   zIns);.    sqli
18210 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a  te3_free(zIns);.
18220 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18230 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74  }else{.    print
18240 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
18250 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b  t, zSql, ";\n");
18260 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63  .  }..  if( strc
18270 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65  mp(zType, "table
18280 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  ")==0 ){.    She
18290 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a  llText sSelect;.
182a0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54      ShellText sT
182b0 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  able;.    char *
182c0 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  *azCol;.    int 
182d0 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76  i;.    char *sav
182e0 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
182f0 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a   int savedMode;.
18300 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62  .    azCol = tab
18310 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20  leColumnList(p, 
18320 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
18330 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20   azCol==0 ){.   
18340 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20     p->nErr++;.  
18350 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61    }..    /* Alwa
18370 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61 62  ys quote the tab
18380 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66  le name, even if
18390 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20 62   it appears to b
183a0 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20  e pure ascii,.  
183b0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20    ** in case it 
183c0 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78  is a keyword. Ex
183d0 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  :  INSERT INTO "
183e0 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20  table" ... */.  
183f0 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61 62    initText(&sTab
18400 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  le);.    appendT
18410 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61  ext(&sTable, zTa
18420 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
18430 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20  Table));.    /* 
18440 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74 68  If preserving th
18450 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63  e rowid, add a c
18460 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72  olumn list after
18470 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
18480 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72  .    ** In other
18490 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54   words:  "INSERT
184a0 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c   INTO tab(rowid,
184b0 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45  a,b,c,...) VALUE
184c0 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69  S(...)".    ** i
184d0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
184e0 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ual "INSERT INTO
184f0 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29   tab VALUES(...)
18500 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
18510 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20  ( azCol[0] ){.  
18520 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
18530 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b  sTable, "(", 0);
18540 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18550 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
18560 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  [0], 0);.      f
18570 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d  or(i=1; azCol[i]
18580 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
18590 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
185a0 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  le, ",", 0);.   
185b0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
185c0 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69  &sTable, azCol[i
185d0 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43  ], quoteChar(azC
185e0 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d  ol[i]));.      }
185f0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
18600 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20  t(&sTable, ")", 
18610 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
18620 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f  * Build an appro
18630 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73 74  priate SELECT st
18640 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
18650 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63 74  nitText(&sSelect
18660 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
18670 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
18680 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69  ECT ", 0);.    i
18690 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
186a0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
186b0 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
186c0 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70  0], 0);.      ap
186d0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
186e0 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  t, ",", 0);.    
186f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  }.    for(i=1; a
18700 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zCol[i]; i++){. 
18710 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
18720 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b  &sSelect, azCol[
18730 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
18740 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
18750 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29  if( azCol[i+1] )
18760 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18770 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
18780 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ,", 0);.      }.
18790 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f      }.    freeCo
187a0 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b  lumnList(azCol);
187b0 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
187c0 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d  &sSelect, " FROM
187d0 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65   ", 0);.    appe
187e0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
187f0 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68   zTable, quoteCh
18800 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20  ar(zTable));..  
18810 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65    savedDestTable
18820 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65   = p->zDestTable
18830 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20  ;.    savedMode 
18840 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70  = p->mode;.    p
18850 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73  ->zDestTable = s
18860 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e  Table.z;.    p->
18870 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20  mode = p->cMode 
18880 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20  = MODE_Insert;. 
18890 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78     rc = shell_ex
188a0 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ec(p, sSelect.z,
188b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63   0);.    if( (rc
188c0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
188d0 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ORRUPT ){.      
188e0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
188f0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18900 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18910 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20  ****/\n");.     
18920 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18930 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  er(p->db);.     
18940 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73   shell_exec(p, s
18950 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20  Select.z, 0);.  
18960 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
18970 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
18980 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
18990 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
189a0 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
189b0 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
189c0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
189d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
189e0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
189f0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
18a00 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
18a10 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
18a20 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
18a30 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
18a40 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
18a50 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
18a60 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
18a70 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
18a80 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
18a90 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
18aa0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
18ab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
18ac0 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
18ad0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
18ae0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
18af0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
18b00 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
18b10 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
18b20 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
18b30 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
18b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
18b50 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
18b60 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
18b70 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
18b80 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
18b90 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
18ba0 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18bb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18bc0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
18bd0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
18be0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
18bf0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
18c00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
18c10 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
18c20 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
18c30 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
18c40 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
18c50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
18c60 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
18c70 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
18c80 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
18c90 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
18ca0 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
18cb0 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
18cc0 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
18cd0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
18ce0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
18cf0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18d00 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
18d10 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
18d20 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
18d30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18d40 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
18d50 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
18d60 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
18d70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18d80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
18d90 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
18da0 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
18db0 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
18dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18dd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18de0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
18df0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
18e00 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
18e10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
18e30 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73 2e  f help messages.
18e40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20  .**.** The help 
18e50 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69 6e  text for each in
18e60 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64  dividual command
18e70 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 6c   begins with a l
18e80 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73 0a  ine that starts.
18e90 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53 75  ** with ".".  Su
18ea0 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20 61  bsequent lines a
18eb0 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20  re supplimental 
18ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
18ed0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
18ee0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61   two or more spa
18ef0 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ces between the 
18f00 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61  end of the comma
18f10 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74  nd and the.** st
18f20 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72  art of the descr
18f30 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20 74  iption of what t
18f40 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73  hat command does
18f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
18f60 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b  t char *(azHelp[
18f70 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e  ]) = {.#if defin
18f80 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ed(SQLITE_HAVE_Z
18f90 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65 64  LIB) && !defined
18fa0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
18fb0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61  TUALTABLE).  ".a
18fc0 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20 20  rchive ...      
18fd0 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51         Manage SQ
18fe0 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20 22  L archives",.  "
18ff0 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20     Each command 
19000 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
19010 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  y one of the fol
19020 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22  lowing options:"
19030 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d  ,.  "     -c, --
19040 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20 20  create          
19050 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
19060 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  w archive",.  " 
19070 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65      -u, --update
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
19090 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c  pdate or add fil
190a0 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  es to an existin
190b0 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  g archive",.  " 
190c0 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20      -t, --list  
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
190e0 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
190f0 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
19100 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74 20    -x, --extract 
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 74               Ext
19120 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20  ract files from 
19130 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20  archive",.  "   
19140 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e  Optional argumen
19150 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 76  ts:",.  "     -v
19160 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20  , --verbose     
19170 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 65           Print e
19180 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20  ach filename as 
19190 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64 22  it is processed"
191a0 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49 4c  ,.  "     -f FIL
191b0 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20  E, --file FILE  
191c0 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20       Operate on 
191d0 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65  archive FILE (de
191e0 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74  fault is current
191f0 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20 2d   db)",.  "     -
19200 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64  a FILE, --append
19210 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74   FILE     Operat
19220 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64  e on FILE opened
19230 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76   using the apndv
19240 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20 20  fs VFS",.  "    
19250 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65 63   -C DIR, --direc
19260 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61 6e  tory DIR    Chan
19270 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20  ge to directory 
19280 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74 72  DIR to read/extr
19290 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22 20  act files",.  " 
192a0 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75 6e      -n, --dryrun
192b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
192c0 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61 74  how the SQL that
192d0 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63 75   would have occu
192e0 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78 61  rred",.  "   Exa
192f0 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20 20  mples:",.  "    
19300 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65   .ar -cf archive
19310 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23 20  .sar foo bar  # 
19320 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e 73  Create archive.s
19330 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66 6f  ar from files fo
19340 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22 20  o and bar",.  " 
19350 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63 68      .ar -tf arch
19360 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
19370 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20   # List members 
19380 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22 2c  of archive.sar",
19390 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78 76  .  "     .ar -xv
193a0 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
193b0 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65 6c        # Verbosel
193c0 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73 20  y extract files 
193d0 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61 72  from archive.sar
193e0 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c 73  ",.  "   See als
193f0 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68 74  o:",.  "      ht
19400 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f  tp://sqlite.org/
19410 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f 61  cli.html#sqlar_a
19420 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22 2c  rchive_support",
19430 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
19440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
19450 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75  ORIZATION.  ".au
19460 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20  th ON|OFF       
19470 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
19480 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 22  rizer callbacks"
19490 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ,.#endif.  ".bac
194a0 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
194b0 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28       Backup DB (
194c0 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
194d0 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  ) to FILE",.  " 
194e0 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20        --append  
194f0 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
19500 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20 20  e appendvfs",.  
19510 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20  ".bail on|off   
19520 20 20 20 20 20 20 20 20 20 20 53 74 6f 70 20 61            Stop a
19530 66 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20  fter hitting an 
19540 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20  error.  Default 
19550 4f 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79  OFF",.  ".binary
19560 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
19570 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75    Turn binary ou
19580 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  tput on or off. 
19590 20 44 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20   Default OFF",. 
195a0 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20   ".cd DIRECTORY 
195b0 20 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67             Chang
195c0 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69  e the working di
195d0 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43  rectory to DIREC
195e0 54 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67  TORY",.  ".chang
195f0 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  es on|off       
19600 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f     Show number o
19610 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62  f rows changed b
19620 79 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63  y SQL",.  ".chec
19630 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20  k GLOB          
19640 20 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70      Fail if outp
19650 75 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61  ut since .testca
19660 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  se does not matc
19670 68 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45  h",.  ".clone NE
19680 57 44 42 20 20 20 20 20 20 20 20 20 20 20 20 20  WDB             
19690 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20  Clone data into 
196a0 4e 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65  NEWDB from the e
196b0 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
196c0 22 2c 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73  ",.  ".databases
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
196e0 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69  ist names and fi
196f0 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20  les of attached 
19700 64 61 74 61 62 61 73 65 73 22 2c 0a 20 20 22 2e  databases",.  ".
19710 64 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76  dbconfig ?op? ?v
19720 61 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f 72 20  al?     List or 
19730 63 68 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64  change sqlite3_d
19740 62 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f  b_config() optio
19750 6e 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20  ns",.  ".dbinfo 
19760 3f 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 20  ?DB?            
19770 20 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66   Show status inf
19780 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
19790 68 65 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  he database",.  
197a0 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e  ".dump ?TABLE? .
197b0 2e 2e 20 20 20 20 20 20 20 20 52 65 6e 64 65 72  ..        Render
197c0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
197d0 6e 74 65 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20  ntent as SQL",. 
197e0 20 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a   "   Options:",.
197f0 20 20 22 20 20 20 20 20 2d 2d 70 72 65 73 65 72    "     --preser
19800 76 65 2d 72 6f 77 69 64 73 20 20 20 20 20 20 49  ve-rowids      I
19810 6e 63 6c 75 64 65 20 52 4f 57 49 44 20 76 61 6c  nclude ROWID val
19820 75 65 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ues in the outpu
19830 74 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65  t",.  "     --ne
19840 77 6c 69 6e 65 73 20 20 20 20 20 20 20 20 20 20  wlines          
19850 20 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70     Allow unescap
19860 65 64 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61  ed newline chara
19870 63 74 65 72 73 20 69 6e 20 6f 75 74 70 75 74 22  cters in output"
19880 2c 0a 20 20 22 20 20 20 54 41 42 4c 45 20 69 73  ,.  "   TABLE is
19890 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f   LIKE pattern fo
198a0 72 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20  r the tables to 
198b0 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20  dump",.  ".echo 
198c0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
198d0 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20     Turn command 
198e0 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  echo on or off",
198f0 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c  .  ".eqp on|off|
19900 66 75 6c 6c 20 20 20 20 20 20 20 20 20 45 6e 61  full         Ena
19910 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61  ble or disable a
19920 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e  utomatic EXPLAIN
19930 20 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20   QUERY PLAN",.  
19940 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20  ".excel         
19950 20 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61            Displa
19960 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  y the output of 
19970 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20  next command in 
19980 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a  a spreadsheet",.
19990 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20    ".exit ?CODE? 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
199b0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69   this program wi
199c0 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43  th return-code C
199d0 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74  ODE",.  ".expert
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20    EXPERIMENTAL. 
19a00 53 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20  Suggest indexes 
19a10 66 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75  for specified qu
19a20 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75  eries",./* Becau
19a30 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  se explain mode 
19a40 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74  comes on automat
19a50 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20  ically now, the 
19a60 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a  ".explain" mode.
19a70 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
19a80 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65  om the help scre
19a90 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c  en.  It is still
19aa0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c   supported for l
19ab0 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a  egacy, however *
19ac0 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f  /./*".explain ?o
19ad0 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75  n|off|auto?   Tu
19ae0 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  rn EXPLAIN outpu
19af0 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66  t mode on or off
19b00 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63   or to automatic
19b10 22 2c 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68  ",*/.  ".fullsch
19b20 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20  ema ?--indent?  
19b30 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64   Show schema and
19b40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19b50 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c  sqlite_stat tabl
19b60 65 73 22 2c 0a 20 20 22 2e 68 65 61 64 65 72 73  es",.  ".headers
19b70 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
19b80 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
19b90 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
19ba0 66 66 22 2c 0a 20 20 22 2e 68 65 6c 70 20 3f 2d  ff",.  ".help ?-
19bb0 61 6c 6c 3f 20 3f 50 41 54 54 45 52 4e 3f 20 20  all? ?PATTERN?  
19bc0 20 53 68 6f 77 20 68 65 6c 70 20 74 65 78 74 20   Show help text 
19bd0 66 6f 72 20 50 41 54 54 45 52 4e 22 2c 0a 20 20  for PATTERN",.  
19be0 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
19bf0 42 4c 45 20 20 20 20 20 20 20 49 6d 70 6f 72 74  BLE       Import
19c00 20 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20   data from FILE 
19c10 69 6e 74 6f 20 54 41 42 4c 45 22 2c 0a 23 69 66  into TABLE",.#if
19c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19c30 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20  _TEST_CONTROL.  
19c40 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58  ".imposter INDEX
19c50 20 54 41 42 4c 45 20 20 20 20 43 72 65 61 74 65   TABLE    Create
19c60 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
19c70 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49  TABLE on index I
19c80 4e 44 45 58 22 2c 0a 23 65 6e 64 69 66 0a 20 20  NDEX",.#endif.  
19c90 22 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45  ".indexes ?TABLE
19ca0 3f 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e  ?         Show n
19cb0 61 6d 65 73 20 6f 66 20 69 6e 64 65 78 65 73 22  ames of indexes"
19cc0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ,.  "           
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 49 66 20 54 41 42 4c 45 20 69 73 20 73 70 65 63  If TABLE is spec
19cf0 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77  ified, only show
19d00 20 69 6e 64 65 78 65 73 20 66 6f 72 22 2c 0a 20   indexes for",. 
19d10 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
19d30 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 54 41 42  les matching TAB
19d40 4c 45 20 75 73 69 6e 67 20 74 68 65 20 4c 49 4b  LE using the LIK
19d50 45 20 6f 70 65 72 61 74 6f 72 2e 22 2c 0a 23 69  E operator.",.#i
19d60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19d70 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e 69  LE_IOTRACE.  ".i
19d80 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20 20  otrace FILE     
19d90 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f         Enable I/
19da0 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67  O diagnostic log
19db0 67 69 6e 67 20 74 6f 20 46 49 4c 45 22 2c 0a 23  ging to FILE",.#
19dc0 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
19dd0 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
19de0 20 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61    Display or cha
19df0 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
19e00 20 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54   an SQLITE_LIMIT
19e10 22 2c 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49  ",.  ".lint OPTI
19e20 4f 4e 53 20 20 20 20 20 20 20 20 20 20 20 20 52  ONS            R
19e30 65 70 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20  eport potential 
19e40 73 63 68 65 6d 61 20 69 73 73 75 65 73 2e 22 2c  schema issues.",
19e50 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e 73  .  "     Options
19e60 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 66  :",.  "        f
19e70 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20 20  key-indexes     
19e80 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f 72  Find missing for
19e90 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65 73  eign key indexes
19ea0 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ",.#ifndef SQLIT
19eb0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
19ec0 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46  NSION.  ".load F
19ed0 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20 20 20  ILE ?ENTRY?     
19ee0 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73    Load an extens
19ef0 69 6f 6e 20 6c 69 62 72 61 72 79 22 2c 0a 23 65  ion library",.#e
19f00 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49 4c  ndif.  ".log FIL
19f10 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  E|off           
19f20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e   Turn logging on
19f30 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63   or off.  FILE c
19f40 61 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64  an be stderr/std
19f50 6f 75 74 22 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d  out",.  ".mode M
19f60 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  ODE ?TABLE?     
19f70 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64    Set output mod
19f80 65 22 2c 0a 20 20 22 20 20 20 4d 4f 44 45 20 69  e",.  "   MODE i
19f90 73 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 22 20  s one of:",.  " 
19fa0 20 20 20 20 61 73 63 69 69 20 20 20 20 43 6f 6c      ascii    Col
19fb0 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d 69  umns/rows delimi
19fc0 74 65 64 20 62 79 20 30 78 31 46 20 61 6e 64 20  ted by 0x1F and 
19fd0 30 78 31 45 22 2c 0a 20 20 22 20 20 20 20 20 63  0x1E",.  "     c
19fe0 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
19ff0 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c  parated values",
1a000 0a 20 20 22 20 20 20 20 20 63 6f 6c 75 6d 6e 20  .  "     column 
1a010 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63    Left-aligned c
1a020 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77  olumns.  (See .w
1a030 69 64 74 68 29 22 2c 0a 20 20 22 20 20 20 20 20  idth)",.  "     
1a040 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74  html     HTML <t
1a050 61 62 6c 65 3e 20 63 6f 64 65 22 2c 0a 20 20 22  able> code",.  "
1a060 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
1a070 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
1a080 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 22 2c 0a  nts for TABLE",.
1a090 20 20 22 20 20 20 20 20 6c 69 6e 65 20 20 20 20    "     line    
1a0a0 20 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c   One value per l
1a0b0 69 6e 65 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  ine",.  "     li
1a0c0 73 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65  st     Values de
1a0d0 6c 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22  limited by \"|\"
1a0e0 22 2c 0a 20 20 22 20 20 20 20 20 71 75 6f 74 65  ",.  "     quote
1a0f0 20 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65      Escape answe
1a100 72 73 20 61 73 20 66 6f 72 20 53 51 4c 22 2c 0a  rs as for SQL",.
1a110 20 20 22 20 20 20 20 20 74 61 62 73 20 20 20 20    "     tabs    
1a120 20 54 61 62 2d 73 65 70 61 72 61 74 65 64 20 76   Tab-separated v
1a130 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20  alues",.  "     
1a140 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73  tcl      TCL lis
1a150 74 20 65 6c 65 6d 65 6e 74 73 22 2c 0a 20 20 22  t elements",.  "
1a160 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
1a170 47 20 20 20 20 20 20 20 20 55 73 65 20 53 54 52  G        Use STR
1a180 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ING in place of 
1a190 4e 55 4c 4c 20 76 61 6c 75 65 73 22 2c 0a 20 20  NULL values",.  
1a1a0 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46 49  ".once (-e|-x|FI
1a1b0 4c 45 29 20 20 20 20 20 20 20 4f 75 74 70 75 74  LE)       Output
1a1c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
1a1d0 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
1a1e0 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20  o FILE",.  "    
1a1f0 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20   If FILE begins 
1a200 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70  with '|' then op
1a210 65 6e 20 61 73 20 61 20 70 69 70 65 22 2c 0a 20  en as a pipe",. 
1a220 20 22 20 20 20 20 20 4f 74 68 65 72 20 6f 70 74   "     Other opt
1a230 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1a240 20 20 2d 65 20 20 20 20 49 6e 76 6f 6b 65 20 73    -e    Invoke s
1a250 79 73 74 65 6d 20 74 65 78 74 20 65 64 69 74 6f  ystem text edito
1a260 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 78  r",.  "       -x
1a270 20 20 20 20 4f 70 65 6e 20 69 6e 20 61 20 73 70      Open in a sp
1a280 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e  readsheet",.  ".
1a290 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f  open ?OPTIONS? ?
1a2a0 46 49 4c 45 3f 20 20 20 43 6c 6f 73 65 20 65 78  FILE?   Close ex
1a2b0 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
1a2c0 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 22  and reopen FILE"
1a2d0 2c 0a 20 20 22 20 20 20 20 20 4f 70 74 69 6f 6e  ,.  "     Option
1a2e0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  s:",.  "        
1a2f0 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20 55 73  --append      Us
1a300 65 20 61 70 70 65 6e 64 76 66 73 20 74 6f 20 61  e appendvfs to a
1a310 70 70 65 6e 64 20 64 61 74 61 62 61 73 65 20 74  ppend database t
1a320 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 46 49 4c  o the end of FIL
1a330 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  E",.  "        -
1a340 2d 6e 65 77 20 20 20 20 20 20 20 20 20 49 6e 69  -new         Ini
1a350 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74 6f 20  tialize FILE to 
1a360 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  an empty databas
1a370 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d  e",.  "        -
1a380 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 4f 70 65  -readonly    Ope
1a390 6e 20 46 49 4c 45 20 72 65 61 64 6f 6e 6c 79 22  n FILE readonly"
1a3a0 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 7a  ,.  "        --z
1a3b0 69 70 20 20 20 20 20 20 20 20 20 46 49 4c 45 20  ip         FILE 
1a3c0 69 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65  is a ZIP archive
1a3d0 22 2c 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46  ",.  ".output ?F
1a3e0 49 4c 45 3f 20 20 20 20 20 20 20 20 20 20 20 53  ILE?           S
1a3f0 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49  end output to FI
1a400 4c 45 20 6f 72 20 73 74 64 6f 75 74 20 69 66 20  LE or stdout if 
1a410 46 49 4c 45 20 69 73 20 6f 6d 69 74 74 65 64 22  FILE is omitted"
1a420 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46 49 4c  ,.  "     If FIL
1a430 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 27 7c  E begins with '|
1a440 27 20 74 68 65 6e 20 6f 70 65 6e 20 69 74 20 61  ' then open it a
1a450 73 20 61 20 70 69 70 65 2e 22 2c 0a 20 20 22 2e  s a pipe.",.  ".
1a460 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
1a470 20 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69          Print li
1a480 74 65 72 61 6c 20 53 54 52 49 4e 47 22 2c 0a 20  teral STRING",. 
1a490 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
1a4a0 4f 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61  ONTINUE    Repla
1a4b0 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
1a4c0 70 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75  prompts",.  ".qu
1a4d0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1a4e0 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
1a4f0 70 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65  program",.  ".re
1a500 61 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ad FILE         
1a510 20 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74        Read input
1a520 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22   from FILE",.  "
1a530 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
1a540 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f 72 65  LE       Restore
1a550 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
1a560 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
1a570 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20  ) from FILE",.  
1a580 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20  ".save FILE     
1a590 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1a5a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1a5b0 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20  se into FILE",. 
1a5c0 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
1a5d0 6f 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20  off        Turn 
1a5e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
1a5f0 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63  nstatus() metric
1a600 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  s on or off",.  
1a610 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52  ".schema ?PATTER
1a620 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74  N?        Show t
1a630 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
1a640 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41  ents matching PA
1a650 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20  TTERN",.  "     
1a660 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1a670 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20         --indent 
1a680 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 74             Try t
1a690 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74  o pretty-print t
1a6a0 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e  he schema",.  ".
1a6b0 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e  selftest ?OPTION
1a6c0 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65 73 74  S?      Run test
1a6d0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
1a6e0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22   SELFTEST table"
1a6f0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1a700 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  :",.  "       --
1a710 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
1a720 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
1a730 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c  SELFTEST table",
1a740 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20 20 20  .  "       -v   
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c  Verbose output",
1a770 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43  .  ".separator C
1a780 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61  OL ?ROW?     Cha
1a790 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  nge the column a
1a7a0 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  nd row separator
1a7b0 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s",.#if defined(
1a7c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1a7d0 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
1a7e0 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e  on ?NAME? CMD ..
1a7f0 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e  .  Create or con
1a800 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a  trol sessions",.
1a810 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64    "   Subcommand
1a820 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74  s:",.  "     att
1a830 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
1a840 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
1a850 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61  LE",.  "     cha
1a860 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20  ngeset FILE     
1a870 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68        Write a ch
1a880 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c  angeset into FIL
1a890 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73  E",.  "     clos
1a8a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a8b0 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73       Close one s
1a8c0 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20  ession",.  "    
1a8d0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1a8e0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1a8f0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1a900 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20  e bit",.  "     
1a910 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20  filter GLOB...  
1a920 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20           Reject 
1a930 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1a940 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20  GLOBs",.  "     
1a950 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
1a960 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
1a970 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
1a980 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22  ect status",.  "
1a990 20 20 20 20 20 69 73 65 6d 70 74 79 20 20 20 20       isempty    
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
1a9b0 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
1a9c0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
1a9d0 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20  ",.  "     list 
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74      List current
1aa00 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20  ly open session 
1aa10 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20  names",.  "     
1aa20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20  open DB NAME    
1aa30 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20           Open a 
1aa40 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44  new session on D
1aa50 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63  B",.  "     patc
1aa60 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
1aa70 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
1aa80 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22  chset into FILE"
1aa90 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45  ,.  "   If ?NAME
1aaa0 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
1aab0 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
1aac0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
1aad0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1aae0 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20  a3sum ...       
1aaf0 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20        Compute a 
1ab00 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
1ab10 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a  abase content",.
1ab20 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22    "    Options:"
1ab30 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68  ,.  "      --sch
1ab40 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20  ema             
1ab50 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
1ab60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1ab70 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  le",.  "      --
1ab80 73 68 61 33 2d 32 32 34 20 20 20 20 20 20 20 20  sha3-224        
1ab90 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1aba0 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c  -224 algorithm",
1abb0 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33  .  "      --sha3
1abc0 2d 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20  -256            
1abd0 55 73 65 20 74 68 65 20 73 68 61 33 2d 32 35 36  Use the sha3-256
1abe0 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69   algorithm.  Thi
1abf0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
1ac00 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  .",.  "      --s
1ac10 68 61 33 2d 33 38 34 20 20 20 20 20 20 20 20 20  ha3-384         
1ac20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1ac30 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  384 algorithm",.
1ac40 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d    "      --sha3-
1ac50 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 55  512            U
1ac60 73 65 20 74 68 65 20 73 68 61 33 2d 35 31 32 20  se the sha3-512 
1ac70 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20  algorithm",.  " 
1ac80 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67     Any other arg
1ac90 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20  ument is a LIKE 
1aca0 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c  pattern for tabl
1acb0 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66  es to hash",.#if
1acc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1acd0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68  VE_SYSTEM.  ".sh
1ace0 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
1acf0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1ad00 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1ad10 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1ad20 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1ad40 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
1ad50 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
1ad60 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e   settings",.  ".
1ad70 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
1ad80 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
1ad90 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
1ada0 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66   on or off",.#if
1adb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1adc0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79  VE_SYSTEM.  ".sy
1add0 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e  stem CMD ARGS...
1ade0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1adf0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1ae00 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1ae10 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42  .  ".tables ?TAB
1ae20 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73  LE?          Lis
1ae30 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
1ae40 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20  s matching LIKE 
1ae50 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a  pattern TABLE",.
1ae60 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d    ".testcase NAM
1ae70 45 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  E           Begi
1ae80 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75  n redirecting ou
1ae90 74 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73  tput to 'testcas
1aea0 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22  e-out.txt'",.  "
1aeb0 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1aec0 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
1aed0 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
1aee0 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
1aef0 65 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d  econds",.  ".tim
1af00 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  er on|off       
1af10 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
1af20 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  mer on or off",.
1af30 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f    ".trace FILE|o
1af40 66 66 20 20 20 20 20 20 20 20 20 20 4f 75 74 70  ff          Outp
1af50 75 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ut each SQL stat
1af60 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72  ement as it is r
1af70 75 6e 22 2c 0a 20 20 22 2e 76 66 73 69 6e 66 6f  un",.  ".vfsinfo
1af80 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 20   ?AUX?          
1af90 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1afa0 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  ut the top-level
1afb0 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73 6c 69   VFS",.  ".vfsli
1afc0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1afd0 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69     List all avai
1afe0 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a 20 20  lable VFSes",.  
1aff0 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20  ".vfsname ?AUX? 
1b000 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1b010 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1b020 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20 22 2e  VFS stack",.  ".
1b030 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20  width NUM1 NUM2 
1b040 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f 6c 75  ...     Set colu
1b050 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22  mn widths for \"
1b060 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22 2c 0a  column\" mode",.
1b070 20 20 22 20 20 20 20 20 4e 65 67 61 74 69 76 65    "     Negative
1b080 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
1b090 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  stify",.};../*.*
1b0a0 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20 74 65  * Output help te
1b0b0 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74 74 65  xt..**.** zPatte
1b0c0 72 6e 20 64 65 73 63 72 69 62 65 73 20 74 68 65  rn describes the
1b0d0 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73   set of commands
1b0e0 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c 70 20   for which help 
1b0f0 74 65 78 74 20 69 73 20 70 72 6f 76 69 64 65 64  text is provided
1b100 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65 72 6e  ..** If zPattern
1b110 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 73   is NULL, then s
1b120 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73  how all commands
1b130 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76 65 20  , but only give 
1b140 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20 64 65  a one-line.** de
1b150 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65 61 63  scription of eac
1b160 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  h..**.** Return 
1b170 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  the number of ma
1b180 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tches..*/.static
1b190 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28 46 49   int showHelp(FI
1b1a0 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
1b1b0 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29 7b 0a  har *zPattern){.
1b1c0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
1b1d0 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  t n = 0;.  char 
1b1e0 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61  *zPat;.  if( zPa
1b1f0 74 74 65 72 6e 3d 3d 30 20 7c 7c 20 7a 50 61 74  ttern==0 || zPat
1b200 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 20 29 7b 0a  tern[0]=='0' ){.
1b210 20 20 20 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20      /* Show all 
1b220 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1b230 6c 79 20 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20  ly one line per 
1b240 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 66  command */.    f
1b250 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1b260 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b  ize(azHelp); i++
1b270 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48  ){.      if( azH
1b280 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29  elp[i][0]=='.' )
1b290 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1b2a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1b2b0 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20  ", azHelp[i]);. 
1b2c0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1b2d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1b2e0 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  e{.    /* Look f
1b2f0 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  or commands that
1b300 20 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74 74   for which zPatt
1b310 65 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74 20  ern is an exact 
1b320 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a 50  prefix */.    zP
1b330 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  at = sqlite3_mpr
1b340 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50 61  intf(".%s*", zPa
1b350 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1b360 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1b370 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1b380 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b390 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c 20  3_strglob(zPat, 
1b3a0 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b  azHelp[i])==0 ){
1b3b0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1b3c0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1b3d0 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20  , azHelp[i]);.  
1b3e0 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20        j = i+1;. 
1b3f0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1b400 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1b410 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29  lite3_free(zPat)
1b420 3b 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a 20  ;.    if( n ){. 
1b430 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29 7b       if( n==1 ){
1b440 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e  .        /* when
1b450 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20 70   zPattern is a p
1b460 72 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c 79  refix of exactly
1b470 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74 68   one command, th
1b480 65 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a 20  en include the. 
1b490 20 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c         ** detail
1b4a0 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 6e  s of that comman
1b4b0 64 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  d, which should 
1b4c0 62 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74 20  begin at offset 
1b4d0 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  j */.        whi
1b4e0 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  le( j<ArraySize(
1b4f0 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48  azHelp)-1 && azH
1b500 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29  elp[j][0]!='.' )
1b510 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
1b520 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1b530 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1b540 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
1b550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b560 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  }.      return n
1b570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4c  ;.    }.    /* L
1b580 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73  ook for commands
1b590 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a 50   that contain zP
1b5a0 61 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65 2e  attern anywhere.
1b5b0 20 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c    Show the compl
1b5c0 65 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74 20  ete.    ** text 
1b5d0 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20  of all commands 
1b5e0 74 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a 20  that match. */. 
1b5f0 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65     zPat = sqlite
1b600 33 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73 25  3_mprintf("%%%s%
1b610 25 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  %", zPattern);. 
1b620 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1b630 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1b640 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1b650 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27   azHelp[i][0]=='
1b660 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20 20  .' ) j = i;.    
1b670 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1b680 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48 65  rlike(zPat, azHe
1b690 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a  lp[i], 0)==0 ){.
1b6a0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1b6b0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1b6c0 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20   azHelp[j]);.   
1b6d0 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72       while( j<Ar
1b6e0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d  raySize(azHelp)-
1b6f0 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d  1 && azHelp[j+1]
1b700 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]!='.' ){.    
1b710 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
1b720 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1b730 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1b740 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1b750 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
1b760 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  j;.        n++;.
1b770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b780 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b790 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Pat);.  }.  retu
1b7a0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn n;.}../* Forw
1b7b0 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1b7c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1b7d0 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1b7e0 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69  tate *p, FILE *i
1b7f0 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  n);../*.** Read 
1b800 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66  the content of f
1b810 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d  ile zName into m
1b820 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1b830 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1b840 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65  oc64().** and re
1b850 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1b860 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1b870 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1b880 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
1b890 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  ing.** the memor
1b8a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
1b8b0 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20  meter pnByte is 
1b8c0 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79  not NULL, (*pnBy
1b8d0 74 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68  te) is set to th
1b8e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b8f0 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  s.** read..**.**
1b900 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65   For convenience
1b910 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  , a nul-terminat
1b920 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79  or byte is alway
1b930 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
1b940 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66  e data read.** f
1b950 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66  rom the file bef
1b960 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
1b970 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
1b980 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
1b990 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  luded in.** the 
1b9a0 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28  final value of (
1b9b0 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70  *pnByte), if app
1b9c0 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  licable..**.** N
1b9d0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1b9e0 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20  if any error is 
1b9f0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65  encountered. The
1ba00 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20   final value of 
1ba10 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e  *pnByte.** is un
1ba20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1ba30 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1ba40 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63  char *readFile(c
1ba50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1ba60 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a  , int *pnByte){.
1ba70 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70    FILE *in = fop
1ba80 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1ba90 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73  .  long nIn;.  s
1baa0 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63  ize_t nRead;.  c
1bab0 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28  har *pBuf;.  if(
1bac0 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   in==0 ) return 
1bad0 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  0;.  fseek(in, 0
1bae0 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1baf0 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1bb00 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1bb10 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
1bb20 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29  alloc64( nIn+1 )
1bb30 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
1bb40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
1bb50 65 61 64 20 3d 20 66 72 65 61 64 28 70 42 75 66  ead = fread(pBuf
1bb60 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20  , nIn, 1, in);. 
1bb70 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69   fclose(in);.  i
1bb80 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20  f( nRead!=1 ){. 
1bb90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1bba0 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
1bbb0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
1bbc0 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
1bbd0 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1bbe0 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
1bbf0 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65   pBuf;.}..#if de
1bc00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1bc10 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a  BLE_SESSION)./*.
1bc20 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c  ** Close a singl
1bc30 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62  e OpenSession ob
1bc40 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65  ject and release
1bc50 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f   all of its asso
1bc60 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72  ciated.** resour
1bc70 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
1bc80 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73  oid session_clos
1bc90 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70  e(OpenSession *p
1bca0 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20  Session){.  int 
1bcb0 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73  i;.  sqlite3sess
1bcc0 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73  ion_delete(pSess
1bcd0 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74  ion->p);.  sqlit
1bce0 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
1bcf0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  ->zName);.  for(
1bd00 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d  i=0; i<pSession-
1bd10 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a  >nFilter; i++){.
1bd20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bd30 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1bd40 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  ter[i]);.  }.  s
1bd50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1bd60 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b  sion->azFilter);
1bd70 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69  .  memset(pSessi
1bd80 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70  on, 0, sizeof(Op
1bd90 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23  enSession));.}.#
1bda0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
1bdb0 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69  se all OpenSessi
1bdc0 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72  on objects and r
1bdd0 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63  elease all assoc
1bde0 69 61 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e  iated resources.
1bdf0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1be00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1be10 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f  SSION).static vo
1be20 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65  id session_close
1be30 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  _all(ShellState 
1be40 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1be50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
1be60 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ession; i++){.  
1be70 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
1be80 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29  &p->aSession[i])
1be90 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73  ;.  }.  p->nSess
1bea0 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  ion = 0;.}.#else
1beb0 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f  .# define sessio
1bec0 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23  n_close_all(X).#
1bed0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
1bee0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1bef0 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74  he xFilter funct
1bf00 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20  ion for an open 
1bf10 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a  session.  Omit.*
1bf20 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d  * any tables nam
1bf30 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20  ed by ".session 
1bf40 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20  filter" but let 
1bf50 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20  all other table 
1bf60 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20  through..*/.#if 
1bf70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1bf80 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73  NABLE_SESSION).s
1bf90 74 61 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f  tatic int sessio
1bfa0 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70  n_filter(void *p
1bfb0 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
1bfc0 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65  *zTab){.  OpenSe
1bfd0 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
1bfe0 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29  = (OpenSession*)
1bff0 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pCtx;.  int i;. 
1c000 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1c010 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1c020 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1c030 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65  ite3_strglob(pSe
1c040 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
1c050 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72  i], zTab)==0 ) r
1c060 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1c070 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1c080 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
1c090 64 65 64 75 63 65 20 74 68 65 20 74 79 70 65 20  deduce the type 
1c0a0 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d  of file for zNam
1c0b0 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63  e based on its c
1c0c0 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  ontent.  Return.
1c0d0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48  ** one of the SH
1c0e0 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74  ELL_OPEN_* const
1c0f0 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ants..**.** If t
1c100 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1c110 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70   exist or is emp
1c120 74 79 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20  ty but its name 
1c130 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50  looks like a ZIP
1c140 0a 2a 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20  .** archive and 
1c150 74 68 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67  the dfltZip flag
1c160 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
1c170 73 73 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49  ssume it is a ZI
1c180 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74  P archive..** Ot
1c190 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
1c1a0 61 6e 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61  an ordinary data
1c1b0 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
1c1c0 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
1c1d0 69 66 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63  if.** the type c
1c1e0 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69  annot be determi
1c1f0 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74  ned from content
1c200 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44  ..*/.int deduceD
1c210 61 74 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73  atabaseType(cons
1c220 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1c230 6e 74 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46  nt dfltZip){.  F
1c240 49 4c 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a  ILE *f = fopen(z
1c250 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73  Name, "rb");.  s
1c260 69 7a 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72  ize_t n;.  int r
1c270 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  c = SHELL_OPEN_U
1c280 4e 53 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42  NSPEC;.  char zB
1c290 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66  uf[100];.  if( f
1c2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
1c2b0 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1c2c0 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1c2d0 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1c2e0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  .       return S
1c2f0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1c300 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1c310 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c       return SHEL
1c320 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1c330 20 20 20 7d 0a 20 20 7d 0a 20 20 66 73 65 65 6b     }.  }.  fseek
1c340 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e  (f, -25, SEEK_EN
1c350 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28  D);.  n = fread(
1c360 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b  zBuf, 25, 1, f);
1c370 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d  .  if( n==1 && m
1c380 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61  emcmp(zBuf, "Sta
1c390 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c  rt-Of-SQLite3-",
1c3a0 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72   17)==0 ){.    r
1c3b0 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41  c = SHELL_OPEN_A
1c3c0 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73  PPENDVFS;.  }els
1c3d0 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20  e{.    fseek(f, 
1c3e0 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -22, SEEK_END);.
1c3f0 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42      n = fread(zB
1c400 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20  uf, 22, 1, f);. 
1c410 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a     if( n==1 && z
1c420 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20  Buf[0]==0x50 && 
1c430 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26  zBuf[1]==0x4b &&
1c440 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20   zBuf[2]==0x05. 
1c450 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d        && zBuf[3]
1c460 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20  ==0x06 ){.      
1c470 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  rc = SHELL_OPEN_
1c480 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1c490 73 65 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64  se if( n==0 && d
1c4a0 66 6c 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65  fltZip && sqlite
1c4b0 33 5f 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70  3_strlike("%.zip
1c4c0 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b  ",zName,0)==0 ){
1c4d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 48 45 4c  .      rc = SHEL
1c4e0 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1c4f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
1c500 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(f);.  return 
1c510 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 20 46 6c 61 67  rc;  .}../* Flag
1c520 73 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e  s for open_db().
1c530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1c540 6c 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f  lt behavior of o
1c550 70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65  pen_db() is to e
1c560 78 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61  xit(1) if the da
1c570 74 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a  tabase fails to.
1c580 2a 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50  ** open.  The OP
1c590 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20  EN_DB_KEEPALIVE 
1c5a0 66 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61  flag changes tha
1c5b0 74 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69  t so that it pri
1c5c0 6e 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20  nts an error.** 
1c5d0 62 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  but still return
1c5e0 73 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  s without callin
1c5f0 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  g exit..**.** Th
1c600 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  e OPEN_DB_ZIPFIL
1c610 45 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70  E flag causes op
1c620 65 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65  en_db() to prefe
1c630 72 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20  r to open files 
1c640 61 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68  as a.** ZIP arch
1c650 69 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  ive if the file 
1c660 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
1c670 72 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69  r is empty and i
1c680 74 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a  ts name matches.
1c690 2a 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74  ** the *.zip pat
1c6a0 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  tern..*/.#define
1c6b0 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1c6c0 56 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20  VE   0x001   /* 
1c6d0 52 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72  Return after err
1c6e0 6f 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64  or if true */.#d
1c6f0 65 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  efine OPEN_DB_ZI
1c700 50 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20  PFILE     0x002 
1c710 20 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50    /* Open as ZIP
1c720 20 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73   if name matches
1c730 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   *.zip */../*.**
1c740 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   Make sure the d
1c750 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e  atabase is open.
1c760 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
1c770 74 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49  then open it.  I
1c780 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1c790 65 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c  e fails to open,
1c7a0 20 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   print an error 
1c7b0 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74  message and exit
1c7c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c7d0 20 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74   open_db(ShellSt
1c7e0 61 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e  ate *p, int open
1c7f0 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d  Flags){.  if( p-
1c800 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  >db==0 ){.    if
1c810 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
1c820 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
1c830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
1c840 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  >zDbFilename==0 
1c850 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  || p->zDbFilenam
1c860 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e[0]==0 ){.     
1c870 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
1c880 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1c890 41 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  AL;.      }else{
1c8a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
1c8b0 4d 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63  Mode = (u8)deduc
1c8c0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d  eDatabaseType(p-
1c8d0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  >zDbFilename, . 
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65              (ope
1c900 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42  nFlags & OPEN_DB
1c910 5f 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20  _ZIPFILE)!=0);. 
1c920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c930 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e   switch( p->open
1c940 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Mode ){.      ca
1c950 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50  se SHELL_OPEN_AP
1c960 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20  PENDVFS: {.     
1c970 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
1c980 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
1c990 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20  e, &p->db, .    
1c9a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1c9b0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1c9c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
1c9d0 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20   "apndvfs");.   
1c9e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c9f0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
1ca00 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1ca10 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1ca20 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f  ite3_open(":memo
1ca30 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20  ry:", &p->db);. 
1ca40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ca50 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1ca60 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44   SHELL_OPEN_READ
1ca70 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  ONLY: {.        
1ca80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1ca90 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1caa0 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f  &p->db, SQLITE_O
1cab0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29  PEN_READONLY, 0)
1cac0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1cad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1cae0 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  ase SHELL_OPEN_U
1caf0 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73  NSPEC:.      cas
1cb00 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  e SHELL_OPEN_NOR
1cb10 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MAL: {.        s
1cb20 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a  qlite3_open(p->z
1cb30 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
1cb40 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
1cb50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1cb60 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d  }.    globalDb =
1cb70 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
1cb80 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49  p->db==0 || SQLI
1cb90 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
1cba0 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
1cbb0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1cbc0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
1cbd0 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
1cbe0 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
1cbf0 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
1cc00 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
1cc10 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
1cc20 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
1cc30 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26   if( openFlags &
1cc40 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
1cc50 56 45 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  VE ) return;.   
1cc60 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1cc70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1cc80 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
1cc90 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33  SION.    sqlite3
1cca0 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
1ccb0 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29  ension(p->db, 1)
1ccc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
1ccd0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
1cce0 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1ccf0 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68     sqlite3_shath
1cd00 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ree_init(p->db, 
1cd10 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1cd20 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e  e3_completion_in
1cd30 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
1cd40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1cd50 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
1cd60 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
1cd70 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1cd80 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
1cd90 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
1cda0 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1cdb0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1cdc0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1cdd0 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
1cde0 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
1cdf0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
1ce20 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
1ce30 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
1ce40 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
1ce50 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
1ce60 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
1ce70 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
1cea0 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
1ceb0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1cec0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1ced0 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
1cee0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
1cef0 38 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20  8, p,.          
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c    shellPutsFunc,
1cf20 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20   0, 0);.#ifndef 
1cf30 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
1cf40 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33  STEM.    sqlite3
1cf50 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1cf60 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20  (p->db, "edit", 
1cf70 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1cf80 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1cfa0 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ditFunc, 0, 0);.
1cfb0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
1cfc0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
1cfd0 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51  b, "edit", 2, SQ
1cfe0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
1d010 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69  nc, 0, 0);.#endi
1d020 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65  f.    if( p->ope
1d030 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1d040 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20  N_ZIPFILE ){.   
1d050 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
1d060 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1d070 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
1d080 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
1d090 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c  zip USING zipfil
1d0a0 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46  e(%Q);", p->zDbF
1d0b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
1d0c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
1d0d0 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
1d0e0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1d0f0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1d100 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1d110 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   Attempt to clos
1d120 65 20 74 68 65 20 64 61 74 61 62 61 65 73 20 63  e the databaes c
1d130 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65 70 6f  onnection.  Repo
1d140 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76 6f  rt errors..*/.vo
1d150 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71 6c 69  id close_db(sqli
1d160 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
1d170 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
1d180 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  se(db);.  if( rc
1d190 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1d1a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1d1b0 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or: sqlite3_clos
1d1c0 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 3a 20  e() returns %d: 
1d1d0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 72  %s\n",.        r
1d1e0 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  c, sqlite3_errms
1d1f0 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a 0a  g(db));.  } .}..
1d200 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e  #if HAVE_READLIN
1d210 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49  E || HAVE_EDITLI
1d220 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e  NE./*.** Readlin
1d230 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c  e completion cal
1d240 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63  lbacks.*/.static
1d250 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f   char *readline_
1d260 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1d270 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ator(const char 
1d280 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65  *text, int state
1d290 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
1d2a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1d2b0 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  = 0;.  char *zRe
1d2c0 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d  t;.  if( state==
1d2d0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1d2e0 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Sql;.    sqlite3
1d2f0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1d300 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
1d310 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1d320 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61  LECT DISTINCT ca
1d330 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20  ndidate COLLATE 
1d340 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20  nocase".        
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1d370 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20  etion(%Q) ORDER 
1d380 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20  BY 1", text);.  
1d390 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1d3a0 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a  e_v2(globalDb, z
1d3b0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
1d3c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1d3d0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d  _free(zSql);.  }
1d3e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
1d3f0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1d400 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52  TE_ROW ){.    zR
1d410 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e  et = strdup((con
1d420 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1d430 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1d440 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65  mt, 0));.  }else
1d450 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
1d460 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1d470 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20     pStmt = 0;.  
1d480 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    zRet = 0;.  }.
1d490 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
1d4a0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72  .static char **r
1d4b0 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
1d4c0 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  on(const char *z
1d4d0 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74  Text, int iStart
1d4e0 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72  , int iEnd){.  r
1d4f0 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70  l_attempted_comp
1d500 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b  letion_over = 1;
1d510 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d  .  return rl_com
1d520 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28  pletion_matches(
1d530 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f  zText, readline_
1d540 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72  completion_gener
1d550 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20  ator);.}..#elif 
1d560 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f  HAVE_LINENOISE./
1d570 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63  *.** Linenoise c
1d580 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
1d590 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
1d5a0 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70  d linenoise_comp
1d5b0 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  letion(const cha
1d5c0 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f  r *zLine, lineno
1d5d0 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a  iseCompletions *
1d5e0 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  lc){.  int nLine
1d5f0 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e   = strlen30(zLin
1d600 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  e);.  int i, iSt
1d610 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  art;.  sqlite3_s
1d620 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1d630 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1d640 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
1d650 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69  ..  if( nLine>si
1d660 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29 20  zeof(zBuf)-30 ) 
1d670 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c  return;.  if( zL
1d680 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a  ine[0]=='.' || z
1d690 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20 72 65  Line[0]=='#') re
1d6a0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c  turn;.  for(i=nL
1d6b0 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28  ine-1; i>=0 && (
1d6c0 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d  isalnum(zLine[i]
1d6d0 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ) || zLine[i]=='
1d6e0 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  _'); i--){}.  if
1d6f0 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72  ( i==nLine-1 ) r
1d700 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74 20  eturn;.  iStart 
1d710 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28  = i+1;.  memcpy(
1d720 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74  zBuf, zLine, iSt
1d730 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  art);.  zSql = s
1d740 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1d750 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
1d760 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54  candidate COLLAT
1d770 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20  E nocase".      
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c     "  FROM compl
1d7a0 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44  etion(%Q,%Q) ORD
1d7b0 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20 20  ER BY 1",.      
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74     &zLine[iStart
1d7e0 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c  ], zLine);.  sql
1d7f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1d800 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20  globalDb, zSql, 
1d810 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1d820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d830 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
1d840 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22  exec(globalDb, "
1d850 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
1d860 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a  t", 0, 0, 0); /*
1d870 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61   Load the schema
1d880 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   */.  while( sql
1d890 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
1d8a0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1d8b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d8c0 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63  zCompletion = (c
1d8d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1d8e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1d8f0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Stmt, 0);.    in
1d900 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20  t nCompletion = 
1d910 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d920 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a  ytes(pStmt, 0);.
1d930 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b 6e      if( iStart+n
1d940 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a  Completion < siz
1d950 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20  eof(zBuf)-1 ){. 
1d960 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
1d970 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65  +iStart, zComple
1d980 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f  tion, nCompletio
1d990 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  n+1);.      line
1d9a0 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74 69  noiseAddCompleti
1d9b0 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20  on(lc, zBuf);.  
1d9c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1d9d0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1d9e0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1d9f0 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65  ** Do C-language
1da00 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e 67   style dequoting
1da10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20  ..**.**    \a   
1da20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20   -> alarm.**    
1da30 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70 61  \b    -> backspa
1da40 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d  ce.**    \t    -
1da50 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20  > tab.**    \n  
1da60 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20    -> newline.** 
1da70 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72 74     \v    -> vert
1da80 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c  ical tab.**    \
1da90 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65  f    -> form fee
1daa0 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e  d.**    \r    ->
1dab0 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72 6e   carriage return
1dac0 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e 20  .**    \s    -> 
1dad0 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20  space.**    \"  
1dae0 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20    -> ".**    \' 
1daf0 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c     -> '.**    \\
1db00 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68      -> backslash
1db10 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20  .**    \NNN  -> 
1db20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72 20  ascii character 
1db30 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a  NNN in octal.*/.
1db40 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
1db50 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
1db60 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1db70 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a  i, j;.  char c;.
1db80 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a    while( *z && *
1db90 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20  z!='\\' ) z++;. 
1dba0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
1dbb0 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20   z[i])!=0; i++, 
1dbc0 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  j++){.    if( c=
1dbd0 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21  ='\\' && z[i+1]!
1dbe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  =0 ){.      c = 
1dbf0 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66  z[++i];.      if
1dc00 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20  ( c=='a' ){.    
1dc10 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20      c = '\a';.  
1dc20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1dc30 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='b' ){.        
1dc40 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
1dc50 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
1dc60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1dc70 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\t';.      }els
1dc80 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a  e if( c=='n' ){.
1dc90 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
1dca0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1dcb0 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20  ( c=='v' ){.    
1dcc0 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20      c = '\v';.  
1dcd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1dce0 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
1dcf0 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20 20  c = '\f';.      
1dd00 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
1dd10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
1dd20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\r';.      }els
1dd30 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
1dd40 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27 3b          c = '"';
1dd50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dd60 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
1dd70 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20      c = '\'';.  
1dd80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
1dd90 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
1dda0 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20   c = '\\';.     
1ddb0 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
1ddc0 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20  ' && c<='7' ){. 
1ddd0 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27 3b         c -= '0';
1dde0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
1ddf0 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
1de00 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
1de10 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1de20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b      c = (c<<3) +
1de30 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20   z[i] - '0';.   
1de40 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31         if( z[i+1
1de50 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d  ]>='0' && z[i+1]
1de60 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1de70 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1de80 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
1de90 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
1dea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1deb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1dec0 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b   }.    z[j] = c;
1ded0 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29  .  }.  if( j<i )
1dee0 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a   z[j] = 0;.}../*
1def0 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41  .** Interpret zA
1df00 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e 20  rg as either an 
1df10 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f 6f  integer or a boo
1df20 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65 74  lean value.  Ret
1df30 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f  urn 1 or 0.** fo
1df40 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53 45  r TRUE and FALSE
1df50 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
1df60 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20 61  teger value if a
1df70 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
1df80 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61  tatic int boolea
1df90 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  nValue(const cha
1dfa0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  r *zArg){.  int 
1dfb0 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d  i;.  if( zArg[0]
1dfc0 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
1dfd0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f 72  =='x' ){.    for
1dfe0 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56 61  (i=2; hexDigitVa
1dff0 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b  lue(zArg[i])>=0;
1e000 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b   i++){}.  }else{
1e010 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41  .    for(i=0; zA
1e020 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41  rg[i]>='0' && zA
1e030 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29  rg[i]<='9'; i++)
1e040 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 30  {}.  }.  if( i>0
1e050 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29   && zArg[i]==0 )
1e060 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 6e   return (int)(in
1e070 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67 29  tegerValue(zArg)
1e080 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
1e090 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1e0a0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22  ricmp(zArg, "on"
1e0b0 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  )==0 || sqlite3_
1e0c0 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79 65  stricmp(zArg,"ye
1e0d0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  s")==0 ){.    re
1e0e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1e0f0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
1e100 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d  p(zArg, "off")==
1e110 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
1e120 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d  icmp(zArg,"no")=
1e130 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1e140 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70   0;.  }.  utf8_p
1e150 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1e160 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c  RROR: Not a bool
1e170 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c  ean value: \"%s\
1e180 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f  ". Assuming \"no
1e190 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
1e1a0 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72    zArg);.  retur
1e1b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
1e1c0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68 65  t or clear a she
1e1d0 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69 6e  ll flag accordin
1e1e0 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76  g to a boolean v
1e1f0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
1e200 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72 46  void setOrClearF
1e210 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  lag(ShellState *
1e220 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61  p, unsigned mFla
1e230 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  g, const char *z
1e240 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c  Arg){.  if( bool
1e250 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20 29  eanValue(zArg) )
1e260 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c  {.    ShellSetFl
1e270 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1e280 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c  }else{.    Shell
1e290 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c  ClearFlag(p, mFl
1e2a0 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ag);.  }.}../*.*
1e2b0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75  * Close an outpu
1e2c0 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67  t file, assuming
1e2d0 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65 72   it is not stder
1e2e0 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73  r or stdout.*/.s
1e2f0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
1e300 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c  t_file_close(FIL
1e310 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20 26  E *f){.  if( f &
1e320 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20 66  & f!=stdout && f
1e330 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1e340 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(f);.}../*.** T
1e350 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75  ry to open an ou
1e360 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68 65  tput file.   The
1e370 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22 20   names "stdout" 
1e380 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72 65  and "stderr" are
1e390 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  .** recognized a
1e3a0 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74 20  nd do the right 
1e3b0 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20  thing.  NULL is 
1e3c0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1e3d0 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61  output.** filena
1e3e0 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a  me is "off"..*/.
1e3f0 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75 74  static FILE *out
1e400 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f  put_file_open(co
1e410 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c  nst char *zFile,
1e420 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65 29 7b   int bTextMode){
1e430 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66  .  FILE *f;.  if
1e440 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
1e450 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20  stdout")==0 ){. 
1e460 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20     f = stdout;. 
1e470 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1e480 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72  p(zFile, "stderr
1e490 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1e4a0 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65   stderr;.  }else
1e4b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1e4c0 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a  e, "off")==0 ){.
1e4d0 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c      f = 0;.  }el
1e4e0 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65  se{.    f = fope
1e4f0 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f  n(zFile, bTextMo
1e500 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62 22 29  de ? "w" : "wb")
1e510 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20 29  ;.    if( f==0 )
1e520 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1e530 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1e540 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
1e550 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
1e560 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1e570 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20  eturn f;.}..#if 
1e580 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e590 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
1e5a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e5b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1e5c0 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74  NT)./*.** A rout
1e5d0 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  ine for handling
1e5e0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c   output from sql
1e5f0 69 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f  ite3_trace()..*/
1e600 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 5f  .static int sql_
1e610 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a  trace_callback(.
1e620 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70 65    unsigned mType
1e630 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a  ,.  void *pArg,.
1e640 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20 20 76 6f    void *pP,.  vo
1e650 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46 49 4c 45  id *pX.){.  FILE
1e660 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29 70 41 72   *f = (FILE*)pAr
1e670 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  g;.  UNUSED_PARA
1e680 4d 45 54 45 52 28 6d 54 79 70 65 29 3b 0a 20 20  METER(mType);.  
1e690 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e6a0 28 70 50 29 3b 0a 20 20 69 66 28 20 66 20 29 7b  (pP);.  if( f ){
1e6b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1e6c0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
1e6d0 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74 20 69 20  *)pX;.    int i 
1e6e0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
1e6f0 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26     while( i>0 &&
1e700 20 7a 5b 69 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20   z[i-1]==';' ){ 
1e710 69 2d 2d 3b 20 7d 0a 20 20 20 20 75 74 66 38 5f  i--; }.    utf8_
1e720 70 72 69 6e 74 66 28 66 2c 20 22 25 2e 2a 73 3b  printf(f, "%.*s;
1e730 5c 6e 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a  \n", i, z);.  }.
1e740 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1e750 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
1e760 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
1e770 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
1e780 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
1e790 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
1e7a0 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
1e7b0 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
1e7c0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1e7d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e7e0 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1e7f0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1e800 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
1e810 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
1e820 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
1e830 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
1e840 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
1e850 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
1e860 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1e870 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
1e880 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
1e890 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
1e8a0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
1e8b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
1e8c0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
1e8d0 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
1e8e0 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
1e8f0 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
1e900 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
1e910 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1e920 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
1e930 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
1e940 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e960 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1e970 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
1e980 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
1e990 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1e9a0 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
1e9b0 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
1e9c0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
1e9d0 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1e9e0 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
1e9f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
1ea00 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
1ea10 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
1ea20 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
1ea30 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
1ea40 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1ea50 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
1ea60 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1ea70 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
1ea80 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1ea90 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1eaa0 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
1eab0 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
1eac0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
1ead0 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
1eae0 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
1eaf0 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
1eb00 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
1eb10 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
1eb20 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
1eb30 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
1eb40 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
1eb50 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
1eb60 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
1eb70 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
1eb80 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1eb90 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1eba0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1ebb0 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1ebc0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1ebd0 2d 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ->z==0 ) shell_o
1ebe0 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
1ebf0 20 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b    }.  p->z[p->n+
1ec00 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a  +] = (char)c;.}.
1ec10 0a 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  ./* Read a singl
1ec20 65 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74  e field of CSV t
1ec30 65 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65  ext.  Compatible
1ec40 20 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e   with rfc4180 an
1ec50 64 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69  d extended.** wi
1ec60 74 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66  th the option of
1ec70 20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61   having a separa
1ec80 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22  tor other than "
1ec90 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49  ,"..**.**   +  I
1eca0 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  nput comes from 
1ecb0 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53  p->in..**   +  S
1ecc0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1ecd0 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70  p->z of length p
1ece0 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ->n.  Space to h
1ecf0 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a  old p->z comes.*
1ed00 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69  *      from sqli
1ed10 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a  te3_malloc64()..
1ed20 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63  **   +  Use p->c
1ed30 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  Sep as the colum
1ed40 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  n separator.  Th
1ed50 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22  e default is ","
1ed60 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
1ed70 3e 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77  >rSep as the row
1ed80 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
1ed90 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22   default is "\n"
1eda0 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
1edb0 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
1edc0 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1edd0 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1ede0 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1edf0 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1ee00 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1ee10 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1ee20 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1ee30 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1ee40 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1ee50 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1ee60 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1ee70 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63   *SQLITE_CDECL c
1ee80 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1ee90 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1eea0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1eeb0 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1eec0 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1eed0 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1eee0 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1eef0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1ef00 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1ef10 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1ef20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1ef30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1ef40 20 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20   }.  if( c=='"' 
1ef50 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70  ){.    int pc, p
1ef60 70 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  pc;.    int star
1ef70 74 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65  tLine = p->nLine
1ef80 3b 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65  ;.    int cQuote
1ef90 20 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70   = c;.    pc = p
1efa0 70 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  pc = 0;.    whil
1efb0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20  e( 1 ){.      c 
1efc0 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1efd0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65        if( c==rSe
1efe0 70 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a  p ) p->nLine++;.
1eff0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75        if( c==cQu
1f000 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ote ){.        i
1f010 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b  f( pc==cQuote ){
1f020 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
1f030 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
1f040 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1f050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f060 66 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70  f( (c==cSep && p
1f070 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1f080 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1f090 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1f0a0 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20      || (c==rSep 
1f0b0 26 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70  && pc=='\r' && p
1f0c0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1f0d0 20 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26     || (c==EOF &&
1f0e0 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20   pc==cQuote).   
1f0f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f     ){.        do
1f100 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65  { p->n--; }while
1f110 28 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51  ( p->z[p->n]!=cQ
1f120 75 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20  uote );.        
1f130 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
1f140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1f160 63 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d  c==cQuote && c!=
1f170 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f180 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1f190 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73  rr, "%s:%d: unes
1f1a0 63 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74  caped %c charact
1f1b0 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  er\n",.         
1f1c0 20 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c         p->zFile,
1f1d0 20 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74   p->nLine, cQuot
1f1e0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f1f0 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a    if( c==EOF ){.
1f200 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1f210 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
1f220 25 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64  %d: unterminated
1f230 20 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64   %c-quoted field
1f240 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f250 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73       p->zFile, s
1f260 74 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65  tartLine, cQuote
1f270 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
1f280 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
1f290 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1f2a0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1f2b0 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1f2c0 20 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a        ppc = pc;.
1f2d0 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
1f2e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1f2f0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1f300 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62  he first field b
1f310 65 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20  eing parsed and 
1f320 69 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  it begins with t
1f330 68 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20  he.    ** UTF-8 
1f340 42 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46  BOM  (0xEF BB BF
1f350 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
1f360 42 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  BOM */.    if( (
1f370 63 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26  c&0xff)==0xef &&
1f380 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30   p->bNotFirst==0
1f390 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74   ){.      import
1f3a0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1f3b0 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67  c);.      c = fg
1f3c0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1f3d0 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
1f3e0 30 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbb ){.        
1f3f0 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1f400 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1f410 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1f420 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
1f430 28 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29  (c&0xff)==0xbf )
1f440 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62  {.          p->b
1f450 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1f460 20 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30          p->n = 0
1f470 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f480 72 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f  rn csv_read_one_
1f490 66 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20  field(p);.      
1f4a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f4b0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d  }.    while( c!=
1f4c0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
1f4d0 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
1f4e0 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1f4f0 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1f500 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1f510 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
1f520 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20  f( c==rSep ){.  
1f530 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1f540 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30        if( p->n>0
1f550 20 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d   && p->z[p->n-1]
1f560 3d 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b  =='\r' ) p->n--;
1f570 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54  .    }.    p->cT
1f580 65 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  erm = c;.  }.  i
1f590 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70  f( p->z ) p->z[p
1f5a0 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  ->n] = 0;.  p->b
1f5b0 4e 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  NotFirst = 1;.  
1f5c0 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
1f5d0 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
1f5e0 20 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20   field of ASCII 
1f5f0 64 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a  delimited text..
1f600 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1f610 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1f620 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1f630 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1f640 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1f650 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1f660 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1f670 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1f680 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1f690 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1f6a0 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1f6b0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1f6c0 66 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e  fault is "\x1F".
1f6d0 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1f6e0 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
1f6f0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1f700 64 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45  default is "\x1E
1f710 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20  "..**   +  Keep 
1f720 74 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77  track of the row
1f730 20 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c   number in p->nL
1f740 69 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  ine..**   +  Sto
1f750 72 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72  re the character
1f760 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
1f770 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d   the field in p-
1f780 3e 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a  >cTerm.  Store.*
1f790 2a 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e  *      EOF on en
1f7a0 64 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20  d-of-file..**   
1f7b0 2b 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78  +  Report syntax
1f7c0 20 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72   errors on stder
1f7d0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  r.*/.static char
1f7e0 20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61   *SQLITE_CDECL a
1f7f0 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
1f800 65 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  eld(ImportCtx *p
1f810 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1f820 74 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c  t cSep = p->cCol
1f830 53 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20  Sep;.  int rSep 
1f840 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20  = p->cRowSep;.  
1f850 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20  p->n = 0;.  c = 
1f860 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1f870 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65  if( c==EOF || se
1f880 65 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20  enInterrupt ){. 
1f890 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f     p->cTerm = EO
1f8a0 46 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  F;.    return 0;
1f8b0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21  .  }.  while( c!
1f8c0 3d 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20  =EOF && c!=cSep 
1f8d0 26 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20  && c!=rSep ){.  
1f8e0 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1f8f0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1f900 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1f910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72  ;.  }.  if( c==r
1f920 53 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  Sep ){.    p->nL
1f930 69 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ine++;.  }.  p->
1f940 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28  cTerm = c;.  if(
1f950 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1f960 6e 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  n] = 0;.  return
1f970 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   p->z;.}../*.** 
1f980 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20  Try to transfer 
1f990 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a  data for table z
1f9a0 54 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72  Table.  If an er
1f9b0 72 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c  ror is seen whil
1f9c0 65 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77  e.** moving forw
1f9d0 61 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62  ard, try to go b
1f9e0 61 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62  ackwards.  The b
1f9f0 61 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e  ackwards movemen
1fa00 74 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20  t won't.** work 
1fa10 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
1fa20 44 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  D tables..*/.sta
1fa30 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1fa40 6f 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c  oneData(.  Shell
1fa50 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
1fa60 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
1fa70 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
1fa80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1fa90 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
1faa0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1fab0 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63  pInsert = 0;.  c
1fac0 68 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b  har *zQuery = 0;
1fad0 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74  .  char *zInsert
1fae0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1faf0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20    int i, j, n;. 
1fb00 20 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74   int nTable = st
1fb10 72 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a  rlen30(zTable);.
1fb20 20 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69    int k = 0;.  i
1fb30 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f  nt cnt = 0;.  co
1fb40 6e 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65  nst int spinRate
1fb50 20 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75   = 10000;..  zQu
1fb60 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1fb70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
1fb80 46 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54  FROM \"%w\"", zT
1fb90 61 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  able);.  rc = sq
1fba0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1fbb0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
1fbc0 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
1fbd0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1fbe0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1fbf0 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
1fc00 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
1fc10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fc20 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1fc30 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
1fc40 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1fc50 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
1fc60 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
1fc70 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
1fc80 20 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65    }.  n = sqlite
1fc90 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
1fca0 51 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72  Query);.  zInser
1fcb0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
1fcc0 6f 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c  oc64(200 + nTabl
1fcd0 65 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20  e + n*3);.  if( 
1fce0 7a 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65  zInsert==0 ) she
1fcf0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
1fd00 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ();.  sqlite3_sn
1fd10 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c  printf(200+nTabl
1fd20 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20  e,zInsert,.     
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
1fd40 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
1fd50 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55  INTO \"%s\" VALU
1fd60 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
1fd70 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    i = strlen30(z
1fd80 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
1fd90 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
1fda0 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
1fdb0 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
1fdc0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
1fdd0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1fde0 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
1fdf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1fe00 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
1fe10 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
1fe20 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
1fe30 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1fe40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1fe50 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
1fe60 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1fe70 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1fe80 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1fe90 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1fea0 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
1feb0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1fec0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
1fed0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
1fee0 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
1fef0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
1ff00 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1ff10 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1ff20 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
1ff30 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1ff40 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
1ff50 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
1ff60 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
1ff70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
1ff80 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
1ff90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1ffa0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1ffb0 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
1ffc0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1ffd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ffe0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1fff0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
20000 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20010 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
20020 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
20030 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
20040 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
20050 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
20060 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20070 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
20080 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
20090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
200a0 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
200b0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
200c0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
200d0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
200e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
200f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20100 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20110 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
20120 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
20130 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
20140 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20170 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20180 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
201b0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
201c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
201d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
201e0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
201f0 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
20200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
20210 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
20220 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
20230 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
20240 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
20280 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
20290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
202c0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
202d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
202e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
202f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
20300 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
20310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20320 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
20330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20340 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
20350 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
20360 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
20370 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
20380 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
20390 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
203a0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
203b0 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
203e0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
203f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
20400 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
20410 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
20420 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
20430 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
20440 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
20450 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
20460 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
20470 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
20480 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
20490 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
204a0 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
204b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
204c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
204d0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
204e0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
204f0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
20500 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
20510 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
20520 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
20530 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
20540 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
20570 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20580 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
20590 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
205a0 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
205b0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
205c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
205d0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
205e0 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
205f0 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
20600 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
20610 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
20620 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
20630 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
20640 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
20650 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
20660 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
20670 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
20680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
20690 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
206a0 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
206b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
206c0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
206d0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
206e0 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
206f0 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
20700 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
20710 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
20720 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
20730 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
20740 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
20750 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
20760 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
20770 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
20780 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
20790 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
207a0 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
207b0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
207c0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
207d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
207e0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
207f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20800 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
20810 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
20820 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
20830 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
20840 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20850 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
20860 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
20870 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
20880 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20890 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
208a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
208b0 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
208c0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
208d0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
208e0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
208f0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
20900 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
20930 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
20940 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
20950 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
20960 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
20970 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
20980 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
20990 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
209a0 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
209b0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
209c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
209d0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
209e0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
209f0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
20a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20a10 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
20a20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
20a30 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
20a40 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
20a50 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
20a60 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
20a70 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
20a80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
20a90 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
20aa0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
20ab0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
20ac0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
20ad0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
20ae0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
20af0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
20b00 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
20b10 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
20b20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
20b30 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
20b40 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
20b50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
20b60 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
20b70 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
20b80 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
20b90 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
20ba0 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
20bb0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
20bc0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
20bd0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
20be0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
20bf0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
20c00 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
20c10 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
20c20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20c30 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
20c40 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
20c50 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
20c60 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
20c70 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
20c80 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
20c90 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
20ca0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
20cb0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
20ce0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
20cf0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
20d00 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
20d10 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
20d20 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
20d30 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
20d40 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
20d50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20d60 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
20d70 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d90 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
20da0 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
20db0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
20dc0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
20de0 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
20df0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
20e00 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
20e10 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
20e20 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
20e30 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
20e40 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
20e50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20e60 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
20e70 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
20e80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
20e90 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
20ea0 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
20eb0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
20ec0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
20ed0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
20ee0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
20ef0 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
20f00 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
20f10 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
20f20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
20f30 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
20f40 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
20f50 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
20f60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20f70 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
20f80 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
20f90 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
20fa0 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
20fb0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
20fc0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
20fd0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
20fe0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
20ff0 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
21000 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
21010 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
21020 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
21030 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
21040 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
21050 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
21060 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
21070 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
21080 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
21090 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
210a0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
210b0 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
210c0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
210d0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
210e0 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
210f0 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
21100 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
21110 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
21120 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
21130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
21140 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
21150 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
21160 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
21170 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
21180 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
21190 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
211a0 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
211b0 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
211c0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
211d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
211e0 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
211f0 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
21200 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
21210 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
21220 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
21230 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
21240 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21250 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
21260 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
21270 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
21280 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
21290 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
212a0 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
212b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
212c0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
212d0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
212e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
212f0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
21300 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
21310 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
21320 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
21330 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
21340 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
21350 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
21360 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
21370 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
21380 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
21390 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
213a0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
213b0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
213c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
213d0 63 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b  close_db(newDb);
213e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
213f0 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65   the output file
21400 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e   back to stdout.
21410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d  .**.** If the p-
21420 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20  >doXdgOpen flag 
21430 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61  is set, that mea
21440 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20 77 61  ns the output wa
21450 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72  s being.** redir
21460 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f  ected to a tempo
21470 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20  rary file named 
21480 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e  by p->zTempFile.
21490 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a    In that case,.
214a0 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f  ** launch start/
214b0 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e  open/xdg-open on
214c0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
214d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
214e0 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65  void output_rese
214f0 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
21500 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69  {.  if( p->outfi
21510 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
21520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21530 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f  T_POPEN.    pclo
21540 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  se(p->out);.#end
21550 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
21560 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
21570 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64  e(p->out);.#ifnd
21580 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
21590 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20  _SYSTEM.    if( 
215a0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a  p->doXdgOpen ){.
215b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
215c0 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a   *zXdgOpenCmd =.
215d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
215e0 33 32 29 0a 20 20 20 20 20 20 22 73 74 61 72 74  32).      "start
215f0 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ";.#elif defined
21600 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
21610 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a    "open";.#else.
21620 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22        "xdg-open"
21630 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  ;.#endif.      c
21640 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20  har *zCmd;.     
21650 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
21660 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c  mprintf("%s %s",
21670 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d   zXdgOpenCmd, p-
21680 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  >zTempFile);.   
21690 20 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43     if( system(zC
216a0 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  md) ){.        u
216b0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
216c0 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d  r, "Failed: [%s]
216d0 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20  \n", zCmd);.    
216e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
216f0 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20  3_free(zCmd);.  
21700 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f      outputModePo
21710 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  p(p);.      p->d
21720 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  oXdgOpen = 0;.  
21730 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
21740 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
21750 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a  HAVE_SYSTEM) */.
21760 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65    }.  p->outfile
21770 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75  [0] = 0;.  p->ou
21780 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f  t = stdout;.}../
21790 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20  *.** Run an SQL 
217a0 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75  command and retu
217b0 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e  rn the single in
217c0 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f  teger result..*/
217d0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69  .static int db_i
217e0 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nt(ShellState *p
217f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
21800 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql){.  sqlite3_s
21810 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
21820 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  t res = 0;.  sql
21830 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
21840 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
21850 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
21860 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
21870 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
21880 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
21890 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
218a0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
218b0 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t,0);.  }.  sqli
218c0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
218d0 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  mt);.  return re
218e0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  s;.}../*.** Conv
218f0 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20  ert a 2-byte or 
21900 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
21910 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
21920 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
21930 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
21940 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49  ed int get2byteI
21950 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
21960 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
21970 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b  a[0]<<8) + a[1];
21980 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .}.static unsign
21990 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49  ed int get4byteI
219a0 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
219b0 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
219c0 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31  a[0]<<24) + (a[1
219d0 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c  ]<<16) + (a[2]<<
219e0 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + a[3];.}../*
219f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
21a00 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f  on of the ".info
21a10 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
21a20 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
21a30 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
21a40 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
21a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
21a60 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
21a70 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
21a80 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
21a90 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61   **azArg){.  sta
21aa0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
21ab0 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
21ac0 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20  Name; int ofst; 
21ad0 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20  } aField[] = {. 
21ae0 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e      { "file chan
21af0 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32  ge counter:",  2
21b00 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  4  },.     { "da
21b10 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
21b20 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20  t:",  28  },.   
21b30 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61    { "freelist pa
21b40 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20  ge count:",  36 
21b50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
21b60 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20  ma cookie:",    
21b70 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20      40  },.     
21b80 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74  { "schema format
21b90 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d  :",        44  }
21ba0 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c  ,.     { "defaul
21bb0 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20  t cache size:", 
21bc0 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    48  },.     { 
21bd0 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20  "autovacuum top 
21be0 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a  root:",  52  },.
21bf0 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e       { "incremen
21c00 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20  tal vacuum:",   
21c10 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74  64  },.     { "t
21c20 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20  ext encoding:", 
21c30 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20         56  },.  
21c40 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69     { "user versi
21c50 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30  on:",         60
21c60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70    },.     { "app
21c70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20  lication id:",  
21c80 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20       68  },.    
21c90 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72   { "software ver
21ca0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20  sion:",     96  
21cb0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
21cc0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
21cd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
21ce0 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e; const char *z
21cf0 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20  Sql; } aQuery[] 
21d00 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62  = {.     { "numb
21d10 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a  er of tables:",.
21d20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
21d30 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
21d40 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
21d50 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  e'" },.     { "n
21d60 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
21d70 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
21d80 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
21d90 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
21da0 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20  index'" },.     
21db0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69  { "number of tri
21dc0 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20  ggers:",.       
21dd0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
21de0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
21df0 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d  ype='trigger'" }
21e00 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
21e10 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20   of views:",.   
21e20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
21e30 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
21e40 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20  RE type='view'" 
21e50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
21e60 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20  a size:",.      
21e70 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c   "SELECT total(l
21e80 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d  ength(sql)) FROM
21e90 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69   %s" },.  };.  i
21ea0 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
21eb0 20 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20   iDataVersion;. 
21ec0 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61   char *zSchemaTa
21ed0 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  b;.  char *zDb =
21ee0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
21ef0 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] : "main";.  
21f00 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
21f10 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  tmt = 0;.  unsig
21f20 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
21f30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0];.  open_db(p,
21f40 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62   0);.  if( p->db
21f50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
21f60 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
21f70 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45  e_v2(p->db,"SELE
21f80 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c  CT data FROM sql
21f90 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57  ite_dbpage(?1) W
21fa0 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20  HERE pgno=1",.  
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
21fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
21fe0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
21ff0 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zDb, -1, SQLITE
22000 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
22010 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
22020 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a  mt)==SQLITE_ROW.
22030 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f     && sqlite3_co
22040 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
22050 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20  ,0)>100.  ){.   
22060 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71   memcpy(aHdr, sq
22070 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
22080 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29  b(pStmt,0), 100)
22090 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
220a0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
220b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
220c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
220d0 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64  unable to read d
220e0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e  atabase header\n
220f0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
22100 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
22110 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
22120 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74   }.  i = get2byt
22130 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20  eInt(aHdr+16);. 
22140 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20   if( i==1 ) i = 
22150 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72  65536;.  utf8_pr
22160 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
22170 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61  20s %d\n", "data
22180 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22  base page size:"
22190 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  , i);.  utf8_pri
221a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
221b0 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65  0s %d\n", "write
221c0 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
221d0 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  18]);.  utf8_pri
221e0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
221f0 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20  0s %d\n", "read 
22200 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
22210 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  9]);.  utf8_prin
22220 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
22230 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76  s %d\n", "reserv
22240 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72  ed bytes:", aHdr
22250 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [20]);.  for(i=0
22260 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46  ; i<ArraySize(aF
22270 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ield); i++){.   
22280 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65   int ofst = aFie
22290 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20  ld[i].ofst;.    
222a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c  unsigned int val
222b0 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61   = get4byteInt(a
222c0 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20  Hdr + ofst);.   
222d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
222e0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c  out, "%-20s %u",
222f0 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65   aField[i].zName
22300 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74  , val);.    swit
22310 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20  ch( ofst ){.    
22320 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20    case 56: {.   
22330 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20       if( val==1 
22340 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
22350 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b  out, " (utf8)");
22360 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
22370 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==2 ) raw_printf
22380 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
22390 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20  6le)");.        
223a0 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77  if( val==3 ) raw
223b0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
223c0 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20  " (utf16be)");. 
223d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
223e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
223f0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ut, "\n");.  }. 
22400 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20   if( zDb==0 ){. 
22410 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
22420 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
22430 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73  "main.sqlite_mas
22440 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ter");.  }else i
22450 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74  f( strcmp(zDb,"t
22460 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  emp")==0 ){.    
22470 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
22480 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
22490 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ", "sqlite_temp_
224a0 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
224b0 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  e{.    zSchemaTa
224c0 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
224d0 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69  ntf("\"%w\".sqli
224e0 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29  te_master", zDb)
224f0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
22500 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75   i<ArraySize(aQu
22510 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ery); i++){.    
22520 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
22530 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75  ite3_mprintf(aQu
22540 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63  ery[i].zSql, zSc
22550 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e  hemaTab);.    in
22560 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70  t val = db_int(p
22570 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c  , zSql);.    sql
22580 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
22590 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
225a0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
225b0 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d  %d\n", aQuery[i]
225c0 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
225d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
225e0 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20  (zSchemaTab);.  
225f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
22600 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c  trol(p->db, zDb,
22610 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41   SQLITE_FCNTL_DA
22620 54 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61  TA_VERSION, &iDa
22630 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74  taVersion);.  ut
22640 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
22650 2c 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20  , "%-20s %u\n", 
22660 22 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20  "data version", 
22670 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  iDataVersion);. 
22680 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22690 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
226a0 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
226b0 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
226c0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
226d0 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
226e0 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
226f0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
22700 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
22710 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
22720 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
22730 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
22740 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
22750 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
22760 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
22770 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72  mpare the patter
22780 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61  n in zGlob[] aga
22790 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e  inst the text in
227a0 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52   z[].  Return TR
227b0 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61  UE.** if they ma
227c0 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30  tch and FALSE (0
227d0 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  ) if they do not
227e0 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c   match..**.** Gl
227f0 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
22800 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
22810 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
22820 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
22830 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
22840 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
22850 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
22860 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
22870 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
22880 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
22890 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
228a0 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
228b0 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
228c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
228d0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
228e0 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
228f0 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
22900 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
22910 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
22920 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20  **.**      '#'  
22930 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
22940 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65   sequence of one
22950 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20   or more digits 
22960 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20  with an.**      
22970 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e            option
22980 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69  al + or - sign i
22990 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20  n front.**.**   
229a0 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79     ' '       Any
229b0 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70   span of whitesp
229c0 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20  ace matches any 
229d0 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a  other span of.**
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a  whitespace..**.*
22a00 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61  * Extra whitespa
22a10 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
22a20 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e   z[] is ignored.
22a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
22a40 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e  estcase_glob(con
22a50 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20  st char *zGlob, 
22a60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
22a70 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69    int c, c2;.  i
22a80 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
22a90 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28   seen;..  while(
22aa0 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b   (c = (*(zGlob++
22ab0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  )))!=0 ){.    if
22ac0 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
22ad0 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61        if( !IsSpa
22ae0 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  ce(*z) ) return 
22af0 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
22b00 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20  IsSpace(*zGlob) 
22b10 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20  ) zGlob++;.     
22b20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
22b30 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
22b40 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20  else if( c=='*' 
22b50 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
22b60 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29  (c=(*(zGlob++)))
22b70 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f   == '*' || c=='?
22b80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
22b90 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b   c=='?' && (*(z+
22ba0 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
22bb0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22bc0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
22bd0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22be0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
22bf0 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
22c00 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65   while( *z && te
22c10 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
22c20 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  b-1,z)==0 ){.   
22c30 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
22c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
22c50 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20  turn (*z)!=0;.  
22c60 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
22c70 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29  e( (c2 = (*(z++)
22c80 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
22c90 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b   while( c2!=c ){
22ca0 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
22cb0 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  *(z++);.        
22cc0 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
22cd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
22ce0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  }.        if( te
22cf0 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
22d00 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b  b,z) ) return 1;
22d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22d20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
22d30 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b  se if( c=='?' ){
22d40 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b  .      if( (*(z+
22d50 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
22d60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
22d70 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
22d80 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30   int prior_c = 0
22d90 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  ;.      seen = 0
22da0 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
22db0 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28   0;.      c = *(
22dc0 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  z++);.      if( 
22dd0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
22de0 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47  .      c2 = *(zG
22df0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  lob++);.      if
22e00 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
22e10 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
22e20 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
22e30 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
22e40 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
22e50 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
22e60 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
22e70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
22e80 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
22e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
22ea0 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
22eb0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
22ec0 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f   c2=='-' && zGlo
22ed0 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c  b[0]!=']' && zGl
22ee0 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f  ob[0]!=0 && prio
22ef0 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
22f00 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
22f10 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
22f20 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20  ( c>=prior_c && 
22f30 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31  c<=c2 ) seen = 1
22f40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  ;.          prio
22f50 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r_c = 0;.       
22f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22f70 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20    if( c==c2 ){. 
22f80 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
22f90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
22fa0 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
22fb0 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  _c = c2;.       
22fc0 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20   }.        c2 = 
22fd0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
22fe0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
22ff0 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
23000 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
23010 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
23020 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20  if( c=='#' ){.  
23030 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27      if( (z[0]=='
23040 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29  -' || z[0]=='+')
23050 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d   && IsDigit(z[1]
23060 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ) ) z++;.      i
23070 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d  f( !IsDigit(z[0]
23080 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
23090 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77      z++;.      w
230a0 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b  hile( IsDigit(z[
230b0 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  0]) ){ z++; }.  
230c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
230d0 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29  f( c!=(*(z++)) )
230e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
230f0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73  .  }.  while( Is
23100 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Space(*z) ){ z++
23110 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d  ; }.  return *z=
23120 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  =0;.}.../*.** Co
23130 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67  mpare the string
23140 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69   as a command-li
23150 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65  ne option with e
23160 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f  ither one or two
23170 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  .** initial "-" 
23180 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
23190 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e  tatic int option
231a0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
231b0 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
231c0 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28  ar *zOpt){.  if(
231d0 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20   zStr[0]!='-' ) 
231e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72  return 0;.  zStr
231f0 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  ++;.  if( zStr[0
23200 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b  ]=='-' ) zStr++;
23210 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
23220 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b  (zStr, zOpt)==0;
23230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
23240 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   a file..*/.int 
23250 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28  shellDeleteFile(
23260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23270 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63  ename){.  int rc
23280 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ;.#ifdef _WIN32.
23290 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
232a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
232b0 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69  8_to_unicode(zFi
232c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
232d0 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73  _wunlink(z);.  s
232e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
232f0 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c  #else.  rc = unl
23300 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
23310 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
23320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
23330 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74   to delete the t
23340 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69  emporary file (i
23350 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20  f there is one) 
23360 61 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20  and free the.** 
23370 6d 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68  memory used to h
23380 6f 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  old the name of 
23390 74 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a  the temp file..*
233a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
233b0 65 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c  earTempFile(Shel
233c0 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66  lState *p){.  if
233d0 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
233e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
233f0 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
23400 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
23410 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70  hellDeleteFile(p
23420 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72  ->zTempFile) ) r
23430 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
23440 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69  _free(p->zTempFi
23450 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46  le);.  p->zTempF
23460 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ile = 0;.}../*.*
23470 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74  * Create a new t
23480 65 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69  emp file name wi
23490 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66  th the given suf
234a0 66 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  fix..*/.static v
234b0 6f 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28  oid newTempFile(
234c0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
234d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66  onst char *zSuff
234e0 69 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70  ix){.  clearTemp
234f0 46 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  File(p);.  sqlit
23500 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70  e3_free(p->zTemp
23510 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d  File);.  p->zTem
23520 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28  pFile = 0;.  if(
23530 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71   p->db ){.    sq
23540 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23550 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c  ol(p->db, 0, SQL
23560 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
23570 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d  LENAME, &p->zTem
23580 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
23590 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
235a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
235b0 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73  _uint64 r;.    s
235c0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
235d0 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
235e0 3b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69  ;.    p->zTempFi
235f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
23600 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25  intf("temp%llx.%
23610 73 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b  s", r, zSuffix);
23620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
23630 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c  >zTempFile = sql
23640 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
23650 2e 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69  .%s", p->zTempFi
23660 6c 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20  le, zSuffix);.  
23670 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70  }.  if( p->zTemp
23680 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  File==0 ){.    r
23690 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
236a0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
236b0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
236c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
236d0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
236e0 69 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61  ion of SQL scala
236f0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f  r function fkey_
23700 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29  collate_clause()
23710 2c 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  , used.** by the
23720 20 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64   ".lint fkey-ind
23730 65 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54  exes" command. T
23740 68 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74  his scalar funct
23750 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ion is always.**
23760 20 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75   called with fou
23770 72 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68  r arguments - th
23780 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  e parent table n
23790 61 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  ame, the parent 
237a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20  column name,.** 
237b0 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20  the child table 
237c0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69  name and the chi
237d0 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  ld column name..
237e0 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c  **.**   fkey_col
237f0 6c 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72  late_clause('par
23800 65 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e  ent-tab', 'paren
23810 74 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74  t-col', 'child-t
23820 61 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27  ab', 'child-col'
23830 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ).**.** If eithe
23840 72 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74  r of the named t
23850 61 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73  ables or columns
23860 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74   do not exist, t
23870 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
23880 72 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79  returns an empty
23890 20 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74   string. An empt
238a0 79 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f  y string is also
238b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74   returned if bot
238c0 68 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20  h tables.** and 
238d0 63 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75  columns exist bu
238e0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
238f0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
23900 6e 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a  n sequence. Or,.
23910 2a 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74  ** if both exist
23920 20 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74   but the default
23930 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
23940 6e 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65  nces are differe
23950 6e 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  nt, this.** func
23960 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
23970 20 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54   string " COLLAT
23980 45 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74  E <parent-collat
23990 69 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20  ion>", where.** 
239a0 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
239b0 6e 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  n> is the defaul
239c0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
239d0 65 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65  ence of the pare
239e0 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  nt column..*/.st
239f0 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46  atic void shellF
23a00 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
23a10 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
23a20 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
23a30 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
23a40 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
23a50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
23a60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
23a70 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
23a80 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
23a90 2a 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73  *zParent;.  cons
23aa0 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43  t char *zParentC
23ab0 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
23ac0 20 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20   *zParentSeq;.  
23ad0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
23ae0 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ld;.  const char
23af0 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63   *zChildCol;.  c
23b00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
23b10 64 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  dSeq = 0;  /* In
23b20 69 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69  itialize to avoi
23b30 64 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  d false-positive
23b40 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   warning */.  in
23b50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
23b60 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50   nVal==4 );.  zP
23b70 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63  arent = (const c
23b80 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
23b90 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
23ba0 29 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20  );.  zParentCol 
23bb0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
23bc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
23bd0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a  t(apVal[1]);.  z
23be0 43 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63  Child = (const c
23bf0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
23c00 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
23c10 29 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d  );.  zChildCol =
23c20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
23c30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
23c40 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73  (apVal[3]);..  s
23c50 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
23c60 78 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c  xt(pCtx, "", -1,
23c70 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
23c80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
23c90 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
23ca0 61 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c  adata(.      db,
23cb0 20 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74   "main", zParent
23cc0 2c 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c  , zParentCol, 0,
23cd0 20 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c   &zParentSeq, 0,
23ce0 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
23cf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23d00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
23d10 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
23d20 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20  metadata(.      
23d30 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43    db, "main", zC
23d40 68 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c  hild, zChildCol,
23d50 20 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20   0, &zChildSeq, 
23d60 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  0, 0, 0.    );. 
23d70 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
23d80 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
23d90 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65  e3_stricmp(zPare
23da0 6e 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71  ntSeq, zChildSeq
23db0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
23dc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
23dd0 74 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22  tf(" COLLATE %s"
23de0 2c 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20  , zParentSeq);. 
23df0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
23e00 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
23e10 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
23e20 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
23e30 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  e3_free(z);.  }.
23e40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
23e50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23e60 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69  dot-command ".li
23e70 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
23e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23e90 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
23ea0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
23eb0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
23ec0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
23ed0 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
23ee0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
23ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23f00 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
23f10 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
23f20 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
23f30 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23f60 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
23f70 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  rg[] */.){.  sql
23f80 69 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74  ite3 *db = pStat
23f90 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20  e->db;       /* 
23fa0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
23fb0 74 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20  to query "main" 
23fc0 64 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20  db of */.  FILE 
23fd0 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
23fe0 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ut;        /* St
23ff0 72 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f  ream to write no
24000 6e 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74  n-error output t
24010 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62  o */.  int bVerb
24020 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ose = 0;        
24030 20 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65         /* If -ve
24040 72 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74  rbose is present
24050 20 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70   */.  int bGroup
24060 42 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20  ByParent = 0;   
24070 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f        /* If -gro
24080 75 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72  upbyparent is pr
24090 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esent */.  int i
240a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
240b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
240c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
240d0 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f   azArg[] */.  co
240e0 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e  nst char *zInden
240f0 74 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a  t = "";       /*
24100 20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64   How much to ind
24110 65 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  ent CREATE INDEX
24120 20 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   by */.  int rc;
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24150 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
24160 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20  ite3_stmt *pSql 
24170 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
24180 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  Compiled version
24190 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   of SQL statemen
241a0 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a  t below */..  /*
241b0 0a 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43  .  ** This SELEC
241c0 54 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  T statement retu
241d0 72 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20  rns one row for 
241e0 65 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79  each foreign key
241f0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a   constraint.  **
24200 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f   in the schema o
24210 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
24220 61 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ase. The column 
24230 76 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a  values are:.  **
24240 0a 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78  .  ** 0. The tex
24250 74 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74  t of an SQL stat
24260 65 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f  ement similar to
24270 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
24280 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
24290 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
242a0 4f 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57  OM child_table W
242b0 48 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f  HERE child_key=?
242c0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54  ".  **.  **    T
242d0 68 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69  his SELECT is si
242e0 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65  milar to the one
242f0 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
24300 6e 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74  n keys implement
24310 61 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65  ation.  **    ne
24320 65 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72  eds to run inter
24330 6e 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74  nally on child t
24340 61 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20  ables. If there 
24350 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
24360 20 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20   can.  **    be 
24370 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
24380 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65   this query, the
24390 6e 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65  n it can also be
243a0 20 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a   used by the FK.
243b0 20 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e    **    implemen
243c0 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69  tation to optimi
243d0 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44  ze DELETE or UPD
243e0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  ATE statements o
243f0 6e 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a  n the parent.  *
24400 2a 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  *    table..  **
24410 0a 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20  .  ** 1. A GLOB 
24420 70 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65  pattern suitable
24430 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72   for sqlite3_str
24440 67 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70  glob(). If the p
24450 6c 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20  lan output by.  
24460 2a 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49  **    the EXPLAI
24470 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
24480 6d 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69  mand matches thi
24490 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
244a0 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  the schema.  ** 
244b0 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69     contains an i
244c0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65  ndex that can be
244d0 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
244e0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
244f0 2a 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20  *.  ** 2. Human 
24500 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68  readable text th
24510 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
24520 20 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64   child table and
24530 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20   columns. e.g.. 
24540 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
24550 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c  child_table(chil
24560 64 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65  d_key1, child_ke
24570 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33  y2)".  **.  ** 3
24580 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  . Human readable
24590 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72   text that descr
245a0 69 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  ibes the parent 
245b0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
245c0 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
245d0 2a 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f  *       "parent_
245e0 74 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79  table(parent_key
245f0 31 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22  1, parent_key2)"
24600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20  .  **.  ** 4. A 
24610 66 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45  full CREATE INDE
24620 58 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  X statement for 
24630 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  an index that co
24640 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20  uld be used to. 
24650 20 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20   **    optimize 
24660 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
24670 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74   statements on t
24680 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e  he parent table.
24690 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
246a0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
246b0 44 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f  DEX child_table_
246c0 63 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69  child_key ON chi
246d0 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b  ld_table(child_k
246e0 65 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35  ey)".  **.  ** 5
246f0 2e 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  . The name of th
24700 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a  e parent table..
24710 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20    **.  ** These 
24720 73 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75  six values are u
24730 73 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67  sed by the C log
24740 69 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65  ic below to gene
24750 72 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e  rate the report.
24760 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
24770 61 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45  ar *zSql =.  "SE
24780 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20  LECT ".    "    
24790 20 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   'EXPLAIN QUERY 
247a0 50 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52  PLAN SELECT 1 FR
247b0 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  OM ' || quote(s.
247c0 6e 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45  name) || ' WHERE
247d0 20 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72   '".    "  || gr
247e0 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65  oup_concat(quote
247f0 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20  (s.name) || '.' 
24800 7c 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  || quote(f.[from
24810 5d 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20  ]) || '=?' ".   
24820 20 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c   "  || fkey_coll
24830 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20  ate_clause(".   
24840 20 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c   "       f.[tabl
24850 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
24860 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
24870 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
24880 29 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20  ),' AND ')".    
24890 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  ", ".    "     '
248a0 53 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c  SEARCH TABLE ' |
248b0 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53  | s.name || ' US
248c0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
248d0 45 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  EX*('".    "  ||
248e0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a   group_concat('*
248f0 3d 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c  =?', ' AND ') ||
24900 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
24910 20 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20     "     s.name 
24920 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70   || '(' || group
24930 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d  _concat(f.[from]
24940 2c 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22  ,  ', ') || ')'"
24950 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
24960 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c      f.[table] ||
24970 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f   '(' || group_co
24980 6e 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e  ncat(COALESCE(f.
24990 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29  [to], p.[name]))
249a0 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20   || ')'".    ", 
249b0 22 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45  ".    "     'CRE
249c0 41 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71  ATE INDEX ' || q
249d0 75 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f  uote(s.name ||'_
249e0 27 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  '|| group_concat
249f0 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29  (f.[from], '_'))
24a00 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e  ".    "  || ' ON
24a10 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
24a20 6d 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20  me) || '('".    
24a30 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  "  || group_conc
24a40 61 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d  at(quote(f.[from
24a50 5d 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20  ]) ||".    "    
24a60 20 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65      fkey_collate
24a70 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20  _clause(".    " 
24a80 20 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c           f.[tabl
24a90 65 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b  e], COALESCE(f.[
24aa0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20  to], p.[name]), 
24ab0 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d  s.name, f.[from]
24ac0 29 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20  ), ', ')".    " 
24ad0 20 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c   || ');'".    ",
24ae0 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
24af0 74 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52  table] ".    "FR
24b00 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
24b10 20 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f   AS s, pragma_fo
24b20 72 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73  reign_key_list(s
24b30 2e 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20  .name) AS f ".  
24b40 20 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61    "LEFT JOIN pra
24b50 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41  gma_table_info A
24b60 53 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71  S p ON (pk-1=seq
24b70 20 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61   AND p.arg=f.[ta
24b80 62 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f  ble]) ".    "GRO
24b90 55 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e  UP BY s.name, f.
24ba0 69 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20  id ".    "ORDER 
24bb0 42 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20  BY (CASE WHEN ? 
24bc0 54 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45  THEN f.[table] E
24bd0 4c 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22  LSE s.name END)"
24be0 0a 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  .  ;.  const cha
24bf0 72 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53  r *zGlobIPK = "S
24c00 45 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53  EARCH TABLE * US
24c10 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
24c20 41 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f  ARY KEY (rowid=?
24c30 29 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20  )";..  for(i=2; 
24c40 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
24c50 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
24c60 33 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  30(azArg[i]);.  
24c70 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c    if( n>1 && sql
24c80 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
24c90 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b  verbose", azArg[
24ca0 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  i], n)==0 ){.   
24cb0 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b     bVerbose = 1;
24cc0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
24cd0 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
24ce0 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72  e3_strnicmp("-gr
24cf0 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a  oupbyparent", az
24d00 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b  Arg[i], n)==0 ){
24d10 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50  .      bGroupByP
24d20 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  arent = 1;.     
24d30 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20   zIndent = "    
24d40 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ";.    }.    els
24d50 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
24d60 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
24d70 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62  ge: %s %s ?-verb
24d80 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61  ose? ?-groupbypa
24d90 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20  rent?\n",.      
24da0 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a      azArg[0], az
24db0 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a  Arg[1].      );.
24dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24dd0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
24de0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
24df0 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c  ter the fkey_col
24e00 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51  late_clause() SQ
24e10 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  L function */.  
24e20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
24e30 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
24e40 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63   "fkey_collate_c
24e50 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54  lause", 4, SQLIT
24e60 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c  E_UTF8,.      0,
24e70 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74   shellFkeyCollat
24e80 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20  eClause, 0, 0.  
24e90 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  );...  if( rc==S
24ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
24ec0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
24ed0 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b  , -1, &pSql, 0);
24ee0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
24ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24f00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
24f10 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70  (pSql, 1, bGroup
24f20 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a  ByParent);.  }..
24f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
24f50 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  c2;.    char *zP
24f60 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  rev = 0;.    whi
24f70 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
24f80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
24f90 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l) ){.      int 
24fa0 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  res = -1;.      
24fb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
24fc0 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20  xplain = 0;.    
24fd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
24fe0 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  QP = (const char
24ff0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
25000 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
25010 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
25020 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74   *zGlob = (const
25030 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
25040 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
25050 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   1);.      const
25060 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28   char *zFrom = (
25070 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
25080 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
25090 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20  pSql, 2);.      
250a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72  const char *zTar
250b0 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  get = (const cha
250c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
250d0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b  n_text(pSql, 3);
250e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
250f0 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20  r *zCI = (const 
25100 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
25110 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
25120 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  4);.      const 
25130 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20  char *zParent = 
25140 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
25150 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
25160 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20  (pSql, 5);..    
25170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
25180 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
25190 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
251a0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
251b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
251c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
251d0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
251e0 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
251f0 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ain) ){.        
25200 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61  const char *zPla
25210 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
25220 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
25230 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
25240 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  );.        res =
25250 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
25260 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
25270 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e  lob(zGlob, zPlan
25280 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
25290 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
252a0 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c  ob(zGlobIPK, zPl
252b0 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  an).        );. 
252c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
252d0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
252e0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
252f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25300 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  TE_OK ) break;..
25310 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
25320 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
25330 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
25340 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65  rror: internal e
25350 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20  rror");.        
25360 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
25370 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
25380 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20  bGroupByParent. 
25390 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62         && (bVerb
253a0 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20  ose || res==0). 
253b0 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76         && (zPrev
253c0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
253d0 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20  tricmp(zParent, 
253e0 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20  zPrev)).        
253f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
25400 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
25410 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73   Parent table %s
25420 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  \n", zParent);. 
25430 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25440 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20  _free(zPrev);.  
25450 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20          zPrev = 
25460 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
25470 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  "%s", zParent);.
25480 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
25490 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
254a0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
254b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73  rintf(out, "%s%s
254c0 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64   --> %s\n", zInd
254d0 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65  ent, zCI, zTarge
254e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
254f0 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29  e if( bVerbose )
25500 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
25510 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f  printf(out, "%s/
25520 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78  * no extra index
25530 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
25540 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a  %s -> %s */\n",.
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49                zI
25560 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54  ndent, zFrom, zT
25570 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20  arget.          
25580 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25590 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
255a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65  qlite3_free(zPre
255b0 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21  v);..    if( rc!
255c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
255d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
255e0 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73  tderr, "%s\n", s
255f0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
25600 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ));.    }..    r
25610 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
25620 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20  alize(pSql);.   
25630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25640 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54  OK && rc2!=SQLIT
25650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
25660 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61   = rc2;.      ra
25670 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25680 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
25690 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
256a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
256b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
256c0 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
256d0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
256e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
256f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
25700 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
25710 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  lint" dot comman
25720 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25730 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
25740 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
25750 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
25760 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
25770 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
25780 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
25790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
257a0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
257b0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
257c0 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
257d0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25800 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
25810 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
25820 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e   n;.  n = (nArg>
25830 3d 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a  =2 ? strlen30(az
25840 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20  Arg[1]) : 0);.  
25850 69 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74  if( n<1 || sqlit
25860 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72  e3_strnicmp(azAr
25870 67 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65  g[1], "fkey-inde
25880 78 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20  xes", n) ) goto 
25890 75 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  usage;.  return 
258a0 6c 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28  lintFkeyIndexes(
258b0 70 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e  pState, azArg, n
258c0 41 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20  Arg);.. usage:. 
258d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
258e0 72 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75  rr, "Usage %s su
258f0 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63  b-command ?switc
25900 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72  hes...?\n", azAr
25910 67 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69  g[0]);.  raw_pri
25920 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65  ntf(stderr, "Whe
25930 72 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20  re sub-commands 
25940 61 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f  are:\n");.  raw_
25950 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25960 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
25970 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  \n");.  return S
25980 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
25990 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
259a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
259b0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
259c0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
259d0 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  IB)./***********
259e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
259f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25a20 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e  ******.** The ".
25a30 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72  archive" or ".ar
25a40 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  " command..*/.st
25a50 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
25a60 72 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  repare(.  sqlite
25a70 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
25a80 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  Rc, .  const cha
25a90 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69  r *zSql, .  sqli
25aa0 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
25ab0 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  t.){.  *ppStmt =
25ac0 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
25ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ae0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25af0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
25b00 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
25b10 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
25b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25b30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
25b40 28 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72  (stderr, "sql er
25b50 72 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c  ror: %s (%d)\n",
25b60 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
25b70 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
25b80 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
25b90 64 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  db).      );.   
25ba0 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
25bb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
25bc0 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
25bd0 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c  arePrintf(.  sql
25be0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
25bf0 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
25c00 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
25c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25c20 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20  Fmt, .  ....){. 
25c30 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
25c40 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
25c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
25c60 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20  st ap;.    char 
25c70 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  *z;.    va_start
25c80 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20  (ap, zFmt);.    
25c90 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
25ca0 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
25cb0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
25cc0 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
25cd0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
25ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c  else{.      shel
25cf0 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63  lPrepare(db, pRc
25d00 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20  , z, ppStmt);.  
25d10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25d20 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  (z);.    }.  }.}
25d30 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
25d40 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69  ellFinalize(.  i
25d50 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
25d60 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
25d70 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  ){.  if( pStmt )
25d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
25d90 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
25da0 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
25db0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
25dc0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
25dd0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  t);.    if( *pRc
25de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25df0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25e10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
25e20 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
25e30 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
25e40 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
25e50 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20     }.      *pRc 
25e60 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = rc;.    }.  }.
25e70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  }..static void s
25e80 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74  hellReset(.  int
25e90 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
25ea0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
25eb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
25ec0 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
25ed0 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
25ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25f00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25f10 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
25f20 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29  db_handle(pStmt)
25f30 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
25f40 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
25f50 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
25f60 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
25f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  );.    }.    *pR
25f80 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a  c = rc;.  }.}./*
25f90 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65  .** Structure re
25fa0 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e  presenting a sin
25fb0 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e  gle ".ar" comman
25fc0 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  d..*/.typedef st
25fd0 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41  ruct ArCommand A
25fe0 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74  rCommand;.struct
25ff0 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75   ArCommand {.  u
26000 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20  8 eCmd;         
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26020 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61  * An AR_CMD_* va
26030 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72  lue */.  u8 bVer
26040 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
26050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26060 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f   if --verbose */
26070 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20  .  u8 bZip;     
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
260a0 65 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a  e archive is a Z
260b0 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52  IP */.  u8 bDryR
260c0 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
260d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
260e0 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a  if --dry-run */.
260f0 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20    u8 bAppend;   
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26110 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61    /* True if --a
26120 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72  ppend */.  u8 fr
26130 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20  omCmdLine;      
26140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
26150 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61  n from -A instea
26160 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f  d of .archive */
26170 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
261a0 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
261b0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72  s */.  char *zSr
261c0 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  cTable;         
261d0 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72         /* "sqlar
261e0 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c  ", "zipfile($fil
261f0 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a  e)" or "zip" */.
26200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26210 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
26220 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75    /* --file argu
26230 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
26240 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26250 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dir;            
26260 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72     /* --director
26270 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e  y argument, or N
26280 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ULL */.  char **
26290 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  azArg;          
262a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
262b0 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  y of command arg
262c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c  uments */.  Shel
262d0 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20  lState *p;      
262e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
262f0 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  hell state */.  
26300 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74  /* Database cont
26330 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69  aining the archi
26340 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
26350 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
26360 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61  ssage for the .a
26370 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64  r command to std
26380 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53  err and return S
26390 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
263a0 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61  static int arUsa
263b0 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73  ge(FILE *f){.  s
263c0 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69  howHelp(f,"archi
263d0 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ve");.  return S
263e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
263f0 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
26400 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
26410 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
26420 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
26430 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
26440 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
26450 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67  c int arErrorMsg
26460 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c  (ArCommand *pAr,
26470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
26480 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
26490 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
264a0 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
264b0 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71   zFmt);.  z = sq
264c0 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
264d0 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  Fmt, ap);.  va_e
264e0 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70  nd(ap);.  utf8_p
264f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
26500 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  rror: %s\n", z);
26510 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d  .  if( pAr->from
26520 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75  CmdLine ){.    u
26530 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26540 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66  r, "Use \"-A\" f
26550 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
26560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
26570 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26580 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69  r, "Use \".archi
26590 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20  ve --help\" for 
265a0 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20  more help\n");. 
265b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
265c0 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(z);.  return S
265d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
265e0 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72  /*.** Values for
265f0 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e   ArCommand.eCmd.
26600 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43  .*/.#define AR_C
26610 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20  MD_CREATE       
26620 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  1.#define AR_CMD
26630 5f 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a  _EXTRACT      2.
26640 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c  #define AR_CMD_L
26650 49 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64  IST         3.#d
26660 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44  efine AR_CMD_UPD
26670 41 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66  ATE       4.#def
26680 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
26690 20 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a          5../*.**
266a0 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
266b0 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
266c0 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
266d0 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20  TCH_VERBOSE     
266e0 36 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  6.#define AR_SWI
266f0 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20  TCH_FILE        
26700 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  7.#define AR_SWI
26710 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20  TCH_DIRECTORY   
26720 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  8.#define AR_SWI
26730 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20  TCH_APPEND      
26740 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  9.#define AR_SWI
26750 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31  TCH_DRYRUN     1
26760 30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  0..static int ar
26770 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72  ProcessSwitch(Ar
26780 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e  Command *pAr, in
26790 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74  t eSwitch, const
267a0 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
267b0 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20  switch( eSwitch 
267c0 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  ){.    case AR_C
267d0 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63  MD_CREATE:.    c
267e0 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
267f0 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  CT:.    case AR_
26800 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61  CMD_LIST:.    ca
26810 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  se AR_CMD_UPDATE
26820 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
26830 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66  D_HELP:.      if
26840 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20  ( pAr->eCmd ){. 
26850 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
26860 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d  ErrorMsg(pAr, "m
26870 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20  ultiple command 
26880 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20  options");.     
26890 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43   }.      pAr->eC
268a0 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20  md = eSwitch;.  
268b0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
268c0 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44  case AR_SWITCH_D
268d0 52 59 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72  RYRUN:.      pAr
268e0 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20  ->bDryRun = 1;. 
268f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26900 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56  case AR_SWITCH_V
26910 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41  ERBOSE:.      pA
26920 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  r->bVerbose = 1;
26930 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26940 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
26950 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70  _APPEND:.      p
26960 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b  Ar->bAppend = 1;
26970 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
26980 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20  hru into --file 
26990 2a 2f 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  */.    case AR_S
269a0 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20  WITCH_FILE:.    
269b0 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a    pAr->zFile = z
269c0 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Arg;.      break
269d0 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
269e0 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a  ITCH_DIRECTORY:.
269f0 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20        pAr->zDir 
26a00 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
26a10 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
26a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26a30 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65  ./*.** Parse the
26a40 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f   command line fo
26a50 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61  r an ".ar" comma
26a60 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20  nd. The results 
26a70 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
26a80 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a  .** structure (*
26a90 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pAr). SQLITE_OK 
26aa0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
26ab0 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
26ac0 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63  is parsed.** suc
26ad0 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72  cessfully, other
26ae0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  wise an error me
26af0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
26b00 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a   to stderr and .
26b10 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
26b20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26b30 74 69 63 20 69 6e 74 20 61 72 50 61 72 73 65 43  tic int arParseC
26b40 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a  ommand(.  char *
26b50 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
26b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
26b70 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
26b80 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
26b90 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
26ba0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
26bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26bc0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
26bd0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  in azArg[] */.  
26be0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20  ArCommand *pAr  
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
26c10 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
26c20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
26c30 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
26c40 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61   *zLong;.    cha
26c50 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38  r cShort;.    u8
26c60 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38   eSwitch;.    u8
26c70 20 62 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74   bArg;.  } aSwit
26c80 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ch[] = {.    { "
26c90 63 72 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c  create",    'c',
26ca0 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20   AR_CMD_CREATE, 
26cb0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
26cc0 20 22 65 78 74 72 61 63 74 22 2c 20 20 20 27 78   "extract",   'x
26cd0 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ', AR_CMD_EXTRAC
26ce0 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  T,      0 },.   
26cf0 20 7b 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20   { "list",      
26d00 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54  't', AR_CMD_LIST
26d10 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
26d20 20 20 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20     { "update",  
26d30 20 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50    'u', AR_CMD_UP
26d40 44 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c  DATE,       0 },
26d50 0a 20 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20  .    { "help",  
26d60 20 20 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f      'h', AR_CMD_
26d70 48 45 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20  HELP,         0 
26d80 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73  },.    { "verbos
26d90 65 22 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57  e",   'v', AR_SW
26da0 49 54 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20  ITCH_VERBOSE,   
26db0 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65  0 },.    { "file
26dc0 22 2c 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f  ",      'f', AR_
26dd0 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20  SWITCH_FILE,    
26de0 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70    1 },.    { "ap
26df0 70 65 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41  pend",    'a', A
26e00 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c  R_SWITCH_APPEND,
26e10 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
26e20 64 69 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c  directory", 'C',
26e30 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
26e40 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b  TORY, 1 },.    {
26e50 20 22 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e   "dryrun",    'n
26e60 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  ', AR_SWITCH_DRY
26e70 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d  RUN,    0 },.  }
26e80 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20  ;.  int nSwitch 
26e90 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68  = sizeof(aSwitch
26ea0 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63  ) / sizeof(struc
26eb0 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73  t ArSwitch);.  s
26ec0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
26ed0 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b  pEnd = &aSwitch[
26ee0 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28  nSwitch];..  if(
26ef0 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20   nArg<=1 ){.    
26f00 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
26f10 72 72 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65  rr, "Wrong numbe
26f20 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
26f30 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20   Usage:\n");.   
26f40 20 72 65 74 75 72 6e 20 61 72 55 73 61 67 65 28   return arUsage(
26f50 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65  stderr);.  }else
26f60 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
26f70 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66  azArg[1];.    if
26f80 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
26f90 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f       /* Traditio
26fa0 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20  nal style [tar] 
26fb0 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
26fc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
26fd0 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20   int iArg = 2;. 
26fe0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
26ff0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
27000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
27010 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
27020 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
27030 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66  *pOpt;.        f
27040 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
27050 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
27060 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
27070 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
27080 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
27090 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
270a0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
270b0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
270c0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
270d0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
270e0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63  nized option: %c
270f0 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
27100 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27110 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20  pOpt->bArg ){.  
27120 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
27130 3e 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20  >=nArg ){.      
27140 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
27150 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70  rrorMsg(pAr, "op
27160 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
27170 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
27180 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
27190 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
271a0 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
271b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
271c0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
271d0 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
271e0 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
271f0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
27200 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
27210 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
27220 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
27230 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
27240 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
27250 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
27260 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
27270 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27280 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
27290 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
272a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
272b0 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
272c0 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
272d0 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
272e0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
272f0 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
27300 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
27310 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
27320 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
27330 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
27340 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
27350 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
27360 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
27370 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
27380 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
27390 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
273a0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
273b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
273c0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
273d0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20  strlen30(z);..  
273e0 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d        if( z[1]!=
273f0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
27400 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
27410 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
27420 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a   short options *
27430 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
27440 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
27450 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
27460 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
27470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ;.            st
27480 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
27490 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
274a0 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
274b0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
274c0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
274d0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
274e0 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
274f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27510 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
27520 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
27530 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
27540 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63  rMsg(pAr, "unrec
27550 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
27560 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20  %c", z[i]);.    
27570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27580 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
27590 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
275a0 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31        if( i<(n-1
275b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
275c0 20 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69       zArg = &z[i
275d0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1];.           
275e0 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20       i = n;.    
275f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27610 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67   if( iArg>=(nArg
27620 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
27630 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27640 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
27650 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
27660 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63   an argument: %c
27670 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ",z[i]);.       
27680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27690 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
276a0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
276b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
276c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
276d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
276e0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
276f0 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
27700 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
27710 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
27720 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
27740 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  2]=='\0' ){.    
27750 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70        /* A -- op
27760 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67  tion, indicating
27770 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e   that all remain
27780 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
27790 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20   words.         
277a0 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20   ** are command 
277b0 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  arguments.  */. 
277c0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
277d0 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
277e0 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g+1];.          
277f0 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
27800 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20  -iArg-1;.       
27810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27830 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74     /* A long opt
27840 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
27850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
27860 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
27870 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66     /* Argument f
27880 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e  or option, if an
27890 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  y */.          s
278a0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
278b0 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
278c0 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74   /* Matching opt
278d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
278e0 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
278f0 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *pOpt;         
27900 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a     /* Iterator *
27910 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
27920 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
27930 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
27940 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
27950 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
27960 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e  ong = pOpt->zLon
27970 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g;.            i
27980 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e  f( (n-2)<=strlen
27990 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d  30(zLong) && 0==
279a0 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c  memcmp(&z[2], zL
279b0 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20  ong, n-2) ){.   
279c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
279d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
279e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
279f0 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20  arErrorMsg(pAr, 
27a00 22 61 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f  "ambiguous optio
27a10 6e 3a 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20  n: %s",z);.     
27a20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 70 4d 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20  pMatch = pOpt;. 
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27a60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27a70 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27a80 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d      if( pMatch==
27a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27aa0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27ab0 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67  sg(pAr, "unrecog
27ac0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  nized option: %s
27ad0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
27ae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
27af0 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b   pMatch->bArg ){
27b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27b10 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
27b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27b30 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
27b40 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
27b50 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
27b60 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  ment: %s", z);. 
27b70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27b80 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
27b90 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
27ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27bb0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
27bc0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d  ssSwitch(pAr, pM
27bd0 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a  atch->eSwitch, z
27be0 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
27bf0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
27c00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27c10 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
27c20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27c30 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
27c40 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
27c50 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77   all arguments w
27c60 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d  ithin the ArComm
27c70 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61  and.azArg[].** a
27c80 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61 72  rray refer to ar
27c90 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61  chive members, a
27ca0 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72  s for the --extr
27cb0 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f  act or --list co
27cc0 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63  mmands. .** It c
27cd0 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68 20  hecks that each 
27ce0 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65 73  of them are pres
27cf0 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63  ent. If any spec
27d00 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f  ified file is no
27d10 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  t.** present in 
27d20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20  the archive, an 
27d30 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64  error is printed
27d40 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61   to stderr and a
27d50 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  n error.** code 
27d60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
27d70 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63  ise, if all spec
27d80 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20  ified arguments 
27d90 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  are present in.*
27da0 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 53  * the archive, S
27db0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27dc0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
27dd0 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73   function strips
27de0 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f   any trailing '/
27df0 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  ' characters fro
27e00 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e  m each argument.
27e10 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73  .** This is cons
27e20 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65 20  istent with the 
27e30 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f  way the [tar] co
27e40 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77  mmand seems to w
27e50 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e  ork on.** Linux.
27e60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27e70 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72  rCheckEntries(Ar
27e80 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
27e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27ea0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e  _OK;.  if( pAr->
27eb0 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  nArg ){.    int 
27ec0 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65  i, j;.    sqlite
27ed0 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20  3_stmt *pTest = 
27ee0 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65  0;..    shellPre
27ef0 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e  parePrintf(pAr->
27f00 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c  db, &rc, &pTest,
27f10 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
27f20 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48   name FROM %s WH
27f30 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c  ERE name=$name",
27f40 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a   .        pAr->z
27f50 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a  SrcTable.    );.
27f60 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
27f70 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
27f80 6e 64 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61  ndex(pTest, "$na
27f90 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  me");.    for(i=
27fa0 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
27fb0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
27fc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
27fd0 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72  r *z = pAr->azAr
27fe0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  g[i];.      int 
27ff0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b  n = strlen30(z);
28000 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  .      int bOk =
28010 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
28020 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
28030 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  '/' ) n--;.     
28040 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20   z[n] = '\0';.  
28050 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
28060 5f 74 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20  _text(pTest, j, 
28070 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  z, -1, SQLITE_ST
28080 41 54 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28  ATIC);.      if(
28090 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
280a0 69 74 65 33 5f 73 74 65 70 28 70 54 65 73 74 29  ite3_step(pTest)
280b0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20   ){.        bOk 
280c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
280d0 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
280e0 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20  c, pTest);.     
280f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28100 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a  OK && bOk==0 ){.
28110 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
28120 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74  ntf(stderr, "not
28130 20 66 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76   found in archiv
28140 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  e: %s\n", z);.  
28150 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28160 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
28170 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
28180 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54  Finalize(&rc, pT
28190 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  est);.  }.  retu
281a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
281b0 46 6f 72 6d 61 74 20 61 20 57 48 45 52 45 20 63  Format a WHERE c
281c0 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62  lause that can b
281d0 65 20 75 73 65 64 20 61 67 61 69 6e 73 74 20 74  e used against t
281e0 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
281f0 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20   to.** identify 
28200 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62  all archive memb
28210 65 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ers that match t
28220 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  he command argum
28230 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20  ents held.** in 
28240 28 2a 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68  (*pAr). Leave th
28250 69 73 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  is WHERE clause 
28260 69 6e 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65  in (*pzWhere) be
28270 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
28280 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  ** The caller is
28290 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
282a0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
282b0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
282c0 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e  () on.** any non
282d0 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29  -NULL (*pzWhere)
282e0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
282f0 63 20 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c  c void arWhereCl
28300 61 75 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ause(.  int *pRc
28310 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  , .  ArCommand *
28320 70 41 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  pAr, .  char **p
28330 7a 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20  zWhere          
28340 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
28350 4e 65 77 20 57 48 45 52 45 20 63 6c 61 75 73 65  New WHERE clause
28360 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
28370 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28  Where = 0;.  if(
28380 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
28390 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d   ){.    if( pAr-
283a0 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >nArg==0 ){.    
283b0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
283c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b  e3_mprintf("1");
283d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
283e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
283f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20  onst char *zSep 
28400 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28  = "";.      for(
28410 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
28420 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
28440 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20  pAr->azArg[i];. 
28450 20 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20         zWhere = 
28460 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
28470 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a 25 73  .          "%z%s
28480 20 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20   name = '%q' OR 
28490 73 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64  substr(name,1,%d
284a0 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20  ) = '%q/'", .   
284b0 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a         zWhere, z
284c0 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30  Sep, z, strlen30
284d0 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20  (z)+1, z.       
284e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
284f0 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20  zWhere==0 ){.   
28500 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
28510 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
28520 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
28530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
28540 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20  Sep = " OR ";.  
28550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28560 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68    *pzWhere = zWh
28570 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  ere;.}../*.** Im
28580 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
28590 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61  .ar "lisT" comma
285a0 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
285b0 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64  nt arListCommand
285c0 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29  (ArCommand *pAr)
285d0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
285e0 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25  zSql = "SELECT %
285f0 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  s FROM %s WHERE 
28600 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68  %s"; .  const ch
28610 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b  ar *azCols[] = {
28620 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20  .    "name",.   
28630 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20   "lsmode(mode), 
28640 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69  sz, datetime(mti
28650 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29  me, 'unixepoch')
28660 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20  , name".  };..  
28670 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30  char *zWhere = 0
28680 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
28690 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
286a0 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72  t rc;..  rc = ar
286b0 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72  CheckEntries(pAr
286c0 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75  );.  arWhereClau
286d0 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57  se(&rc, pAr, &zW
286e0 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50  here);..  shellP
286f0 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72  reparePrintf(pAr
28700 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c  ->db, &rc, &pSql
28710 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70  , zSql, azCols[p
28720 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20  Ar->bVerbose],. 
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
28750 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69  le, zWhere);.  i
28760 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20  f( pAr->bDryRun 
28770 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
28780 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
28790 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
287a0 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65  sql(pSql));.  }e
287b0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
287c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
287d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
287e0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
287f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  ){.      if( pAr
28800 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
28810 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28820 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
28830 25 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73  %s % 10d  %s  %s
28840 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28850 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28860 74 65 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20  text(pSql, 0),. 
28870 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28880 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
28890 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20  ql, 1), .       
288a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
288b0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
288c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ),.            s
288d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
288e0 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20  xt(pSql, 3).    
288f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
28900 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  se{.        utf8
28910 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e  _printf(pAr->p->
28920 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
28930 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
28940 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20  (pSql, 0));.    
28950 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
28960 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
28970 63 2c 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69  c, pSql);.  sqli
28980 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29  te3_free(zWhere)
28990 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
289a0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
289b0 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
289c0 65 58 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64  eXtract" command
289d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
289e0 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e   arExtractComman
289f0 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  d(ArCommand *pAr
28a00 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
28a10 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53  *zSql1 = .    "S
28a20 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 28 24  ELECT ".    " ($
28a30 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20  dir || name),". 
28a40 20 20 20 22 20 77 72 69 74 65 66 69 6c 65 28 28     " writefile((
28a50 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25  $dir || name), %
28a60 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20  s, mode, mtime) 
28a70 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57  ".    "FROM %s W
28a80 48 45 52 45 20 28 25 73 29 20 41 4e 44 20 28 64  HERE (%s) AND (d
28a90 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24  ata IS NULL OR $
28aa0 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20  dirOnly = 0)".  
28ab0 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54    " AND name NOT
28ac0 20 47 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a   GLOB '*..[/\\]*
28ad0 27 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61  '";..  const cha
28ae0 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20  r *azExtraArg[] 
28af0 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f  = { .    "sqlar_
28b00 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c  uncompress(data,
28b10 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61   sz)",.    "data
28b20 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65  ".  };..  sqlite
28b30 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
28b40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28b50 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
28b60 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
28b70 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
28b80 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20  int i, j;..  /* 
28b90 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  If arguments are
28ba0 20 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63   specified, chec
28bb0 6b 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75  k that they actu
28bc0 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69  ally exist withi
28bd0 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69  n.  ** the archi
28be0 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ve before procee
28bf0 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c  ding. And formul
28c00 61 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ate a WHERE clau
28c10 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68  se to.  ** match
28c20 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20   them.  */.  rc 
28c30 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73  = arCheckEntries
28c40 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65  (pAr);.  arWhere
28c50 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c  Clause(&rc, pAr,
28c60 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66   &zWhere);..  if
28c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28c80 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
28c90 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44  zDir ){.      zD
28ca0 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ir = sqlite3_mpr
28cb0 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d  intf("%s/", pAr-
28cc0 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73  >zDir);.    }els
28cd0 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  e{.      zDir = 
28ce0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
28cf0 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "");.    }.    i
28d00 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20  f( zDir==0 ) rc 
28d10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
28d20 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70    }..  shellPrep
28d30 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
28d40 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a  b, &rc, &pSql, z
28d50 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45  Sql1, .      azE
28d60 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69  xtraArg[pAr->bZi
28d70 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62  p], pAr->zSrcTab
28d80 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a  le, zWhere.  );.
28d90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20  E_OK ){.    j = 
28db0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
28dc0 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
28dd0 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20  l, "$dir");.    
28de0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
28df0 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c  t(pSql, j, zDir,
28e00 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
28e10 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  IC);..    /* Run
28e20 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
28e30 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65  ement twice. The
28e40 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69   first time, wri
28e50 74 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  tefile() is call
28e60 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c  ed.    ** for al
28e70 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72  l archive member
28e80 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
28e90 20 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20   extracted. The 
28ea0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20  second time,.   
28eb0 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65   ** only for the
28ec0 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68   directories. Th
28ed0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
28ee0 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
28ef0 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65  .    ** extracte
28f00 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75  d directories mu
28f10 73 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65  st be reset afte
28f20 72 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c  r they are popul
28f30 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20  ated (as.    ** 
28f40 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20  populating them 
28f50 63 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65  changes the time
28f60 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20  stamp).  */.    
28f70 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
28f80 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71  +){.      j = sq
28f90 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
28fa0 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
28fb0 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20   "$dirOnly");.  
28fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
28fd0 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29  _int(pSql, j, i)
28fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  ;.      if( pAr-
28ff0 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  >bDryRun ){.    
29000 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29010 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73  pAr->p->out, "%s
29020 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  \n", sqlite3_sql
29030 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (pSql));.      }
29040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
29050 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29060 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
29070 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
29080 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Sql) ){.        
29090 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41    if( i==0 && pA
290a0 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  r->bVerbose ){. 
290b0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
290c0 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
290d0 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
290e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
290f0 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
29100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
29120 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
29130 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
29140 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
29150 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20  c, pSql);.  }.. 
29160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
29170 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ir);.  sqlite3_f
29180 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
29190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
291a0 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73  ** Run the SQL s
291b0 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c  tatement in zSql
291c0 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61  .  Or if doing a
291d0 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c   --dryrun, merel
291e0 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a  y print it out..
291f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
29200 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e  ExecSql(ArComman
29210 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68  d *pAr, const ch
29220 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
29230 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e   rc;.  if( pAr->
29240 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75  bDryRun ){.    u
29250 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
29260 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
29270 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
29280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
29290 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  se{.    char *zE
292a0 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  rr = 0;.    rc =
292b0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
292c0 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  r->db, zSql, 0, 
292d0 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  0, &zErr);.    i
292e0 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
292f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29300 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c  out, "ERROR: %s\
29310 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
29320 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
29330 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rr);.    }.  }. 
29340 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
29350 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
29360 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65  tion of .ar "cre
29370 61 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65  ate" and "update
29380 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a  " commands..**.*
29390 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
293a0 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
293b0 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
293c0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
293d0 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
293e0 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
293f0 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
29400 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
29410 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
29420 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
29430 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
29440 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
29450 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
29460 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
29470 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
29480 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
29490 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
294a0 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
294b0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
294c0 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
294d0 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
294e0 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
294f0 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
29500 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73   beginning..*/.s
29510 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
29520 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
29530 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
29540 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
29550 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
29560 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
29570 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
29580 55 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20  Update          
29590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
295a0 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
295b0 65 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d  e.  false for --
295c0 75 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  update */.){.  c
295d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61  onst char *zCrea
295e0 74 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45  te = .      "CRE
295f0 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
29600 20 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e   EXISTS sqlar(\n
29610 22 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20  ".      "  name 
29620 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
29630 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68  ,  -- name of th
29640 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20  e file\n".      
29650 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20  "  mode INT,    
29660 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63             -- ac
29670 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
29680 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69  \n".      "  mti
29690 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
296a0 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
296b0 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
296c0 22 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e  ".      "  sz IN
296d0 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
296e0 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66     -- original f
296f0 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20  ile size\n".    
29700 20 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20    "  data BLOB  
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
29720 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65  compressed conte
29730 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b  nt\n".      ")";
29740 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29750 44 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42  Drop = "DROP TAB
29760 4c 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c  LE IF EXISTS sql
29770 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ar";.  const cha
29780 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d  r *zInsertFmt[2]
29790 20 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41   = {.     "REPLA
297a0 43 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c  CE INTO %s(name,
297b0 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61  mode,mtime,sz,da
297c0 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
297d0 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
297e0 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
297f0 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
29800 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
29810 0a 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20  .     "    CASE 
29820 73 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f  substr(lsmode(mo
29830 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20  de),1,1)\n".    
29840 20 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27   "      WHEN '-'
29850 20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74   THEN length(dat
29860 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  a)\n".     "    
29870 20 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20    WHEN 'd' THEN 
29880 30 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  0\n".     "     
29890 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22   ELSE -1 END,\n"
298a0 0a 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72  .     "    sqlar
298b0 5f 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c  _compress(data)\
298c0 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
298d0 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a  fsdir(%Q,%Q)\n".
298e0 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73       "  WHERE ls
298f0 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c  mode(mode) NOT L
29900 49 4b 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20  IKE '?%%';",.   
29910 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
29920 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69  %s(name,mode,mti
29930 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20  me,data)\n".    
29940 20 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20   "  SELECT\n".  
29950 20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20     "    %s,\n". 
29960 20 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e      "    mode,\n
29970 22 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d  ".     "    mtim
29980 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
29990 64 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20  data\n".     "  
299a0 46 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51  FROM fsdir(%Q,%Q
299b0 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45  )\n".     "  WHE
299c0 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20  RE lsmode(mode) 
299d0 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22  NOT LIKE '?%%';"
299e0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20  .  };.  int i;  
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
29a10 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
29a20 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69   azFile[] */.  i
29a30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29a60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29a70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
29a80 20 20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20     /* SQL table 
29a90 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e  into which to in
29aa0 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sert */.  char *
29ab0 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65  zSql;.  char zTe
29ac0 6d 70 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65  mp[50];..  arExe
29ad0 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d  cSql(pAr, "PRAGM
29ae0 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22  A page_size=512"
29af0 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63  );.  rc = arExec
29b00 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f  Sql(pAr, "SAVEPO
29b10 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28  INT ar;");.  if(
29b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54   return rc;.  zT
29b40 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69  emp[0] = 0; .  i
29b50 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  f( pAr->bZip ){.
29b60 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
29b70 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69  e the zipfile vi
29b80 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20  rtual table, if 
29b90 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
29ba0 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20   if( pAr->zFile 
29bb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29bc0 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20  _uint64 r;.     
29bd0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
29be0 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72  ess(sizeof(r),&r
29bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29c00 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29c10 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a  (zTemp),zTemp,"z
29c20 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20  ip%016llx",r);. 
29c30 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d       zTab = zTem
29c40 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  p;.      zSql = 
29c50 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29c60 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
29c70 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
29c80 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69  temp.%s USING zi
29c90 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20  pfile(%Q)",.    
29ca0 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e       zTab, pAr->
29cb0 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  zFile.      );. 
29cc0 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63       rc = arExec
29cd0 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a  Sql(pAr, zSql);.
29ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29cf0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65  ee(zSql);.    }e
29d00 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20  lse{.      zTab 
29d10 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20  = "zip";.    }. 
29d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
29d30 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
29d40 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52  ble for an SQLAR
29d50 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22   */.    zTab = "
29d60 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20  sqlar";.    if( 
29d70 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20  bUpdate==0 ){.  
29d80 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
29d90 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a  ql(pAr, zDrop);.
29da0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29db0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
29dc0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
29dd0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  n;.    }.    rc 
29de0 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
29df0 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20   zCreate);.  }. 
29e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d   for(i=0; i<pAr-
29e10 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c  >nArg && rc==SQL
29e20 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
29e30 20 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20    char *zSql2 = 
29e40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
29e50 7a 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e  zInsertFmt[pAr->
29e60 62 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20  bZip], zTab,.   
29e70 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f       pAr->bVerbo
29e80 73 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73  se ? "shell_puts
29e90 6e 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d  nl(name)" : "nam
29ea0 65 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d  e",.        pAr-
29eb0 3e 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e  >azArg[i], pAr->
29ec0 7a 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  zDir);.    rc = 
29ed0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
29ee0 53 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  Sql2);.    sqlit
29ef0 65 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a  e3_free(zSql2);.
29f00 20 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73    }.end_ar_trans
29f10 61 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63  action:.  if( rc
29f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29f30 20 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72     arExecSql(pAr
29f40 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61  , "ROLLBACK TO a
29f50 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22 29  r; RELEASE ar;")
29f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29f70 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
29f80 72 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22  r, "RELEASE ar;"
29f90 29 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  );.    if( pAr->
29fa0 62 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69  bZip && pAr->zFi
29fb0 6c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  le ){.      zSql
29fc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
29fd0 74 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25  tf("DROP TABLE %
29fe0 73 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20  s", zTemp);.    
29ff0 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c    arExecSql(pAr,
2a000 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
2a010 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2a020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2a030 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a040 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2a050 20 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f   of ".ar" dot co
2a060 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
2a070 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e   int arDotComman
2a080 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
2a090 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
2a0a0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a0b0 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
2a0c0 20 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d   */.  int fromCm
2a0d0 64 4c 69 6e 65 2c 20 20 20 20 20 20 20 20 20 20  dLine,          
2a0e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a0f0 20 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   -A command-line
2a100 20 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72   option, not .ar
2a110 20 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a   cmd */.  char *
2a120 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
2a130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2a140 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
2a150 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
2a160 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
2a170 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
2a180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a190 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2a1a0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
2a1b0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64  .  ArCommand cmd
2a1c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65  ;.  int rc;.  me
2a1d0 6d 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69  mset(&cmd, 0, si
2a1e0 7a 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d  zeof(cmd));.  cm
2a1f0 64 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20  d.fromCmdLine = 
2a200 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72  fromCmdLine;.  r
2a210 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  c = arParseComma
2a220 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20  nd(azArg, nArg, 
2a230 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  &cmd);.  if( rc=
2a240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a250 20 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20    int eDbType = 
2a260 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
2a270 43 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70  C;.    cmd.p = p
2a280 53 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64  State;.    cmd.d
2a290 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
2a2a0 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
2a2b0 65 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79  e ){.      eDbTy
2a2c0 70 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62  pe = deduceDatab
2a2d0 61 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c  aseType(cmd.zFil
2a2e0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
2a2f0 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20  {.      eDbType 
2a300 3d 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f  = pState->openMo
2a310 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  de;.    }.    if
2a320 28 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c  ( eDbType==SHELL
2a330 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b  _OPEN_ZIPFILE ){
2a340 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
2a350 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52  Cmd==AR_CMD_EXTR
2a360 41 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ACT || cmd.eCmd=
2a370 3d 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a  =AR_CMD_LIST ){.
2a380 20 20 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e          if( cmd.
2a390 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
2a3a0 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61        cmd.zSrcTa
2a3b0 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ble = sqlite3_mp
2a3c0 72 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20  rintf("zip");.  
2a3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a3e0 20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54         cmd.zSrcT
2a3f0 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  able = sqlite3_m
2a400 70 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28  printf("zipfile(
2a410 25 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29  %Q)", cmd.zFile)
2a420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a430 20 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a    }.      cmd.bZ
2a440 69 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ip = 1;.    }els
2a450 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20  e if( cmd.zFile 
2a460 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  ){.      int fla
2a470 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  gs;.      if( cm
2a480 64 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54  d.bAppend ) eDbT
2a490 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
2a4a0 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
2a4b0 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d    if( cmd.eCmd==
2a4c0 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c  AR_CMD_CREATE ||
2a4d0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2a4e0 44 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  D_UPDATE ){.    
2a4f0 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
2a500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2a510 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2a520 45 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EATE;.      }els
2a530 65 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  e{.        flags
2a540 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2a550 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
2a560 0a 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20  .      cmd.db = 
2a570 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  0;.      if( cmd
2a580 2e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20  .bDryRun ){.    
2a590 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2a5a0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d  pState->out, "--
2a5b0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27   open database '
2a5c0 25 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46  %s'%s\n", cmd.zF
2a5d0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
2a5e0 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
2a5f0 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
2a600 3f 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76  ? " using 'apndv
2a610 66 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20  fs'" : "");.    
2a620 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
2a630 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63  qlite3_open_v2(c
2a640 6d 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64  md.zFile, &cmd.d
2a650 62 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20  b, flags, .     
2a660 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
2a670 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
2a680 4e 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73  NDVFS ? "apndvfs
2a690 22 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66  " : 0);.      if
2a6a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a6b0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2a6c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a6d0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
2a6e0 3a 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20  : %s (%s)\n", . 
2a6f0 20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a             cmd.z
2a700 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  File, sqlite3_er
2a710 72 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20  rmsg(cmd.db).   
2a720 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2a730 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
2a740 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
2a750 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69     sqlite3_filei
2a760 6f 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30  o_init(cmd.db, 0
2a770 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2a780 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63  te3_sqlar_init(c
2a790 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  md.db, 0, 0);.  
2a7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
2a7b0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e  te_function(cmd.
2a7c0 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  db, "shell_putsn
2a7d0 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
2a7e0 46 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20  F8, cmd.p,.     
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a800 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75           shellPu
2a810 74 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a  tsFunc, 0, 0);..
2a820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d      }.    if( cm
2a830 64 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26  d.zSrcTable==0 &
2a840 26 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26  & cmd.bZip==0 &&
2a850 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d   cmd.eCmd!=AR_CM
2a860 44 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20  D_HELP ){.      
2a870 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52  if( cmd.eCmd!=AR
2a880 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20  _CMD_CREATE.    
2a890 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61     && sqlite3_ta
2a8a0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
2a8b0 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71  ata(cmd.db,0,"sq
2a8c0 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c  lar","name",0,0,
2a8d0 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a  0,0,0).      ){.
2a8e0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2a8f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74  ntf(stderr, "dat
2a900 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  abase does not c
2a910 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72  ontain an 'sqlar
2a920 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20  ' table\n");.   
2a930 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a940 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2a950 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d  goto end_ar_comm
2a960 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  and;.      }.   
2a970 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
2a980 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2a990 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20  tf("sqlar");.   
2a9a0 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
2a9b0 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20  cmd.eCmd ){.    
2a9c0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52    case AR_CMD_CR
2a9d0 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63  EATE:.        rc
2a9e0 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64   = arCreateOrUpd
2a9f0 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c  ateCommand(&cmd,
2aa00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
2aa10 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2aa20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
2aa30 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
2aa40 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63  xtractCommand(&c
2aa50 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
2aa60 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2aa70 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
2aa80 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
2aa90 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20  Command(&cmd);. 
2aaa0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2aab0 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
2aac0 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61  _HELP:.        a
2aad0 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f  rUsage(pState->o
2aae0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ut);.        bre
2aaf0 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75  ak;..      defau
2ab00 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
2ab10 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  rt( cmd.eCmd==AR
2ab20 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20  _CMD_UPDATE );. 
2ab30 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72         rc = arCr
2ab40 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d  eateOrUpdateComm
2ab50 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20  and(&cmd, 1);.  
2ab60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ab70 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
2ab80 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
2ab90 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
2aba0 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  ){.    close_db(
2abb0 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73  cmd.db);.  }.  s
2abc0 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e  qlite3_free(cmd.
2abd0 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72  zSrcTable);..  r
2abe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45  eturn rc;.}./* E
2abf0 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68  nd of the ".arch
2ac00 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f  ive" or ".ar" co
2ac10 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  mmand logic.****
2ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2ac70 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2ac80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2ac90 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2aca0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2acb0 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f  AVE_ZLIB) */.../
2acc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
2acd0 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
2ace0 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
2acf0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
2ad00 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
2ad10 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
2ad20 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
2ad30 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
2ad40 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
2ad50 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
2ad60 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
2ad70 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61  *zLine, ShellSta
2ad80 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20  te *p){.  int h 
2ad90 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
2ada0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
2adb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
2adc0 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
2add0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2ade0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2adf0 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  BLE.  if( p->exp
2ae00 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
2ae10 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28     expertFinish(
2ae20 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  p, 1, 0);.  }.#e
2ae30 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65  ndif..  /* Parse
2ae40 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20   the input line 
2ae50 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  into tokens..  *
2ae60 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65  /.  while( zLine
2ae70 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61  [h] && nArg<Arra
2ae80 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a  ySize(azArg) ){.
2ae90 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
2aea0 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20  ce(zLine[h]) ){ 
2aeb0 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a  h++; }.    if( z
2aec0 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65  Line[h]==0 ) bre
2aed0 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e  ak;.    if( zLin
2aee0 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c  e[h]=='\'' || zL
2aef0 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20  ine[h]=='"' ){. 
2af00 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d       int delim =
2af10 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20   zLine[h++];.   
2af20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
2af30 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
2af40 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
2af50 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21  [h] && zLine[h]!
2af60 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20  =delim ){.      
2af70 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2af80 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27  '\\' && delim=='
2af90 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d  "' && zLine[h+1]
2afa0 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20  !=0 ) h++;.     
2afb0 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     h++;.      }.
2afc0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
2afd0 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20  h]==delim ){.   
2afe0 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20       zLine[h++] 
2aff0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2b000 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22     if( delim=='"
2b010 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  ' ) resolve_back
2b020 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
2b030 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg-1]);.    }els
2b040 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  e{.      azArg[n
2b050 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
2b060 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
2b070 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73   zLine[h] && !Is
2b080 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20  Space(zLine[h]) 
2b090 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ h++; }.      
2b0a0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a  if( zLine[h] ) z
2b0b0 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
2b0c0 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63       resolve_bac
2b0d0 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e  kslashes(azArg[n
2b0e0 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg-1]);.    }. 
2b0f0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
2b100 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e   the input line.
2b110 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67  .  */.  if( nArg
2b120 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2b130 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f  /* no tokens, no
2b140 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20   error */.  n = 
2b150 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30  strlen30(azArg[0
2b160 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b  ]);.  c = azArg[
2b170 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65  0][0];.  clearTe
2b180 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e  mpFile(p);..#ifn
2b190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b1a0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
2b1b0 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74  if( c=='a' && st
2b1c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2b1d0 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  "auth", n)==0 ){
2b1e0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2b1f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2b200 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2b210 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46  age: .auth ON|OF
2b220 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  F\n");.      rc 
2b230 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2b240 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2b250 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
2b260 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2b270 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
2b280 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20  (azArg[1]) ){.  
2b290 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
2b2a0 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
2b2b0 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b  , shellAuth, p);
2b2c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b2d0 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
2b2e0 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
2b2f0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
2b300 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
2b310 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b320 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2b330 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
2b340 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
2b350 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26  .  if( c=='a' &&
2b360 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b370 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29  ], "archive", n)
2b380 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2b390 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2b3a0 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28   = arDotCommand(
2b3b0 70 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72  p, 0, azArg, nAr
2b3c0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  g);.  }else.#end
2b3d0 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62  if..  if( (c=='b
2b3e0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2b3f0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2b400 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a  backup", n)==0).
2b410 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26     || (c=='s' &&
2b420 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2b430 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65  (azArg[0], "save
2b440 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ", n)==0).  ){. 
2b450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b460 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20  DestFile = 0;.  
2b470 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2b480 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  b = 0;.    sqlit
2b490 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73  e3 *pDest;.    s
2b4a0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70  qlite3_backup *p
2b4b0 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20  Backup;.    int 
2b4c0 6a 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  j;.    const cha
2b4d0 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20  r *zVfs = 0;.   
2b4e0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67   for(j=1; j<nArg
2b4f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; j++){.      co
2b500 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
2b510 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[j];.      if
2b520 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
2b530 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d         if( z[1]=
2b540 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2b550 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2b560 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20  , "-append")==0 
2b570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66  ){.          zVf
2b580 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20  s = "apndvfs";. 
2b590 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
2b5a0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2b5b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b5c0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
2b5d0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41  tion: %s\n", azA
2b5e0 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[j]);.        
2b5f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2b600 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2b610 65 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d  e if( zDestFile=
2b620 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
2b630 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  estFile = azArg[
2b640 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  j];.      }else 
2b650 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
2b660 20 20 20 20 20 20 7a 44 62 20 3d 20 7a 44 65 73        zDb = zDes
2b670 74 46 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a  tFile;.        z
2b680 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41 72 67  DestFile = azArg
2b690 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [j];.      }else
2b6a0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2b6b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2b6c0 61 67 65 3a 20 2e 62 61 63 6b 75 70 20 3f 44 42  age: .backup ?DB
2b6d0 3f 20 3f 2d 2d 61 70 70 65 6e 64 3f 20 46 49 4c  ? ?--append? FIL
2b6e0 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
2b6f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2b700 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b710 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
2b720 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2b730 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73  ntf(stderr, "mis
2b740 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72  sing FILENAME ar
2b750 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75  gument on .backu
2b760 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74  p\n");.      ret
2b770 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b780 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44   if( zDb==0 ) zD
2b790 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20  b = "main";.    
2b7a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2b7b0 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65 2c 20  n_v2(zDestFile, 
2b7c0 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20 20 20  &pDest, .       
2b7d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2b7e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2b7f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2b800 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  ATE, zVfs);.    
2b810 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b820 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
2b830 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b840 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2b850 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 44  en \"%s\"\n", zD
2b860 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  estFile);.      
2b870 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2b880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2b890 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2b8a0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
2b8b0 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
2b8c0 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
2b8d0 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
2b8e0 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
2b8f0 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
2b900 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b910 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2b920 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2b930 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
2b940 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44       close_db(pD
2b950 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
2b960 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2b970 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
2b980 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
2b990 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
2b9a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
2b9b0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
2b9c0 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
2b9d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2b9e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
2b9f0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2ba00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
2ba10 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2ba20 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2ba30 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2ba40 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63  Dest));.      rc
2ba50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2ba60 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
2ba70 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2ba80 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2ba90 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2baa0 30 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d  0], "bail", n)==
2bab0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2bac0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61  g==2 ){.      ba
2bad0 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f  il_on_error = bo
2bae0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
2baf0 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2bb00 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2bb10 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2bb20 3a 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e  : .bail on|off\n
2bb30 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2bb40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2bb50 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
2bb60 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2bb70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61  (azArg[0], "bina
2bb80 72 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ry", n)==0 ){.  
2bb90 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2bba0 0a 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65  .      if( boole
2bbb0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2bbc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ) ){.        set
2bbd0 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75  BinaryMode(p->ou
2bbe0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 1);.      }el
2bbf0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54  se{.        setT
2bc00 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
2bc10 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
2bc20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2bc30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bc40 22 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20  "Usage: .binary 
2bc50 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2bc60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2bc70 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2bc80 3d 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70 28  =='c' && strcmp(
2bc90 61 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d  azArg[0],"cd")==
2bca0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
2bcb0 67 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69  g==2 ){.#if defi
2bcc0 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2bcd0 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
2bce0 20 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d      wchar_t *z =
2bcf0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
2bd00 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61  tf8_to_unicode(a
2bd10 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2bd20 72 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74  rc = !SetCurrent
2bd30 44 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20  DirectoryW(z);. 
2bd40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bd50 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  e(z);.#else.    
2bd60 20 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41    rc = chdir(azA
2bd70 72 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  rg[1]);.#endif. 
2bd80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2bd90 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2bda0 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
2bdb0 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72  ot change to dir
2bdc0 65 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22  ectory \"%s\"\n"
2bdd0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2bde0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2bdf0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2be00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2be10 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2be20 20 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e   .cd DIRECTORY\n
2be30 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2be40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2be50 0a 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75  .  /* The undocu
2be60 6d 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f  mented ".breakpo
2be70 69 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75  int" command cau
2be80 73 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ses a call to th
2be90 65 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75  e no-op.  ** rou
2bea0 74 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f  tine named test_
2beb0 62 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20  breakpoint()..  
2bec0 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20  */.  if( c=='b' 
2bed0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2bee0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72  mp(azArg[0], "br
2bef0 65 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30  eakpoint", n)==0
2bf00 20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65   ){.    test_bre
2bf10 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c  akpoint();.  }el
2bf20 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2bf30 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2bf40 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2bf50 68 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29  hanges", n)==0 )
2bf60 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2bf70 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
2bf80 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
2bf90 4c 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c  LG_CountChanges,
2bfa0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2bfb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2bfc0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2bfd0 22 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73  "Usage: .changes
2bfe0 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20   on|off\n");.   
2bff0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2c000 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43  .  }else..  /* C
2c010 61 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64  ancel output red
2c020 69 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  irection, if it 
2c030 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
2c040 20 28 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a   (by .testcase).
2c050 20 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74    ** Then read t
2c060 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2c070 65 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  e testcase-out.t
2c080 78 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70  xt file and comp
2c090 61 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a  are against.  **
2c0a0 20 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74   azArg[1].  If t
2c0b0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
2c0c0 6e 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20  nces, report an 
2c0d0 65 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a  error and exit..
2c0e0 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63    */.  if( c=='c
2c0f0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
2c100 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c110 63 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b  check", n)==0 ){
2c120 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20  .    char *zRes 
2c130 3d 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f  = 0;.    output_
2c140 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66  reset(p);.    if
2c150 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
2c160 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2c170 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63  derr, "Usage: .c
2c180 68 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52  heck GLOB-PATTER
2c190 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  N\n");.      rc 
2c1a0 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2c1b0 66 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46  f( (zRes = readF
2c1c0 69 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75  ile("testcase-ou
2c1d0 74 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29  t.txt", 0))==0 )
2c1e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2c1f0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2c200 72 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27  r: cannot read '
2c210 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2c220 27 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  '\n");.      rc 
2c230 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 2;.    }else i
2c240 66 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  f( testcase_glob
2c250 28 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d  (azArg[1],zRes)=
2c260 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2c270 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  _printf(stderr,.
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 22 74 65 73 74 63 61 73 65 2d 25 73 20 46 41   "testcase-%s FA
2c2a0 49 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a  ILED\n Expected:
2c2b0 20 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74   [%s]\n      Got
2c2c0 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  : [%s]\n",.     
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
2c2e0 54 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b  Testcase, azArg[
2c2f0 31 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20  1], zRes);.     
2c300 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
2c310 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
2c320 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
2c330 65 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22  estcase-%s ok\n"
2c340 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b  , p->zTestcase);
2c350 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b  .      p->nCheck
2c360 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
2c370 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29  lite3_free(zRes)
2c380 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2c390 20 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63   c=='c' && strnc
2c3a0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c  mp(azArg[0], "cl
2c3b0 6f 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  one", n)==0 ){. 
2c3c0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2c3d0 7b 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f  {.      tryToClo
2c3e0 6e 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  ne(p, azArg[1]);
2c3f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c400 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2c410 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c  err, "Usage: .cl
2c420 6f 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  one FILENAME\n")
2c430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2c440 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2c450 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2c460 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >1 && strncmp(az
2c470 41 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73  Arg[0], "databas
2c480 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
2c490 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74    ShellState dat
2c4a0 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  a;.    char *zEr
2c4b0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70  rMsg = 0;.    op
2c4c0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2c4d0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
2c4e0 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
2c4f0 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
2c500 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
2c510 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2c520 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
2c530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2c540 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61  printf(sizeof(da
2c550 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  ta.colSeparator)
2c560 2c 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74  ,data.colSeparat
2c570 6f 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61  or,": ");.    da
2c580 74 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  ta.cnt = 0;.    
2c590 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2c5a0 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
2c5b0 2c 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67  , file FROM prag
2c5c0 6d 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74  ma_database_list
2c5d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c5e0 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64      callback, &d
2c5f0 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  ata, &zErrMsg);.
2c600 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
2c610 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2c620 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2c630 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
2c640 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
2c650 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2c660 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2c670 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2c680 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e   if( c=='d' && n
2c690 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2c6a0 7a 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66  zArg[0], "dbconf
2c6b0 69 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ig", n)==0 ){.  
2c6c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2c6d0 74 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68  truct DbConfigCh
2c6e0 6f 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f  oices {.      co
2c6f0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2c700 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20  .      int op;. 
2c710 20 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d     } aDbConfig[]
2c720 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22   = {.        { "
2c730 65 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20  enable_fkey",   
2c740 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2c750 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20  IG_ENABLE_FKEY  
2c760 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c770 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74       { "enable_t
2c780 72 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54  rigger",   SQLIT
2c790 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2c7a0 45 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20  E_TRIGGER       
2c7b0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2c7c0 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c  fts3_tokenizer",
2c7d0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2c7e0 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
2c7f0 4f 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20  OKENIZER  },.   
2c800 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74       { "load_ext
2c810 65 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54  ension",   SQLIT
2c820 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2c830 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
2c840 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2c850 6e 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65  no_ckpt_on_close
2c860 22 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ", SQLITE_DBCONF
2c870 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
2c880 4f 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  OSE       },.   
2c890 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71       { "enable_q
2c8a0 70 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54  psg",      SQLIT
2c8b0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
2c8c0 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20 20  E_QPSG          
2c8d0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
2c8e0 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20  trigger_eqp",   
2c8f0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
2c900 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20  IG_TRIGGER_EQP  
2c910 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c920 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61       { "reset_da
2c930 74 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54  tabase",   SQLIT
2c940 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54  E_DBCONFIG_RESET
2c950 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
2c960 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
2c970 69 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f  int ii, v;.    o
2c980 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2c990 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41    for(ii=0; ii<A
2c9a0 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66  rraySize(aDbConf
2c9b0 69 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ig); ii++){.    
2c9c0 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
2c9d0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
2c9e0 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a   aDbConfig[ii].z
2c9f0 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  Name)!=0 ) conti
2ca00 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
2ca10 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
2ca20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
2ca30 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f  fig(p->db, aDbCo
2ca40 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f  nfig[ii].op, boo
2ca50 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2ca60 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  2]), 0);.      }
2ca70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
2ca80 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
2ca90 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70  aDbConfig[ii].op
2caa0 2c 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20 20  , -1, &v);.     
2cab0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2cac0 6f 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e 22  out, "%18s %s\n"
2cad0 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e  , aDbConfig[ii].
2cae0 7a 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20  zName, v ? "on" 
2caf0 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20 20  : "off");.      
2cb00 69 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72 65  if( nArg>1 ) bre
2cb10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
2cb20 28 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d 3d  ( nArg>1 && ii==
2cb30 41 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e  ArraySize(aDbCon
2cb40 66 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75 74  fig) ){.      ut
2cb50 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2cb60 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  , "Error: unknow
2cb70 6e 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c  n dbconfig \"%s\
2cb80 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2cb90 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2cba0 74 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74 65  tf(stderr, "Ente
2cbb0 72 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20  r \".dbconfig\" 
2cbc0 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
2cbd0 73 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29  s for a list\n")
2cbe0 3b 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c  ;.    }   .  }el
2cbf0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
2cc00 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2cc10 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
2cc20 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  binfo", n)==0 ){
2cc30 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
2cc40 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70  dbinfo_command(p
2cc50 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a  , nArg, azArg);.
2cc60 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2cc70 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70  =='d' && strncmp
2cc80 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70  (azArg[0], "dump
2cc90 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2cca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b  const char *zLik
2ccb0 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  e = 0;.    int i
2ccc0 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53  ;.    int savedS
2ccd0 68 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73  howHeader = p->s
2cce0 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 69  howHeader;.    i
2ccf0 6e 74 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61  nt savedShellFla
2cd00 67 73 20 3d 20 70 2d 3e 73 68 65 6c 6c 46 6c 67  gs = p->shellFlg
2cd10 73 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61  s;.    ShellClea
2cd20 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  rFlag(p, SHFLG_P
2cd30 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46  reserveRowid|SHF
2cd40 4c 47 5f 4e 65 77 6c 69 6e 65 73 7c 53 48 46 4c  LG_Newlines|SHFL
2cd50 47 5f 45 63 68 6f 29 3b 0a 20 20 20 20 66 6f 72  G_Echo);.    for
2cd60 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
2cd70 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  +){.      if( az
2cd80 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29  Arg[i][0]=='-' )
2cd90 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2cda0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
2cdb0 69 5d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  i]+1;.        if
2cdc0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[0]=='-' ) z+
2cdd0 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  +;.        if( s
2cde0 74 72 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76  trcmp(z,"preserv
2cdf0 65 2d 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b  e-rowids")==0 ){
2ce00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2ce10 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2ce20 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
2ce30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54  rintf(stderr, "T
2ce40 68 65 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f  he --preserve-ro
2ce50 77 69 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e  wids option is n
2ce60 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20  ot compatible". 
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69              " wi
2ce90 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  th SQLITE_OMIT_V
2cea0 49 52 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b  IRTUALTABLE\n");
2ceb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2cec0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
2ced0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2cee0 78 69 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  xit;.#else.     
2cef0 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61       ShellSetFla
2cf00 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65  g(p, SHFLG_Prese
2cf10 72 76 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69  rveRowid);.#endi
2cf20 66 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  f.        }else.
2cf30 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2cf40 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29  mp(z,"newlines")
2cf50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2cf60 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c   ShellSetFlag(p,
2cf70 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29   SHFLG_Newlines)
2cf80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2cf90 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2cfa0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cfb0 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20  tderr, "Unknown 
2cfc0 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e  option \"%s\" on
2cfd0 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61   \".dump\"\n", a
2cfe0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
2cff0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d000 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2d010 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2d020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2d030 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b  lse if( zLike ){
2d040 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2d050 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2d060 67 65 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65  ge: .dump ?--pre
2d070 73 65 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a  serve-rowids? ".
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e             "?--n
2d0a0 65 77 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50  ewlines? ?LIKE-P
2d0b0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
2d0c0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2d0d0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2d0e0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2d0f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d100 20 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b    zLike = azArg[
2d110 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
2d120 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
2d130 20 30 29 3b 0a 20 20 20 20 2f 2a 20 57 68 65 6e   0);.    /* When
2d140 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61 20   playing back a 
2d150 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74  "dump", the cont
2d160 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61 72  ent might appear
2d170 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20 20   in an order.   
2d180 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65 73   ** which causes
2d190 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
2d1a0 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
2d1b0 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74 65  ts to be violate
2d1c0 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69 73  d..    ** So dis
2d1d0 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79  able foreign-key
2d1e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f   constraint enfo
2d1f0 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76 65  rcement to preve
2d200 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a  nt problems. */.
2d210 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2d220 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66  ->out, "PRAGMA f
2d230 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b  oreign_keys=OFF;
2d240 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  \n");.    raw_pr
2d250 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45  intf(p->out, "BE
2d260 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b  GIN TRANSACTION;
2d270 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69  \n");.    p->wri
2d280 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
2d290 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
2d2a0 65 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53  er = 0;.    /* S
2d2b0 65 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  et writable_sche
2d2c0 6d 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69 6e  ma=ON since doin
2d2d0 67 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c 69  g so forces SQLi
2d2e0 74 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  te to initialize
2d2f0 0a 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68 20  .    ** as much 
2d300 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 61 73  of the schema as
2d310 20 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66 20   it can even if 
2d320 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
2d330 72 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20 2a  r table is.    *
2d340 2a 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  * corrupt. */.  
2d350 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2d360 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e 54  ->db, "SAVEPOINT
2d370 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77 72   dump; PRAGMA wr
2d380 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
2d390 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
2d3a0 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20 20   p->nErr = 0;.  
2d3b0 20 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20 29    if( zLike==0 )
2d3c0 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65  {.      run_sche
2d3d0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  ma_dump_query(p,
2d3e0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2d3f0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
2d400 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2d410 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
2d420 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
2d430 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62  L AND type=='tab
2d440 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73  le' AND name!='s
2d450 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
2d460 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2d470 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
2d480 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20  query(p,.       
2d490 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74   "SELECT name, t
2d4a0 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71  ype, sql FROM sq
2d4b0 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
2d4c0 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61 6d        "WHERE nam
2d4d0 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e=='sqlite_seque
2d4e0 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
2d4f0 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64       run_table_d
2d500 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
2d510 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
2d520 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2d530 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
2d540 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
2d550 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27  L AND type IN ('
2d560 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
2d570 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20 20  ,'view')", 0.   
2d580 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
2d590 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71  .      char *zSq
2d5a0 6c 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  l;.      zSql = 
2d5b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2d5c0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
2d5d0 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c   name, type, sql
2d5e0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2d5f0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
2d600 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c 49  HERE tbl_name LI
2d610 4b 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d 3d  KE %Q AND type==
2d620 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20  'table'".       
2d630 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20   "  AND sql NOT 
2d640 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20  NULL", zLike);. 
2d650 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
2d660 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53 71  dump_query(p,zSq
2d670 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
2d680 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2d690 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2d6a0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2d6b0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2d6c0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2d6d0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
2d6e0 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c  ERE sql NOT NULL
2d6f0 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e 44  ".        "  AND
2d700 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
2d710 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
2d720 77 27 29 22 0a 20 20 20 20 20 20 20 20 22 20 20  w')".        "  
2d730 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b  AND tbl_name LIK
2d740 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a 20  E %Q", zLike);. 
2d750 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f 64       run_table_d
2d760 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53 71  ump_query(p, zSq
2d770 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  l, 0);.      sql
2d780 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2d790 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d7a0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
2d7b0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d7c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
2d7d0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
2d7e0 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20  hema=OFF;\n");. 
2d7f0 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
2d800 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
2d810 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  }.    sqlite3_ex
2d820 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
2d830 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
2d840 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30  a=OFF;", 0, 0, 0
2d850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
2d860 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
2d870 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20 30  ASE dump;", 0, 0
2d880 2c 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 0);.    raw_pr
2d890 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  intf(p->out, p->
2d8a0 6e 45 72 72 20 3f 20 22 52 4f 4c 4c 42 41 43 4b  nErr ? "ROLLBACK
2d8b0 3b 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f  ; -- due to erro
2d8c0 72 73 5c 6e 22 20 3a 20 22 43 4f 4d 4d 49 54 3b  rs\n" : "COMMIT;
2d8d0 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f  \n");.    p->sho
2d8e0 77 48 65 61 64 65 72 20 3d 20 73 61 76 65 64 53  wHeader = savedS
2d8f0 68 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 70  howHeader;.    p
2d900 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61  ->shellFlgs = sa
2d910 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20  vedShellFlags;. 
2d920 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2d930 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2d940 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22  azArg[0], "echo"
2d950 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2d960 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
2d970 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c      setOrClearFl
2d980 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f  ag(p, SHFLG_Echo
2d990 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
2d9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2d9b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d9c0 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f   "Usage: .echo o
2d9d0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2d9e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2d9f0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2da00 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
2da10 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c  azArg[0], "eqp",
2da20 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2da30 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2da40 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73     p->autoEQPtes
2da50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
2da60 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2da70 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"full")==0 ){. 
2da80 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2da90 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c  P = AUTOEQP_full
2daa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2dab0 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
2dac0 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d 30 20  ],"trigger")==0 
2dad0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  ){.        p->au
2dae0 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f  toEQP = AUTOEQP_
2daf0 74 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 7d  trigger;.      }
2db00 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2db10 61 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22 29  azArg[1],"test")
2db20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2db30 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  ->autoEQP = AUTO
2db40 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20 20  EQP_on;.        
2db50 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d  p->autoEQPtest =
2db60 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
2db70 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
2db80 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61  EQP = (u8)boolea
2db90 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2dba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2dbb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2dbc0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2dbd0 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f  sage: .eqp off|o
2dbe0 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e  n|trigger|full\n
2dbf0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2dc00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2dc10 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
2dc20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2dc30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30  ], "exit", n)==0
2dc40 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2dc50 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74  >1 && (rc = (int
2dc60 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
2dc70 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78  Arg[1]))!=0 ) ex
2dc80 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d  it(rc);.    rc =
2dc90 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f   2;.  }else..  /
2dca0 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22  * The ".explain"
2dcb0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f   command is auto
2dcc0 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69  matic now.  It i
2dcd0 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c  s largely pointl
2dce0 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65  ess.  It.  ** re
2dcf0 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f  tained purely fo
2dd00 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
2dd10 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69  atibility */.  i
2dd20 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
2dd30 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2dd40 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20  explain", n)==0 
2dd50 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  ){.    int val =
2dd60 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   1;.    if( nArg
2dd70 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=2 ){.      if(
2dd80 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
2dd90 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20  ,"auto")==0 ){. 
2dda0 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b         val = 99;
2ddb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ddc0 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f        val =  boo
2ddd0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2dde0 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1]);.      }.   
2ddf0 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d   }.    if( val==
2de00 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f  1 && p->mode!=MO
2de10 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
2de20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64      p->normalMod
2de30 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
2de40 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2de50 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20  E_Explain;.     
2de60 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20   p->autoExplain 
2de70 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
2de80 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  f( val==0 ){.   
2de90 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2dea0 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
2deb0 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
2dec0 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
2ded0 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
2dee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2def0 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20  val==99 ){.     
2df00 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2df10 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
2df20 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
2df30 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
2df40 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a  utoExplain = 1;.
2df50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
2df60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2df70 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2df80 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20    if( c=='e' && 
2df90 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2dfa0 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d  , "expert", n)==
2dfb0 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  0 ){.    open_db
2dfc0 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70 65  (p, 0);.    expe
2dfd0 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  rtDotCommand(p, 
2dfe0 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2dff0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2e000 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74  if( c=='f' && st
2e010 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e020 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29  "fullschema", n)
2e030 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
2e040 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2e050 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2e060 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61  0;.    int doSta
2e070 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  ts = 0;.    memc
2e080 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
2e090 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
2e0a0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
2e0b0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
2e0c0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2e0d0 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
2e0e0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20   if( nArg==2 && 
2e0f0 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
2e100 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20  g[1], "indent") 
2e110 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  ){.      data.cM
2e120 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2e130 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20  = MODE_Pretty;. 
2e140 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20       nArg = 1;. 
2e150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
2e160 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
2e170 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2e180 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63   "Usage: .fullsc
2e190 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c  hema ?--indent?\
2e1a0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2e1b0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2e1c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2e1d0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
2e1e0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
2e1f0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2e200 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53  p->db,.       "S
2e210 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a  ELECT sql FROM".
2e220 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
2e230 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
2e240 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
2e250 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
2e260 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20  me, rowid x".   
2e270 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
2e280 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
2e290 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22  ON ALL".       "
2e2a0 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74     SELECT sql, t
2e2b0 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  ype, tbl_name, n
2e2c0 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20  ame, rowid FROM 
2e2d0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
2e2e0 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57 48  er) ".       "WH
2e2f0 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27  ERE type!='meta'
2e300 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c   AND sql NOTNULL
2e310 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
2e320 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
2e330 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
2e340 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
2e350 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
2e360 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b   &zErrMsg.    );
2e370 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e390 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2e3a0 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
2e3b0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2e3c0 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
2e3d0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
2e3e0 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
2e3f0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
2e400 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
2e410 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c  E name GLOB 'sql
2e420 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c  ite_stat[134]'",
2e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e440 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2e450 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20        doStats = 
2e460 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2e470 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
2e480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2e490 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2e4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
2e4b0 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Stats==0 ){.    
2e4c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2e4d0 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54  out, "/* No STAT
2e4e0 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c   tables availabl
2e4f0 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  e */\n");.    }e
2e500 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2e510 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
2e520 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
2e530 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ster;\n");.     
2e540 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2e550 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e  >db, "SELECT 'AN
2e560 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
2e570 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20  ter'",.         
2e580 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
2e590 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
2e5a0 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
2e5b0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
2e5c0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
2e5d0 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
2e5e0 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
2e5f0 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20  e_stat1";.      
2e600 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74 61  shell_exec(&data
2e610 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
2e620 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20   sqlite_stat1", 
2e630 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
2e640 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65   data.zDestTable
2e650 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33   = "sqlite_stat3
2e660 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65  ";.      shell_e
2e670 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45  xec(&data, "SELE
2e680 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
2e690 5f 73 74 61 74 33 22 2c 20 26 7a 45 72 72 4d 73  _stat3", &zErrMs
2e6a0 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a  g);.      data.z
2e6b0 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c  DestTable = "sql
2e6c0 69 74 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20  ite_stat4";.    
2e6d0 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61    shell_exec(&da
2e6e0 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52  ta, "SELECT * FR
2e6f0 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22  OM sqlite_stat4"
2e700 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2e710 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2e720 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
2e730 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
2e740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2e750 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
2e760 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e770 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c 20 6e  0], "headers", n
2e780 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2e790 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2e7a0 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
2e7b0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2e7c0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
2e7d0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2e7e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e7f0 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20 6f 6e  age: .headers on
2e800 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2e810 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2e820 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2e830 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'h' && strncmp(a
2e840 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70 22 2c  zArg[0], "help",
2e850 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2e860 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2e870 20 20 20 69 6e 74 20 6e 20 3d 20 73 68 6f 77 48     int n = showH
2e880 65 6c 70 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  elp(p->out, azAr
2e890 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  g[1]);.      if(
2e8a0 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   n==0 ){.       
2e8b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2e8c0 6f 75 74 2c 20 22 4e 6f 74 68 69 6e 67 20 6d 61  out, "Nothing ma
2e8d0 74 63 68 65 73 20 27 25 73 27 5c 6e 22 2c 20 61  tches '%s'\n", a
2e8e0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2e8f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2e900 20 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f     showHelp(p->o
2e910 75 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ut, 0);.    }.  
2e920 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2e930 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2e940 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74  zArg[0], "import
2e950 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2e960 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
2e970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e980 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2e990 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
2e9a0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20    char *zFile;  
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e9c0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
2e9d0 20 65 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66   extra content f
2e9e0 72 6f 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  rom */.    sqlit
2e9f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2ea00 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74   NULL; /* A stat
2ea10 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ement */.    int
2ea20 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
2ea30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ea40 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
2ea50 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2ea60 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
2ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea80 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2ea90 20 69 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e   in an SQL strin
2eaa0 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20  g */.    int i, 
2eab0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2eac0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2ead0 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
2eae0 20 6e 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20   needCommit;    
2eaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2eb00 20 74 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f   to COMMIT or RO
2eb10 4c 4c 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f  LLBACK at end */
2eb20 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20  .    int nSep;  
2eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2eb50 74 65 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70  tes in p->colSep
2eb60 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20  arator[] */.    
2eb70 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2eb90 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
2eba0 2a 2f 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78  */.    ImportCtx
2ebb0 20 73 43 74 78 3b 20 20 20 20 20 20 20 20 20 20   sCtx;          
2ebc0 20 20 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e     /* Reader con
2ebd0 74 65 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  text */.    char
2ebe0 20 2a 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20   *(SQLITE_CDECL 
2ebf0 2a 78 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74  *xRead)(ImportCt
2ec00 78 2a 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20  x*); /* Func to 
2ec10 72 65 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a  read one value *
2ec20 2f 0a 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54  /.    int (SQLIT
2ec30 45 5f 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72  E_CDECL *xCloser
2ec40 29 28 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f  )(FILE*);      /
2ec50 2a 20 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20  * Func to close 
2ec60 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28  file */..    if(
2ec70 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2ec80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2ec90 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d  err, "Usage: .im
2eca0 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c  port FILE TABLE\
2ecb0 6e 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  n");.      goto 
2ecc0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2ecd0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69  t;.    }.    zFi
2ece0 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
2ecf0 20 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72     zTable = azAr
2ed00 67 5b 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e  g[2];.    seenIn
2ed10 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20  terrupt = 0;.   
2ed20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30   memset(&sCtx, 0
2ed30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b  , sizeof(sCtx));
2ed40 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2ed50 30 29 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73  0);.    nSep = s
2ed60 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65  trlen30(p->colSe
2ed70 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66  parator);.    if
2ed80 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( nSep==0 ){.   
2ed90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2eda0 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20  derr,.          
2edb0 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e         "Error: n
2edc0 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73  on-null column s
2edd0 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
2ede0 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
2edf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2ee00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ee10 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSep>1 ){.      
2ee20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ee30 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69  r, "Error: multi
2ee40 2d 63 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d  -character colum
2ee50 6e 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  n separators not
2ee60 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
2ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee80 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
2ee90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2eea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70  ;.    }.    nSep
2eeb0 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
2eec0 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
2eed0 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
2eee0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2eef0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2ef00 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73  : non-null row s
2ef10 65 70 61 72 61 74 6f 72 20 72 65 71 75 69 72 65  eparator require
2ef20 64 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  d for import\n")
2ef30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2ef40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ef50 6e 53 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f  nSep==2 && p->mo
2ef60 64 65 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20  de==MODE_Csv && 
2ef70 73 74 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70  strcmp(p->rowSep
2ef80 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66  arator, SEP_CrLf
2ef90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
2efa0 20 57 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20   When importing 
2efb0 43 53 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74  CSV (only), if t
2efc0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
2efd0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
2efe0 20 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20       ** default 
2eff0 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72  output row separ
2f000 61 74 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20  ator, change it 
2f010 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 69  to the default i
2f020 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  nput.      ** ro
2f030 77 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68  w separator.  Th
2f040 69 73 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67  is avoids having
2f050 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66   to maintain dif
2f060 66 65 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20  ferent input.   
2f070 20 20 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74     ** and output
2f080 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e   row separators.
2f090 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2f0a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2f0b0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2f0c0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2f0d0 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
2f0e0 20 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c       nSep = strl
2f0f0 65 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72  en30(p->rowSepar
2f100 61 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ator);.    }.   
2f110 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20   if( nSep>1 ){. 
2f120 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f130 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2f140 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20  multi-character 
2f150 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e  row separators n
2f160 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20  ot allowed".    
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f180 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e    " for import\n
2f190 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2f1a0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43   1;.    }.    sC
2f1b0 74 78 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65  tx.zFile = zFile
2f1c0 3b 0a 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65  ;.    sCtx.nLine
2f1d0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43   = 1;.    if( sC
2f1e0 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27  tx.zFile[0]=='|'
2f1f0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
2f200 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
2f210 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f220 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69  derr, "Error: pi
2f230 70 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70  pes are not supp
2f240 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53  orted in this OS
2f250 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2f260 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 1;.#else.    
2f270 20 20 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65    sCtx.in = pope
2f280 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20  n(sCtx.zFile+1, 
2f290 22 72 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78  "r");.      sCtx
2f2a0 2e 7a 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e  .zFile = "<pipe>
2f2b0 22 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  ";.      xCloser
2f2c0 20 3d 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69   = pclose;.#endi
2f2d0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2f2e0 20 20 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70     sCtx.in = fop
2f2f0 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22  en(sCtx.zFile, "
2f300 72 62 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  rb");.      xClo
2f310 73 65 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20  ser = fclose;.  
2f320 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d    }.    if( p->m
2f330 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20  ode==MODE_Ascii 
2f340 29 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d  ){.      xRead =
2f350 20 61 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f   ascii_read_one_
2f360 66 69 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65  field;.    }else
2f370 7b 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20  {.      xRead = 
2f380 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
2f390 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ld;.    }.    if
2f3a0 28 20 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a  ( sCtx.in==0 ){.
2f3b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f3c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f3d0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
2f3e0 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b  %s\"\n", zFile);
2f3f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2f400 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e  .    }.    sCtx.
2f410 63 43 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c  cColSep = p->col
2f420 53 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20  Separator[0];.  
2f430 20 20 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d    sCtx.cRowSep =
2f440 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2f450 5b 30 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  [0];.    zSql = 
2f460 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2f470 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25  "SELECT * FROM %
2f480 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
2f490 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
2f4a0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2f4b0 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 73 68  tx.in);.      sh
2f4c0 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
2f4d0 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  y();.    }.    n
2f4e0 42 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28  Byte = strlen30(
2f4f0 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  zSql);.    rc = 
2f500 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2f510 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
2f520 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2f530 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
2f540 64 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29  d_char(&sCtx, 0)
2f550 3b 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72  ;    /* To ensur
2f560 65 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f  e sCtx.z is allo
2f570 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
2f580 20 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73   rc && sqlite3_s
2f590 74 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20  trglob("no such 
2f5a0 74 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74  table: *", sqlit
2f5b0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2f5c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
2f5d0 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71  ar *zCreate = sq
2f5e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43  lite3_mprintf("C
2f5f0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c  REATE TABLE %s",
2f600 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20   zTable);.      
2f610 63 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b  char cSep = '(';
2f620 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52  .      while( xR
2f630 65 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20  ead(&sCtx) ){.  
2f640 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20        zCreate = 
2f650 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2f660 22 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20  "%z%c\n  \"%w\" 
2f670 54 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20  TEXT", zCreate, 
2f680 63 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20  cSep, sCtx.z);. 
2f690 20 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c         cSep = ',
2f6a0 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ';.        if( s
2f6b0 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e  Ctx.cTerm!=sCtx.
2f6c0 63 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b  cColSep ) break;
2f6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f6e0 66 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a  f( cSep=='(' ){.
2f6f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f700 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2f710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2f720 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
2f730 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2f740 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75  x.in);.        u
2f750 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2f760 72 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c  r,"%s: empty fil
2f770 65 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65  e\n", sCtx.zFile
2f780 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f790 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2f7a0 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c     zCreate = sql
2f7b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
2f7c0 5c 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a  \n)", zCreate);.
2f7d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f7e0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
2f7f0 43 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29  Create, 0, 0, 0)
2f800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2f810 66 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20  free(zCreate);. 
2f820 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f830 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f840 74 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41  tf(stderr, "CREA
2f850 54 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29  TE TABLE %s(...)
2f860 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20   failed: %s\n", 
2f870 7a 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20  zTable,.        
2f880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f890 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2f8a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2f8b0 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
2f8c0 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2f8d0 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  tx.in);.        
2f8e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2f8f0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2f900 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2f910 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2f920 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2f930 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2f940 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2f950 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
2f960 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65  f (pStmt) sqlite
2f970 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2f980 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2f990 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2f9a0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2f9b0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2f9c0 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2f9d0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2f9e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2f9f0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69  .    nCol = sqli
2fa00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
2fa10 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
2fa20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2fa30 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
2fa40 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  = 0;.    if( nCo
2fa50 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
2fa60 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20   /* no columns, 
2fa70 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  no error */.    
2fa80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2fa90 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32  alloc64( nByte*2
2faa0 20 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29   + 20 + nCol*2 )
2fab0 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
2fac0 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73  0 ){.      xClos
2fad0 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2fae0 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f     shell_out_of_
2faf0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a  memory();.    }.
2fb00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2fb10 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c 20 7a  intf(nByte+20, z
2fb20 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49 4e 54  Sql, "INSERT INT
2fb30 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45 53 28  O \"%w\" VALUES(
2fb40 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  ?", zTable);.   
2fb50 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53   j = strlen30(zS
2fb60 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ql);.    for(i=1
2fb70 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
2fb80 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2fb90 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a 53 71  = ',';.      zSq
2fba0 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20  l[j++] = '?';.  
2fbb0 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b    }.    zSql[j++
2fbc0 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a 53 71  ] = ')';.    zSq
2fbd0 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63  l[j] = 0;.    rc
2fbe0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2fbf0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2fc00 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2fc10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2fc20 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2fc30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
2fc40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2fc50 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
2fc60 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2fc70 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2fc80 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74  if (pStmt) sqlit
2fc90 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2fca0 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  t);.      xClose
2fcb0 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2fcc0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2fcd0 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d 69 74  }.    needCommit
2fce0 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61   = sqlite3_get_a
2fcf0 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64 62 29  utocommit(p->db)
2fd00 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f  ;.    if( needCo
2fd10 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65  mmit ) sqlite3_e
2fd20 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45 47 49  xec(p->db, "BEGI
2fd30 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
2fd40 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20    do{.      int 
2fd50 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43 74 78  startLine = sCtx
2fd60 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 66 6f  .nLine;.      fo
2fd70 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
2fd80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2fd90 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26 73 43  r *z = xRead(&sC
2fda0 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  tx);.        /*.
2fdb0 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
2fdc0 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
2fdd0 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69  ile before findi
2fde0 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a  ng any columns?.
2fdf0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 73 6f          ** If so
2fe00 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f  , stop instead o
2fe10 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 20 74  f NULL filling t
2fe20 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c  he remaining col
2fe30 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  umns..        */
2fe40 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
2fe50 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61  0 && i==0 ) brea
2fe60 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20  k;.        /*.  
2fe70 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20        ** Did we 
2fe80 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c  reach end-of-fil
2fe90 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65  e OR end-of-line
2fea0 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20   before finding 
2feb0 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  any.        ** c
2fec0 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49 49 20  olumns in ASCII 
2fed0 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20 73 74  mode?  If so, st
2fee0 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  op instead of NU
2fef0 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  LL filling.     
2ff00 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61 69 6e     ** the remain
2ff10 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
2ff20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ff30 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
2ff40 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d 3d 30  E_Ascii && (z==0
2ff50 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26 26 20   || z[0]==0) && 
2ff60 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
2ff70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
2ff80 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
2ff90 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54  +1, z, -1, SQLIT
2ffa0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
2ffb0 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c        if( i<nCol
2ffc0 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65 72 6d  -1 && sCtx.cTerm
2ffd0 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
2ffe0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
2fff0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30000 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
30010 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
30020 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30040 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e 67 20         "filling 
30050 74 68 65 20 72 65 73 74 20 77 69 74 68 20 4e 55  the rest with NU
30060 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30080 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
30090 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b  rtLine, nCol, i+
300a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
300b0 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
300c0 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c 20 29  while( i<=nCol )
300d0 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  { sqlite3_bind_n
300e0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 20 69  ull(pStmt, i); i
300f0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  ++; }.        }.
30100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30110 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43  ( sCtx.cTerm==sC
30120 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20  tx.cColSep ){.  
30130 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
30140 20 20 20 20 78 52 65 61 64 28 26 73 43 74 78 29      xRead(&sCtx)
30150 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  ;.          i++;
30160 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28  .        }while(
30170 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74   sCtx.cTerm==sCt
30180 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20 20 20  x.cColSep );.   
30190 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
301a0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
301b0 20 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c   expected %d col
301c0 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25  umns but found %
301d0 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  d - ".          
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
301f0 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c 6e 22  xtras ignored\n"
30200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30210 20 20 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a            sCtx.z
30220 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c  File, startLine,
30230 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20 20 20   nCol, i);.     
30240 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
30250 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
30260 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
30270 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  mt);.        rc 
30280 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
30290 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
302a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
302b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
302c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
302d0 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53 45 52  r, "%s:%d: INSER
302e0 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c  T failed: %s\n",
302f0 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20 20 20   sCtx.zFile,.   
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30310 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20 73 71     startLine, sq
30320 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
30330 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  db));.        }.
30340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
30350 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  le( sCtx.cTerm!=
30360 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43 6c 6f  EOF );..    xClo
30370 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
30380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
30390 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71 6c 69  Ctx.z);.    sqli
303a0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
303b0 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65  mt);.    if( nee
303c0 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65  dCommit ) sqlite
303d0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 43  3_exec(p->db, "C
303e0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29  OMMIT", 0, 0, 0)
303f0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
30400 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ef SQLITE_UNTEST
30410 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d 27 69  ABLE.  if( c=='i
30420 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
30430 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74 65 72  rg[0], "imposter
30440 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
30450 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
30460 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d  char *zCollist =
30470 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
30480 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
30490 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b 0a 20   int tnum = 0;. 
304a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66     int i;.    if
304b0 28 20 21 28 6e 41 72 67 3d 3d 33 20 7c 7c 20 28  ( !(nArg==3 || (
304c0 6e 41 72 67 3d 3d 32 20 26 26 20 73 71 6c 69 74  nArg==2 && sqlit
304d0 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67  e3_stricmp(azArg
304e0 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d 30 29 29 20  [1],"off")==0)) 
304f0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
30500 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
30510 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49  age: .imposter I
30520 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22  NDEX IMPOSTER\n"
30530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30540 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20             "    
30550 20 20 20 2e 69 6d 70 6f 73 74 65 72 20 6f 66 66     .imposter off
30560 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
30570 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
30580 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
30590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
305a0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
305b0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
305c0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
305d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
305e0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
305f0 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
30600 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 67  , 0, 1);.      g
30610 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
30620 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
30630 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
30640 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
30650 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
30660 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30680 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
30690 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
306a0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41  pe='index'", azA
306b0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69  rg[1]);.    sqli
306c0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
306d0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
306e0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
306f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
30700 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  l);.    if( sqli
30710 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
30720 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
30730 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69       tnum = sqli
30740 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
30750 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
30760 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
30770 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
30780 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a   if( tnum==0 ){.
30790 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
307a0 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75  f(stderr, "no su
307b0 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22  ch index: \"%s\"
307c0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
307d0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
307e0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
307f0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
30800 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
30810 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
30820 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
30830 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ='%q'", azArg[1]
30840 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30850 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
30860 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
30870 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
30880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
30890 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20  l);.    i = 0;. 
308a0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
308b0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
308c0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
308d0 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32     char zLabel[2
308e0 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  0];.      const 
308f0 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
30900 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
30910 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
30920 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b  tmt,2);.      i+
30930 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  +;.      if( zCo
30940 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
30950 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
30960 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d  mn_int(pStmt,1)=
30970 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =-1 ){.         
30980 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
30990 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
309a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
309b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
309c0 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62  eof(zLabel),zLab
309d0 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a  el,"expr%d",i);.
309e0 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
309f0 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20   zLabel;.       
30a00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30a10 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30   if( zCollist==0
30a20 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
30a30 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  list = sqlite3_m
30a40 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
30a50 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zCol);.      }e
30a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
30a70 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  llist = sqlite3_
30a80 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77  mprintf("%z,\"%w
30a90 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  \"", zCollist, z
30aa0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
30ab0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
30ac0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
30ad0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
30ae0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
30af0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
30b00 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50  ABLE \"%w\"(%s,P
30b10 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57  RIMARY KEY(%s))W
30b20 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20  ITHOUT ROWID",. 
30b30 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32           azArg[2
30b40 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ], zCollist, zCo
30b50 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  llist);.    sqli
30b60 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73  te3_free(zCollis
30b70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
30b80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
30b90 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
30ba0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
30bb0 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  b, "main", 1, tn
30bc0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  um);.    if( rc=
30bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30bf0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
30c00 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
30c10 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
30c20 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
30c30 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
30c40 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
30c50 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
30c60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30c70 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
30c80 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25  rr, "Error in [%
30c90 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c  s]: %s\n", zSql,
30ca0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
30cb0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d  p->db));.      }
30cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
30cd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
30ce0 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29  , "%s;\n", zSql)
30cf0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
30d00 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20  intf(stdout,.   
30d10 20 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47          "WARNING
30d20 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20  : writing to an 
30d30 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77  imposter table w
30d40 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20  ill corrupt the 
30d50 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20  index!\n".      
30d60 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
30d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
30d80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30d90 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
30da0 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72  L_IMPOSTER retur
30db0 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
30dc0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
30dd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
30de0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
30df0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
30e00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
30e10 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20  T_TEST_CONTROL) 
30e20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
30e30 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
30e40 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
30e50 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
30e60 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29  ], "iotrace", n)
30e70 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54  ==0 ){.    SQLIT
30e80 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69  E_API extern voi
30e90 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  d (SQLITE_CDECL 
30ea0 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
30eb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
30ec0 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72  .);.    if( iotr
30ed0 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d  ace && iotrace!=
30ee0 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28  stdout ) fclose(
30ef0 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f  iotrace);.    io
30f00 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69  trace = 0;.    i
30f10 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
30f20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
30f30 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
30f40 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
30f50 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b  g[1], "-")==0 ){
30f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
30f70 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
30f80 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74  rintf;.      iot
30f90 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
30fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30fb0 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28  iotrace = fopen(
30fc0 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a  azArg[1], "w");.
30fd0 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63        if( iotrac
30fe0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
30ff0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
31000 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
31010 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
31020 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
31030 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
31040 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
31050 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
31070 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
31080 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20  iotracePrintf;. 
31090 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
310a0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
310b0 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d  f( c=='l' && n>=
310c0 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  5 && strncmp(azA
310d0 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c  rg[0], "limits",
310e0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
310f0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
31100 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
31110 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d   char *zLimitNam
31120 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
31130 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20  a limit */.     
31140 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b    int limitCode;
31150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31160 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20  nteger code for 
31170 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  that limit */.  
31180 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b    } aLimit[] = {
31190 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68  .      { "length
311a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
311b0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
311c0 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
311d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
311e0 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22    { "sql_length"
311f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
31200 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
31210 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
31220 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
31230 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
31240 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
31250 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
31270 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f  ,.      { "expr_
31280 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
31290 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
312a0 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
312b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
312c0 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73     { "compound_s
312d0 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53 51  elect",       SQ
312e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
312f0 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
31300 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
31310 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20  "vdbe_op",      
31320 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
31330 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
31340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31350 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63  },.      { "func
31360 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20  tion_arg",      
31370 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
31380 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
31390 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
313a0 20 20 20 20 7b 20 22 61 74 74 61 63 68 65 64 22      { "attached"
313b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
313c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
313d0 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
313e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
313f0 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c   "like_pattern_l
31400 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45  ength",   SQLITE
31410 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
31420 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  ERN_LENGTH      
31430 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72   },.      { "var
31440 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20  iable_number",  
31450 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
31460 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
31470 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  R           },. 
31480 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f       { "trigger_
31490 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
314a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
314b0 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
314c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
314d0 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  { "worker_thread
314e0 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  s",        SQLIT
314f0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
31500 48 52 45 41 44 53 20 20 20 20 20 20 20 20 20 20  HREADS          
31510 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
31520 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f  int i, n2;.    o
31530 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
31540 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
31550 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
31560 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d  i<ArraySize(aLim
31570 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  it); i++){.     
31580 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
31590 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d  %d\n", aLimit[i]
315a0 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
315b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
315c0 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
315d0 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74   aLimit[i].limit
315e0 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
315f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
31600 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  ( nArg>3 ){.    
31610 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31620 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69  err, "Usage: .li
31630 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41  mit NAME ?NEW-VA
31640 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  LUE?\n");.      
31650 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
31660 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
31670 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  exit;.    }else{
31680 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  .      int iLimi
31690 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32  t = -1;.      n2
316a0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
316b0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  g[1]);.      for
316c0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
316d0 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
316e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
316f0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c  ite3_strnicmp(aL
31700 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
31710 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32  me, azArg[1], n2
31720 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
31730 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29    if( iLimit<0 )
31740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4c  {.            iL
31750 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  imit = i;.      
31760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31770 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31780 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69  tf(stderr, "ambi
31790 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25  guous limit: \"%
317a0 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
317b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
317c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
317d0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
317e0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
317f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31810 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  f( iLimit<0 ){. 
31820 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31830 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
31840 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  own limit: \"%s\
31850 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  "\n".           
31860 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
31870 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20  ter \".limits\" 
31880 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
31890 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22  s for a list.\n"
318a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
318b0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
318c0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
318d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
318e0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
318f0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
31900 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
31910 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31920 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
31930 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
31940 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20  imitCode,.      
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
31970 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20  e(azArg[2]));.  
31980 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
31990 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20  tf("%20s %d\n", 
319a0 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a  aLimit[iLimit].z
319b0 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
319c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
319d0 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
319e0 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69  mit[iLimit].limi
319f0 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  tCode, -1));.   
31a00 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
31a10 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20  ( c=='l' && n>2 
31a20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
31a30 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d  [0], "lint", n)=
31a40 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
31a50 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e  b(p, 0);.    lin
31a60 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61  tDotCommand(p, a
31a70 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d  zArg, nArg);.  }
31a80 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
31a90 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
31aa0 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63  XTENSION.  if( c
31ab0 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
31ac0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64  (azArg[0], "load
31ad0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
31af0 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63  e, *zProc;.    c
31b00 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
31b10 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
31b20 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
31b30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
31b40 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20  age: .load FILE 
31b50 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29  ?ENTRYPOINT?\n")
31b60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
31b70 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
31b80 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
31b90 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
31ba0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50  azArg[1];.    zP
31bb0 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20  roc = nArg>=3 ? 
31bc0 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20  azArg[2] : 0;.  
31bd0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
31be0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31bf0 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
31c00 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  (p->db, zFile, z
31c10 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Proc, &zErrMsg);
31c20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31c40 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
31c50 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
31c60 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
31c70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31c80 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
31c90 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
31ca0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
31cb0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74  if( c=='l' && st
31cc0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31cd0 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "log", n)==0 ){.
31ce0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
31cf0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
31d00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
31d10 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d  ge: .log FILENAM
31d20 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
31d30 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
31d40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
31d50 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
31d60 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  1];.      output
31d70 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70  _file_close(p->p
31d80 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  Log);.      p->p
31d90 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Log = output_fil
31da0 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 30 29  e_open(zFile, 0)
31db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
31dc0 0a 20 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26  .  if( c=='m' &&
31dd0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
31de0 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30  ], "mode", n)==0
31df0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
31e00 61 72 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67  ar *zMode = nArg
31e10 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
31e20 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20   "";.    int n2 
31e30 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4d 6f 64 65  = strlen30(zMode
31e40 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20  );.    int c2 = 
31e50 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zMode[0];.    if
31e60 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e  ( c2=='l' && n2>
31e70 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
31e80 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32  rg[1],"lines",n2
31e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
31ea0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e  >mode = MODE_Lin
31eb0 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
31ec0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31ed0 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
31ee0 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
31ef0 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
31f00 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
31f10 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
31f20 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73  zArg[1],"columns
31f30 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
31f40 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
31f50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73  _Column;.      s
31f60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31f70 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
31f80 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
31f90 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
31fa0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
31fb0 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e  ( c2=='l' && n2>
31fc0 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
31fd0 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29  rg[1],"list",n2)
31fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
31ff0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
32000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
32010 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32020 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
32030 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
32040 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a  r, SEP_Column);.
32050 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32060 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32070 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
32080 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
32090 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
320a0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27  else if( c2=='h'
320b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
320c0 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d  g[1],"html",n2)=
320d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
320e0 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b  ode = MODE_Html;
320f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
32100 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
32110 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22  p(azArg[1],"tcl"
32120 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
32130 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
32140 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tcl;.      sqlit
32150 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32160 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
32170 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
32180 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29  ator, SEP_Space)
32190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
321a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
321b0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
321c0 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
321d0 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
321e0 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
321f0 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
32200 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29  Arg[1],"csv",n2)
32210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
32220 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b  mode = MODE_Csv;
32230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
32240 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
32250 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
32260 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
32270 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20  , SEP_Comma);.  
32280 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32290 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
322a0 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
322b0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
322c0 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65  EP_CrLf);.    }e
322d0 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20  lse if( c2=='t' 
322e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
322f0 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d  [1],"tabs",n2)==
32300 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
32310 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
32320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
32330 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
32340 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
32350 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
32360 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d   SEP_Tab);.    }
32370 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27  else if( c2=='i'
32380 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
32390 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32  g[1],"insert",n2
323a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
323b0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  >mode = MODE_Ins
323c0 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74  ert;.      set_t
323d0 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72  able_name(p, nAr
323e0 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
323f0 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  : "table");.    
32400 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71  }else if( c2=='q
32410 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32420 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32  rg[1],"quote",n2
32430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
32440 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f  >mode = MODE_Quo
32450 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
32460 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72  ( c2=='a' && str
32470 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  ncmp(azArg[1],"a
32480 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  scii",n2)==0 ){.
32490 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
324a0 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20  MODE_Ascii;.    
324b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
324c0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
324d0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
324e0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
324f0 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71  _Unit);.      sq
32500 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32510 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
32520 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
32530 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63  parator, SEP_Rec
32540 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ord);.    }else 
32550 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
32560 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32570 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74  p->out, "current
32580 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73   output mode: %s
32590 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70  \n", modeDescr[p
325a0 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65  ->mode]);.    }e
325b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
325c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
325d0 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c  rror: mode shoul
325e0 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20  d be one of: ". 
325f0 20 20 20 20 20 20 20 20 22 61 73 63 69 69 20 63          "ascii c
32600 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69  olumn csv html i
32610 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20  nsert line list 
32620 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e  quote tabs tcl\n
32630 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
32640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63  ;.    }.    p->c
32650 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
32660 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
32670 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70  =='n' && strncmp
32680 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c  (azArg[0], "null
32690 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  value", n)==0 ){
326a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
326b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
326c0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
326d0 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c  f(p->nullValue),
326e0 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20   p->nullValue,. 
326f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32700 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
32710 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
32720 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a  nullValue)-1, az
32730 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
32740 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
32750 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
32760 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20  age: .nullvalue 
32770 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20  STRING\n");.    
32780 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
32790 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
327a0 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70  =='o' && strncmp
327b0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e  (azArg[0], "open
327c0 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32  ", n)==0 && n>=2
327d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e   ){.    char *zN
327e0 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20  ewFilename;  /* 
327f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
32800 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
32810 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61  n */.    int iNa
32820 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  me = 1;       /*
32830 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b   Index in azArg[
32840 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  ] of the filenam
32850 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77  e */.    int new
32860 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Flag = 0;     /*
32870 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20   True to delete 
32880 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e  file before open
32890 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c  ing */.    /* Cl
328a0 6f 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67  ose the existing
328b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
328c0 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
328d0 6c 6c 28 70 29 3b 0a 20 20 20 20 63 6c 6f 73 65  ll(p);.    close
328e0 5f 64 62 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  _db(p->db);.    
328f0 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70  p->db = 0;.    p
32900 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
32910 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
32920 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c  ree(p->zFreeOnCl
32930 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72  ose);.    p->zFr
32940 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  eeOnClose = 0;. 
32950 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
32960 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
32970 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  EC;.    /* Check
32980 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   for command-lin
32990 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
329a0 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20     for(iName=1; 
329b0 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a  iName<nArg && az
329c0 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27  Arg[iName][0]=='
329d0 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20  -'; iName++){.  
329e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
329f0 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  z = azArg[iName]
32a00 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69  ;.      if( opti
32a10 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29  onMatch(z,"new")
32a20 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46   ){.        newF
32a30 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lag = 1;.#ifdef 
32a40 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
32a50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32a60 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
32a70 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20 20  "zip") ){.      
32a80 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
32a90 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
32aa0 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  LE;.#endif.     
32ab0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f   }else if( optio
32ac0 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65 6e  nMatch(z, "appen
32ad0 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  d") ){.        p
32ae0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
32af0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
32b00 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  S;.      }else i
32b10 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
32b20 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20 29 7b  , "readonly") ){
32b30 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
32b40 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
32b50 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
32b60 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
32b70 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
32b80 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
32b90 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
32ba0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
32bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
32bc0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
32bd0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
32be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32bf0 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e     /* If a filen
32c00 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
32c10 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74  , try to open it
32c20 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e   first */.    zN
32c30 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72  ewFilename = nAr
32c40 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  g>iName ? sqlite
32c50 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
32c60 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20  azArg[iName]) : 
32c70 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46  0;.    if( zNewF
32c80 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
32c90 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
32ca0 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
32cb0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
32cc0 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
32cd0 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
32ce0 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
32cf0 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50  (p, OPEN_DB_KEEP
32d00 41 4c 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66  ALIVE);.      if
32d10 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
32d20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32d30 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32d40 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
32d50 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
32d60 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
32d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
32d80 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
32d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
32da0 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
32db0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
32dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32dd0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
32de0 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
32df0 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
32e00 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
32e10 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
32e20 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
32e30 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
32e40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
32e50 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20   if( (c=='o'.   
32e60 20 20 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70       && (strncmp
32e70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
32e80 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e  ut", n)==0||strn
32e90 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
32ea0 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20  nce", n)==0)).  
32eb0 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e   || (c=='e' && n
32ec0 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==5 && strcmp(az
32ed0 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d  Arg[0],"excel")=
32ee0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
32ef0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
32f00 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
32f10 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
32f20 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f 64 65      int bTxtMode
32f30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a   = 0;.    if( az
32f40 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29  Arg[0][0]=='e' )
32f50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73  {.      /* Trans
32f60 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63 65 6c  form the ".excel
32f70 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22  " command into "
32f80 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20  .once -x" */.   
32f90 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20     nArg = 2;.   
32fa0 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f     azArg[0] = "o
32fb0 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c  nce";.      zFil
32fc0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22  e = azArg[1] = "
32fd0 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34  -x";.      n = 4
32fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32ff0 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
33000 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
33010 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20  rr, "Usage: .%s 
33020 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c  [-e|-x|FILE]\n",
33030 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
33040 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
33050 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
33060 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
33070 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
33080 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33090 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
330a0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
330b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
330c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
330d0 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65  Usage: .once (-e
330e0 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20  |-x|FILE)\n");. 
330f0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
33100 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
33110 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
33120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
33130 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20  outCount = 2;.  
33140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
33150 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
33160 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
33170 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
33180 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27  f( zFile[0]=='-'
33190 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d   && zFile[1]=='-
331a0 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66  ' ) zFile++;.#if
331b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
331c0 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
331d0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
331e0 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  "-e")==0 || strc
331f0 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d  mp(zFile, "-x")=
33200 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  =0 ){.      p->d
33210 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  oXdgOpen = 1;.  
33220 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 75      outputModePu
33230 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  sh(p);.      if(
33240 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29   zFile[1]=='x' )
33250 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
33260 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22 29 3b  pFile(p, "csv");
33270 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  .        p->mode
33280 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
33290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
332a0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
332b0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
332c0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
332d0 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
332e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
332f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
33300 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
33310 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
33320 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 20 20  EP_CrLf);.      
33330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
33340 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 74  ewTempFile(p, "t
33350 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20 62 54  xt");.        bT
33360 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  xtMode = 1;.    
33370 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 20    }.      zFile 
33380 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a  = p->zTempFile;.
33390 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
333a0 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
333b0 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20  STEM */.    if( 
333c0 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
333d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
333e0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
333f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33400 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
33410 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
33420 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
33430 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
33440 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
33450 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
33460 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
33470 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
33480 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
33490 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
334a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
334b0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
334c0 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
334d0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
334e0 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
334f0 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
33500 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
33510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33520 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
33530 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
33540 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
33550 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
33560 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
33570 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
33580 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
33590 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
335a0 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20  le, bTxtMode);. 
335b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
335c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
335d0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
335e0 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  off")!=0 ){.    
335f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33600 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
33610 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
33620 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
33630 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
33640 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
33650 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
33660 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65  c = 1;.      } e
33670 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lse {.        sq
33680 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
33690 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
336a0 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
336b0 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
336c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
336d0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
336e0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
336f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
33700 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rint", n)==0 ){.
33710 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
33720 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
33730 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
33740 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>1 ) raw_printf
33750 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
33760 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33770 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
33780 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
33790 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
337a0 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
337b0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
337c0 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
337d0 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
337e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
337f0 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b  if( nArg >= 2) {
33800 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d  .      strncpy(m
33810 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  ainPrompt,azArg[
33820 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  1],(int)ArraySiz
33830 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29  e(mainPrompt)-1)
33840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33850 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20  nArg >= 3) {.   
33860 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69     strncpy(conti
33870 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  nuePrompt,azArg[
33880 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  2],(int)ArraySiz
33890 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  e(continuePrompt
338a0 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  )-1);.    }.  }e
338b0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71  lse..  if( c=='q
338c0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
338d0 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e  rg[0], "quit", n
338e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
338f0 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69   2;.  }else..  i
33900 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d  f( c=='r' && n>=
33910 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
33920 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e  rg[0], "read", n
33930 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  )==0 ){.    FILE
33940 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e   *alt;.    if( n
33950 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
33960 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
33970 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64  r, "Usage: .read
33980 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
33990 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
339a0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
339b0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
339c0 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41   alt = fopen(azA
339d0 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20  rg[1], "rb");.  
339e0 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a    if( alt==0 ){.
339f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
33a00 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
33a10 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
33a20 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
33a30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
33a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33a50 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
33a60 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20  nput(p, alt);.  
33a70 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b      fclose(alt);
33a80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
33a90 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
33aa0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
33ab0 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f  azArg[0], "resto
33ac0 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  re", n)==0 ){.  
33ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
33ae0 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
33af0 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
33b00 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
33b10 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
33b20 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
33b30 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
33b40 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0;..    if( nArg
33b50 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==2 ){.      zSr
33b60 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  cFile = azArg[1]
33b70 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d  ;.      zDb = "m
33b80 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ain";.    }else 
33b90 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
33ba0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
33bb0 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20  azArg[2];.      
33bc0 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  zDb = azArg[1];.
33bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33be0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33bf0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73  rr, "Usage: .res
33c00 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e  tore ?DB? FILE\n
33c10 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
33c20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
33c30 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
33c40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
33c50 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63  qlite3_open(zSrc
33c60 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20  File, &pSrc);.  
33c70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33c80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
33c90 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
33ca0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
33cb0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
33cc0 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20  zSrcFile);.     
33cd0 20 63 6c 6f 73 65 5f 64 62 28 70 53 72 63 29 3b   close_db(pSrc);
33ce0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
33cf0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
33d00 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
33d10 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
33d20 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e 64  backup_init(p->d
33d30 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22 6d  b, zDb, pSrc, "m
33d40 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ain");.    if( p
33d50 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
33d60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
33d70 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
33d80 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
33d90 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
33da0 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 53 72      close_db(pSr
33db0 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
33dc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   1;.    }.    wh
33dd0 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
33de0 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70  e3_backup_step(p
33df0 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51  Backup,100))==SQ
33e00 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
33e10 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
33e20 42 55 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69  BUSY  ){.      i
33e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
33e40 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SY ){.        if
33e50 28 20 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20  ( nTimeout++ >= 
33e60 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
33e70 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
33e80 28 31 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (100);.      }. 
33e90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
33ea0 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
33eb0 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
33ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
33ed0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
33ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
33ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
33f00 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  || rc==SQLITE_LO
33f10 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 72 61  CKED ){.      ra
33f20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
33f30 20 22 45 72 72 6f 72 3a 20 73 6f 75 72 63 65 20   "Error: source 
33f40 64 61 74 61 62 61 73 65 20 69 73 20 62 75 73 79  database is busy
33f50 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
33f60 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
33f70 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33f80 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
33f90 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
33fa0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
33fb0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
33fc0 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62    }.    close_db
33fd0 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a  (pSrc);.  }else.
33fe0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
33ff0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34000 5d 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20  ], "scanstats", 
34010 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
34020 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
34030 20 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e    p->scanstatsOn
34040 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61   = (u8)booleanVa
34050 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  lue(azArg[1]);.#
34060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
34070 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
34080 41 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70  ATUS.      raw_p
34090 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
340a0 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61  arning: .scansta
340b0 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ts not available
340c0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c   in this build.\
340d0 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n");.#endif.    
340e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
340f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34100 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61  "Usage: .scansta
34110 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ts on|off\n");. 
34120 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34130 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
34140 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
34150 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
34160 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b  chema", n)==0 ){
34170 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
34180 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c  Select;.    Shel
34190 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
341a0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
341b0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
341c0 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a  ar *zDiv = "(";.
341d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
341e0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  zName = 0;.    i
341f0 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a  nt iSchema = 0;.
34200 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d      int bDebug =
34210 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
34220 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
34230 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
34240 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
34250 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
34260 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
34270 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
34280 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
34290 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69  DE_Semi;.    ini
342a0 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  tText(&sSelect);
342b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
342c0 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
342d0 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d       if( optionM
342e0 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
342f0 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  indent") ){.    
34300 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
34310 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
34320 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
34330 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
34340 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c  Match(azArg[ii],
34350 22 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20  "debug") ){.    
34360 20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a      bDebug = 1;.
34370 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34380 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
34390 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72      zName = azAr
343a0 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  g[ii];.      }el
343b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
343c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
343d0 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f  Usage: .schema ?
343e0 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d  --indent? ?LIKE-
343f0 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
34400 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34410 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
34420 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
34430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34440 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  if( zName!=0 ){.
34450 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74        int isMast
34460 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  er = sqlite3_str
34470 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  like(zName, "sql
34480 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c  ite_master", '\\
34490 27 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  ')==0;.      if(
344a0 20 69 73 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c   isMaster || sql
344b0 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61  ite3_strlike(zNa
344c0 6d 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  me,"sqlite_temp_
344d0 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d  master", '\\')==
344e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
344f0 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20  r *new_argv[2], 
34500 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20  *new_colv[2];.  
34510 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30        new_argv[0
34520 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
34530 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
34540 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
34550 54 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22  TE TABLE %s (\n"
34560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34570 20 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74         "  type t
34580 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
345a0 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20   name text,\n". 
345b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345c0 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65       "  tbl_name
345d0 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20   text,\n".      
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65  "  rootpage inte
34600 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ger,\n".        
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
34620 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20   sql text\n".   
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34640 20 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72     ")", isMaster
34650 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65   ? "sqlite_maste
34660 72 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d  r" : "sqlite_tem
34670 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20  p_master");.    
34680 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20      new_argv[1] 
34690 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  = 0;.        new
346a0 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22  _colv[0] = "sql"
346b0 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f  ;.        new_co
346c0 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  lv[1] = 0;.     
346d0 20 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74     callback(&dat
346e0 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20  a, 1, new_argv, 
346f0 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20  new_colv);.     
34700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34710 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20  new_argv[0]);.  
34720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34730 69 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20  if( zDiv ){.    
34740 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
34750 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
34760 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
34770 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
34780 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f  "SELECT name FRO
34790 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73  M pragma_databas
347a0 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20  e_list",.       
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347c0 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
347d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
347e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
347f0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34800 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
34810 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
34820 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
34830 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
34840 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
34850 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34860 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
34870 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
34880 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
34890 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
348a0 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c  ELECT sql FROM",
348b0 20 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65   0);.      iSche
348c0 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  ma = 0;.      wh
348d0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
348e0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
348f0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
34900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
34910 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
34920 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
34930 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
34940 20 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75        char zScNu
34950 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  m[30];.        s
34960 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34970 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20  sizeof(zScNum), 
34980 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b  zScNum, "%d", ++
34990 69 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  iSchema);.      
349a0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
349b0 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b  elect, zDiv, 0);
349c0 0a 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20  .        zDiv = 
349d0 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20  " UNION ALL ";. 
349e0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
349f0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c  t(&sSelect, "SEL
34a00 45 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63  ECT shell_add_sc
34a10 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a  hema(sql,", 0);.
34a20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
34a30 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c  te3_stricmp(zDb,
34a40 20 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20   "main")!=0 ){. 
34a50 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
34a60 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
34a70 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
34a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34a90 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
34aa0 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30  elect, "NULL", 0
34ab0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34ac0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34ad0 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65  &sSelect, ",name
34ae0 29 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20  ) AS sql, type, 
34af0 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
34b00 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20  rowid,", 0);.   
34b10 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34b20 26 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d  &sSelect, zScNum
34b30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
34b40 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
34b50 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c  t, " AS snum, ",
34b60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
34b70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34b80 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20  , zDb, '\'');.  
34b90 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
34ba0 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20  (&sSelect, " AS 
34bb0 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29  sname FROM ", 0)
34bc0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
34bd0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
34be0 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20  Db, '"');.      
34bf0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
34c00 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f  elect, ".sqlite_
34c10 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20  master", 0);.   
34c20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
34c30 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
34c40 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
34c50 45 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f  E_INTROSPECTION_
34c60 50 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66  PRAGMAS.      if
34c70 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
34c80 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34c90 53 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20  Select,.        
34ca0 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53     " UNION ALL S
34cb0 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75  ELECT shell_modu
34cc0 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c  le_schema(name),
34cd0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27  ".           " '
34ce0 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61  table', name, na
34cf0 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c  me, name, 9e+99,
34d00 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61   'main' FROM pra
34d10 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22  gma_module_list"
34d20 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
34d30 6e 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e  ndif.      appen
34d40 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
34d50 22 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a  ") WHERE ", 0);.
34d60 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
34d70 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
34d80 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33  *zQarg = sqlite3
34d90 5f 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a  _mprintf("%Q", z
34da0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
34db0 6e 74 20 62 47 6c 6f 62 20 3d 20 73 74 72 63 68  nt bGlob = strch
34dc0 72 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 21 3d  r(zName, '*') !=
34dd0 20 30 20 7c 7c 20 73 74 72 63 68 72 28 7a 4e 61   0 || strchr(zNa
34de0 6d 65 2c 20 27 3f 27 29 20 21 3d 20 30 20 7c 7c  me, '?') != 0 ||
34df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34e00 20 20 20 20 20 73 74 72 63 68 72 28 7a 4e 61 6d       strchr(zNam
34e10 65 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a 20 20  e, '[') != 0;.  
34e20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72        if( strchr
34e30 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a  (zName, '.') ){.
34e40 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
34e50 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
34e60 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73  lower(printf('%s
34e70 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e  .%s',sname,tbl_n
34e80 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20  ame))", 0);.    
34e90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34ea0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
34eb0 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72  &sSelect, "lower
34ec0 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b  (tbl_name)", 0);
34ed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34ee0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34ef0 53 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20 3f 20  Select, bGlob ? 
34f00 22 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b  " GLOB " : " LIK
34f10 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  E ", 0);.       
34f20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
34f30 6c 65 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b  lect, zQarg, 0);
34f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 47  .        if( !bG
34f50 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lob ){.         
34f60 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
34f70 6c 65 63 74 2c 20 22 20 45 53 43 41 50 45 20 27  lect, " ESCAPE '
34f80 5c 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  \\' ", 0);.     
34f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70     }.        app
34fa0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
34fb0 2c 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20  , " AND ", 0);. 
34fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
34fd0 72 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20 20  ree(zQarg);.    
34fe0 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
34ff0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
35000 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44  type!='meta' AND
35010 20 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c   sql IS NOT NULL
35020 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
35030 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
35040 52 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f  RDER BY snum, ro
35050 77 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  wid", 0);.      
35060 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20  if( bDebug ){.  
35070 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35080 66 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a 20  f(p->out, "SQL: 
35090 25 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74 2e  %s;\n", sSelect.
350a0 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  z);.      }else{
350b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
350c0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
350d0 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c  , sSelect.z, cal
350e0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
350f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  ErrMsg);.      }
35100 0a 20 20 20 20 20 20 66 72 65 65 54 65 78 74 28  .      freeText(
35110 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d  &sSelect);.    }
35120 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
35130 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35140 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
35150 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ror: %s\n", zErr
35160 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
35170 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
35180 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
351a0 63 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  c != SQLITE_OK )
351b0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
351c0 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
351d0 3a 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d  : querying schem
351e0 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22  a information\n"
351f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35200 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35210 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
35220 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66    }else..#if def
35230 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
35240 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
35250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
35260 43 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63  CTTRACE).  if( c
35270 3d 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26  =='s' && n==11 &
35280 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35290 30 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65  0], "selecttrace
352a0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
352b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
352c0 63 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  ce = (int)intege
352d0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  rValue(azArg[1])
352e0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
352f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
35300 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
35310 49 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73  ION).  if( c=='s
35320 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
35330 72 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c  rg[0],"session",
35340 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b  n)==0 && n>=3 ){
35350 0a 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  .    OpenSession
35360 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d   *pSession = &p-
35370 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20  >aSession[0];.  
35380 20 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d    char **azCmd =
35390 20 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20   &azArg[1];.    
353a0 69 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20  int iSes = 0;.  
353b0 20 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72    int nCmd = nAr
353c0 67 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69  g - 1;.    int i
353d0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d  ;.    if( nArg<=
353e0 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  1 ) goto session
353f0 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
35400 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
35410 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  ;.    if( nArg>=
35420 33 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  3 ){.      for(i
35430 53 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e  Ses=0; iSes<p->n
35440 53 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29  Session; iSes++)
35450 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  {.        if( st
35460 72 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e  rcmp(p->aSession
35470 5b 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a  [iSes].zName, az
35480 41 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65  Arg[1])==0 ) bre
35490 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
354a0 20 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53    if( iSes<p->nS
354b0 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
354c0 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
354d0 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b  >aSession[iSes];
354e0 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b  .        azCmd++
354f0 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d  ;.        nCmd--
35500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35510 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20         pSession 
35520 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30  = &p->aSession[0
35530 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73 20  ];.        iSes 
35540 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
35550 20 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73   }..    /* .sess
35560 69 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45  ion attach TABLE
35570 0a 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74  .    ** Invoke t
35580 68 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  he sqlite3sessio
35590 6e 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65 72  n_attach() inter
355a0 66 61 63 65 20 74 6f 20 61 74 74 61 63 68 20 61  face to attach a
355b0 20 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20   particular.    
355c0 2a 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74  ** table so that
355d0 20 69 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c   it is never fil
355e0 74 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  tered..    */.  
355f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
35600 6d 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d  md[0],"attach")=
35610 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
35620 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73  nCmd!=2 ) goto s
35630 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
35640 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ror;.      if( p
35650 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b  Session->p==0 ){
35660 0a 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e  .        session
35670 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20  _not_open:.     
35680 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35690 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
356a0 20 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70   sessions are op
356b0 65 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65  en\n");.      }e
356c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
356d0 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
356e0 5f 61 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e  _attach(pSession
356f0 2d 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a  ->p, azCmd[1]);.
35700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
35710 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
35720 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35730 45 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65  ERROR: sqlite3se
35740 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72  ssion_attach() r
35750 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
35760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
35770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
35780 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35790 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
357a0 6e 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45  n changeset FILE
357b0 0a 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e  .    ** .session
357c0 20 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20   patchset FILE. 
357d0 20 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68     ** Write a ch
357e0 61 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68  angeset or patch
357f0 73 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  set into a file.
35800 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76    The file is ov
35810 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  erwritten..    *
35820 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
35830 28 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67  (azCmd[0],"chang
35840 65 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72  eset")==0 || str
35850 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61  cmp(azCmd[0],"pa
35860 74 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20  tchset")==0 ){. 
35870 20 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d       FILE *out =
35880 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43   0;.      if( nC
35890 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73  md!=2 ) goto ses
358a0 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
358b0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
358c0 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f  ssion->p==0 ) go
358d0 74 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f  to session_not_o
358e0 70 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d  pen;.      out =
358f0 20 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c   fopen(azCmd[1],
35900 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66   "wb");.      if
35910 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
35920 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35930 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
35940 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
35950 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e  \" for writing\n
35960 22 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  ", azCmd[1]);.  
35970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35980 20 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20     int szChng;. 
35990 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68         void *pCh
359a0 6e 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ng;.        if( 
359b0 61 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27  azCmd[0][0]=='c'
359c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
359d0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
359e0 6e 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65 73  n_changeset(pSes
359f0 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67  sion->p, &szChng
35a00 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  , &pChng);.     
35a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35a30 73 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74  session_patchset
35a40 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73  (pSession->p, &s
35a50 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a  zChng, &pChng);.
35a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35a70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35a80 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 72        printf("Er
35a90 72 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  ror: error code 
35aa0 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
35ab0 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
35ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35ad0 69 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20  if( pChng.      
35ae0 20 20 20 20 26 26 20 66 77 72 69 74 65 28 70 43      && fwrite(pC
35af0 68 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20  hng, szChng, 1, 
35b00 6f 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  out)!=1 ){.     
35b10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35b20 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
35b30 46 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20  Failed to write 
35b40 65 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f  entire %d-byte o
35b50 75 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20  utput\n",.      
35b60 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 68              szCh
35b70 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
35b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
35b90 72 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20  ree(pChng);.    
35ba0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
35bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
35bc0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
35bd0 69 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ion close.    **
35be0 20 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74   Close the ident
35bf0 69 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20  ified session.  
35c00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
35c10 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63  cmp(azCmd[0], "c
35c20 6c 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lose")==0 ){.   
35c30 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29     if( nCmd!=1 )
35c40 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
35c50 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
35c60 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
35c70 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73  n ){.        ses
35c80 73 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73  sion_close(pSess
35c90 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ion);.        p-
35ca0 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20  >aSession[iSes] 
35cb0 3d 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d  = p->aSession[--
35cc0 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20  p->nSession];.  
35cd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
35ce0 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
35cf0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
35d00 3f 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f  ?.    ** Query o
35d10 72 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65  r set the enable
35d20 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20   flag.    */.   
35d30 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
35d40 64 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d  d[0], "enable")=
35d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
35d60 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  ii;.      if( nC
35d70 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73  md>2 ) goto sess
35d80 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
35d90 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d  ;.      ii = nCm
35da0 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c  d==1 ? -1 : bool
35db0 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31  eanValue(azCmd[1
35dc0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ]);.      if( p-
35dd0 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20  >nSession ){.   
35de0 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65       ii = sqlite
35df0 33 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28  3session_enable(
35e00 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29  pSession->p, ii)
35e10 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
35e20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
35e30 65 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65  ession %s enable
35e40 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20   flag = %d\n",. 
35e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e60 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61     pSession->zNa
35e70 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d  me, ii);.      }
35e80 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
35e90 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74  /* .session filt
35ea0 65 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20  er GLOB .....   
35eb0 20 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f   ** Set a list o
35ec0 66 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  f GLOB patterns 
35ed0 6f 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74  of table names t
35ee0 6f 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20  o be excluded.. 
35ef0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
35f00 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
35f10 66 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20  filter")==0 ){. 
35f20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79       int ii, nBy
35f30 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43  te;.      if( nC
35f40 6d 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73  md<2 ) goto sess
35f50 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
35f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
35f70 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
35f80 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35f90 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
35fa0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
35fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35fc0 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
35fd0 74 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  ter[ii]);.      
35fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
35ff0 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
36000 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20  n->azFilter);.  
36010 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69        nByte = si
36020 7a 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61  zeof(pSession->a
36030 7a 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d  zFilter[0])*(nCm
36040 64 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53  d-1);.        pS
36050 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
36060 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
36070 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
36080 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e      if( pSession
36090 2d 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b  ->azFilter==0 ){
360a0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
360b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
360c0 72 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d  rror: out or mem
360d0 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
360e0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
360f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
36100 72 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b  r(ii=1; ii<nCmd;
36110 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
36120 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69    pSession->azFi
36130 6c 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c  lter[ii-1] = sql
36140 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
36150 22 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20  ", azCmd[ii]);. 
36160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36170 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74   pSession->nFilt
36180 65 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20  er = ii-1;.     
36190 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
361a0 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e    /* .session in
361b0 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f  direct ?BOOLEAN?
361c0 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72  .    ** Query or
361d0 20 73 65 74 20 74 68 65 20 69 6e 64 69 72 65 63   set the indirec
361e0 74 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20  t flag.    */.  
361f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
36200 6d 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74  md[0], "indirect
36210 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36220 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28  nt ii;.      if(
36230 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73   nCmd>2 ) goto s
36240 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
36250 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20  ror;.      ii = 
36260 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62  nCmd==1 ? -1 : b
36270 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d  ooleanValue(azCm
36280 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  d[1]);.      if(
36290 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
362a0 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
362b0 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69  ite3session_indi
362c0 72 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70  rect(pSession->p
362d0 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75  , ii);.        u
362e0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
362f0 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69  t, "session %s i
36300 6e 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25  ndirect flag = %
36310 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
36320 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
36330 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a  on->zName, ii);.
36340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36350 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
36360 6f 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a  on isempty.    *
36370 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74  * Determine if t
36380 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
36390 70 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  pty.    */.    i
363a0 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
363b0 30 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d  0], "isempty")==
363c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
363d0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  i;.      if( nCm
363e0 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
363f0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
36400 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
36410 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
36420 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
36430 65 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70  ession_isempty(p
36440 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20  Session->p);.   
36450 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36460 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
36470 6e 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61  n %s isempty fla
36480 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  g = %d\n",.     
36490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
364a0 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20  Session->zName, 
364b0 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ii);.      }.   
364c0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
364d0 73 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20  session list.   
364e0 20 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72   ** List all cur
364f0 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
36500 69 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ions.    */.    
36510 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
36520 5b 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29  [0],"list")==0 )
36530 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
36540 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
36550 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74  i++){.        ut
36560 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
36570 2c 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20  , "%d %s\n", i, 
36580 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a  p->aSession[i].z
36590 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
365a0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
365b0 20 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44   .session open D
365c0 42 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70  B NAME.    ** Op
365d0 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e  en a new session
365e0 20 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20   called NAME on 
365f0 74 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74  the attached dat
36600 61 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a  abase DB..    **
36610 20 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   DB is normally 
36620 22 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20  "main"..    */. 
36630 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
36640 43 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d  Cmd[0],"open")==
36650 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
36660 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66  *zName;.      if
36670 28 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f  ( nCmd!=3 ) goto
36680 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
36690 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61  error;.      zNa
366a0 6d 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20  me = azCmd[2];. 
366b0 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30       if( zName[0
366c0 5d 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73  ]==0 ) goto sess
366d0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
366e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
366f0 20 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20   i<p->nSession; 
36700 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
36710 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73  ( strcmp(p->aSes
36720 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e  sion[i].zName,zN
36730 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
36740 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36750 28 73 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f  (stderr, "Sessio
36760 6e 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  n \"%s\" already
36770 20 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d   exists\n", zNam
36780 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
36790 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
367a0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  exit;.        }.
367b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
367c0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41  ( p->nSession>=A
367d0 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73  rraySize(p->aSes
367e0 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  sion) ){.       
367f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36800 72 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20  rr, "Maximum of 
36810 25 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20  %d sessions\n", 
36820 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65  ArraySize(p->aSe
36830 73 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20  ssion));.       
36840 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
36850 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
36860 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20  .      pSession 
36870 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70  = &p->aSession[p
36880 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20  ->nSession];.   
36890 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
368a0 65 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d  ession_create(p-
368b0 3e 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26  >db, azCmd[1], &
368c0 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
368d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
368e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
368f0 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
36900 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65   open session: e
36910 72 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c  rror code=%d\n",
36920 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63   rc);.        rc
36930 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
36940 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36950 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
36960 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46      pSession->nF
36970 69 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  ilter = 0;.     
36980 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
36990 74 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65  table_filter(pSe
369a0 73 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f  ssion->p, sessio
369b0 6e 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69  n_filter, pSessi
369c0 6f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  on);.      p->nS
369d0 65 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20  ession++;.      
369e0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20  pSession->zName 
369f0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
36a00 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  f("%s", zName);.
36a10 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a      }else.    /*
36a20 20 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e   If no command n
36a30 61 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68 6f  ame matches, sho
36a40 77 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  w a syntax error
36a50 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
36a60 73 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20  syntax_error:.  
36a70 20 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75    showHelp(p->ou
36a80 74 2c 20 22 73 65 73 73 69 6f 6e 22 29 3b 0a 20  t, "session");. 
36a90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23   }else.#endif..#
36aa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36ab0 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75 6d 65  UG.  /* Undocume
36ac0 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f  nted commands fo
36ad0 72 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 69  r internal testi
36ae0 6e 67 2e 20 20 53 75 62 6a 65 63 74 20 74 6f 20  ng.  Subject to 
36af0 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69 74 68  change.  ** with
36b00 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20  out notice. */. 
36b10 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
36b20 3e 3d 31 30 20 26 26 20 73 74 72 6e 63 6d 70 28  >=10 && strncmp(
36b30 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 66 74  azArg[0], "selft
36b40 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29 7b 0a  est-", 9)==0 ){.
36b50 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
36b60 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f  azArg[0]+9, "boo
36b70 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30 20 29  lean", n-9)==0 )
36b80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 76  {.      int i, v
36b90 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
36ba0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
36bb0 20 20 20 20 20 20 20 76 20 3d 20 62 6f 6f 6c 65         v = boole
36bc0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d  anValue(azArg[i]
36bd0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
36be0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
36bf0 25 73 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20  %s: %d 0x%x\n", 
36c00 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b  azArg[i], v, v);
36c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36c20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
36c30 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65  zArg[0]+9, "inte
36c40 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b  ger", n-9)==0 ){
36c50 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71  .      int i; sq
36c60 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
36c70 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
36c80 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
36c90 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30      char zBuf[20
36ca0 30 5d 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  0];.        v = 
36cb0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
36cc0 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
36cd0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36ce0 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
36cf0 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25  uf,"%s: %lld 0x%
36d00 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d  llx\n", azArg[i]
36d10 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 75  ,v,v);.        u
36d20 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
36d30 74 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  t, "%s", zBuf);.
36d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36d50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
36d60 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e  if( c=='s' && n>
36d70 3d 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =4 && strncmp(az
36d80 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74 65 73 74  Arg[0],"selftest
36d90 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ",n)==0 ){.    i
36da0 6e 74 20 62 49 73 49 6e 69 74 20 3d 20 30 3b 20  nt bIsInit = 0; 
36db0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
36dc0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
36dd0 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
36de0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 56 65 72   */.    int bVer
36df0 62 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20  bose = 0;       
36e00 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f 75 74 70   /* Verbose outp
36e10 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53  ut */.    int bS
36e20 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20 20  elftestExists;  
36e30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 45     /* True if SE
36e40 4c 46 54 45 53 54 20 61 6c 72 65 61 64 79 20 65  LFTEST already e
36e50 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  xists */.    int
36e60 20 69 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   i, k;          
36e70 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
36e80 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e  unters */.    in
36e90 74 20 6e 54 65 73 74 20 3d 20 30 3b 20 20 20 20  t nTest = 0;    
36ea0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36eb0 20 6f 66 20 74 65 73 74 73 20 72 75 6e 73 20 2a   of tests runs *
36ec0 2f 0a 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d  /.    int nErr =
36ed0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
36ee0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
36ef0 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 53  rs seen */.    S
36f00 68 65 6c 6c 54 65 78 74 20 73 74 72 3b 20 20 20  hellText str;   
36f10 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 73 77 65          /* Answe
36f20 72 20 66 6f 72 20 61 20 71 75 65 72 79 20 2a 2f  r for a query */
36f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
36f40 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 2f 2a  t *pStmt = 0; /*
36f50 20 51 75 65 72 79 20 61 67 61 69 6e 73 74 20 74   Query against t
36f60 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  he SELFTEST tabl
36f70 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f 64  e */..    open_d
36f80 62 28 70 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28  b(p,0);.    for(
36f90 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
36fa0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
36fb0 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
36fc0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30  ];.      if( z[0
36fd0 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
36fe0 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
36ff0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
37000 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  init")==0 ){.   
37010 20 20 20 20 20 62 49 73 49 6e 69 74 20 3d 20 31       bIsInit = 1
37020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
37030 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
37040 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"-v")==0 ){.   
37050 20 20 20 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b       bVerbose++;
37060 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
37070 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 74 66     {.        utf
37080 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
37090 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
370a0 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c   \"%s\" on \"%s\
370b0 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
370c0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
370d0 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  i], azArg[0]);. 
370e0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
370f0 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c  f(stderr, "Shoul
37100 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69  d be one of: --i
37110 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20  nit -v\n");.    
37120 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
37130 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
37140 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
37150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
37160 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  ( sqlite3_table_
37170 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
37180 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65  p->db,"main","se
37190 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c  lftest",0,0,0,0,
371a0 30 2c 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  0,0).           
371b0 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
371c0 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45        bSelftestE
371d0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d  xists = 0;.    }
371e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 53 65 6c  else{.      bSel
371f0 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b  ftestExists = 1;
37200 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
37210 49 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20  IsInit ){.      
37220 63 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61  createSelftestTa
37230 62 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 62 53  ble(p);.      bS
37240 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20  elftestExists = 
37250 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 69  1;.    }.    ini
37260 74 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20  tText(&str);.   
37270 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 74 72   appendText(&str
37280 2c 20 22 78 22 2c 20 30 29 3b 0a 20 20 20 20 66  , "x", 0);.    f
37290 6f 72 28 6b 3d 62 53 65 6c 66 74 65 73 74 45 78  or(k=bSelftestEx
372a0 69 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29  ists; k>=0; k--)
372b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 31  {.      if( k==1
372c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
372d0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
372e0 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
372f0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
37300 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52  no,op,cmd,ans FR
37310 4f 4d 20 73 65 6c 66 74 65 73 74 20 4f 52 44 45  OM selftest ORDE
37320 52 20 42 59 20 74 6e 6f 22 2c 0a 20 20 20 20 20  R BY tno",.     
37330 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d         -1, &pStm
37340 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  t, 0);.      }el
37350 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
37360 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
37370 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20  _v2(p->db,.     
37380 20 20 20 20 20 22 56 41 4c 55 45 53 28 30 2c 27       "VALUES(0,'
37390 6d 65 6d 6f 27 2c 27 4d 69 73 73 69 6e 67 20 53  memo','Missing S
373a0 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2d 20  ELFTEST table - 
373b0 64 65 66 61 75 6c 74 20 63 68 65 63 6b 73 20 6f  default checks o
373c0 6e 6c 79 27 2c 27 27 29 2c 22 0a 20 20 20 20 20  nly',''),".     
373d0 20 20 20 20 20 22 20 20 20 20 20 20 28 31 2c 27       "      (1,'
373e0 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74  run','PRAGMA int
373f0 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f  egrity_check','o
37400 6b 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  k')",.          
37410 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
37420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37430 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
37440 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
37450 72 2c 20 22 45 72 72 6f 72 20 71 75 65 72 79 69  r, "Error queryi
37460 6e 67 20 74 68 65 20 73 65 6c 66 74 65 73 74 20  ng the selftest 
37470 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20  table\n");.     
37480 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
37490 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
374a0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
374b0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
374c0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
374d0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
374e0 31 3b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  1; sqlite3_step(
374f0 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
37500 4f 57 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OW; i++){.      
37510 20 20 69 6e 74 20 74 6e 6f 20 3d 20 73 71 6c 69    int tno = sqli
37520 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
37530 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
37540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
37550 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  p = (const char*
37560 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
37570 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
37580 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
37590 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
375a0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
375b0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
375c0 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 2);.        c
375d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 73 20  onst char *zAns 
375e0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
375f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
37600 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  xt(pStmt, 3);.. 
37610 20 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20         k = 0;.  
37620 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f        if( bVerbo
37630 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  se>0 ){.        
37640 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 20 3d    char *zQuote =
37650 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
37660 28 22 25 71 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  ("%q", zSql);.  
37670 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
37680 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c 20 74 6e  %d: %s %s\n", tn
37690 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20  o, zOp, zSql);. 
376a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
376b0 5f 66 72 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20  _free(zQuote);. 
376c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
376d0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
376e0 22 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  "memo")==0 ){.  
376f0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
37700 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
37710 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
37720 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
37730 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c   if( strcmp(zOp,
37740 22 72 75 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "run")==0 ){.   
37750 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72         char *zEr
37760 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
37770 20 20 20 20 73 74 72 2e 6e 20 3d 20 30 3b 0a 20      str.n = 0;. 
37780 20 20 20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30           str.z[0
37790 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
377a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
377b0 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
377c0 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
377d0 6c 62 61 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45  lback, &str, &zE
377e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
377f0 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20