/ Hex Artifact Content
Login

Artifact 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7:


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 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6300: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6310: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
6330: 41 47 45 5f 56 54 41 42 29 0a 49 4e 43 4c 55 44  AGE_VTAB).INCLUD
6340: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 64 62  E ../ext/misc/db
6350: 64 61 74 61 2e 63 0a 23 65 6e 64 69 66 0a 0a 23  data.c.#endif..#
6360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6370: 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
6380: 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  )./*.** State in
6390: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
63a0: 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73  single open sess
63b0: 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ion.*/.typedef s
63c0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63d0: 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73  n OpenSession;.s
63e0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63f0: 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  n {.  char *zNam
6400: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
6410: 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  * Symbolic name 
6420: 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e  for this session
6430: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65   */.  int nFilte
6440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
6450: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c  * Number of xFil
6460: 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c  ter rejection GL
6470: 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20  OB patterns */. 
6480: 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72   char **azFilter
6490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ;         /* Arr
64a0: 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  ay of xFilter re
64b0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
64c0: 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74  terns */.  sqlit
64d0: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20  e3_session *p;  
64e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
64f0: 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65  session */.};.#e
6500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c  ndif../*.** Shel
6510: 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e  l output mode in
6520: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
6530: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
6540: 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f  on",.** saved so
6550: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
6560: 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78  restored by ".ex
6570: 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79  plain off".*/.ty
6580: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76  pedef struct Sav
6590: 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64  edModeInfo Saved
65a0: 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ModeInfo;.struct
65b0: 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b   SavedModeInfo {
65c0: 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20  .  int valid;   
65d0: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65         /* Is the
65e0: 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e  re legit data in
65f0: 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   here? */.  int 
6600: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
6610: 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f  /* Mode prior to
6620: 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a   ".explain on" *
6630: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
6640: 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22  er;     /* The "
6650: 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67  .header" setting
6660: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6670: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6680: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
6690: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68   /* Column width
66a0: 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  s prior to ".exp
66b0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a  lain on" */.};..
66c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
66d0: 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74  xpertInfo Expert
66e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70  Info;.struct Exp
66f0: 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69  ertInfo {.  sqli
6700: 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65  te3expert *pExpe
6710: 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f  rt;.  int bVerbo
6720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e  se;.};../* A sin
6730: 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20  gle line in the 
6740: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79  EQP output */.ty
6750: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6760: 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61 70  GraphRow EQPGrap
6770: 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50  hRow;.struct EQP
6780: 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74  GraphRow {.  int
6790: 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20 20   iEqpId;        
67a0: 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69     /* ID for thi
67b0: 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  s row */.  int i
67c0: 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20  ParentId;       
67d0: 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61   /* ID of the pa
67e0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51  rent row */.  EQ
67f0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74  PGraphRow *pNext
6800: 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20  ;   /* Next row 
6810: 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  in sequence */. 
6820: 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20   char zText[1]; 
6830: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
6840: 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68  o display for th
6850: 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  is row */.};../*
6860: 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20   All EQP output 
6870: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
6880: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
68a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
68b0: 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72 61   EQPGraph EQPGra
68c0: 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ph;.struct EQPGr
68d0: 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68  aph {.  EQPGraph
68e0: 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a  Row *pRow;    /*
68f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
6900: 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
6910: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
6920: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61  EQPGraphRow *pLa
6930: 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c  st;   /* Last el
6940: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f  ement of the pRo
6950: 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  w list */.  char
6960: 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20   zPrefix[100];  
6970: 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69    /* Graph prefi
6980: 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  x */.};../*.** S
6990: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
69a0: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
69b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
69c0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
69d0: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
69e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
6a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
6a10: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
6a20: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
6a30: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
6a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
6a50: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
6a60: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c  */.  u8 autoExpl
6a70: 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ain;        /* A
6a80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
6a90: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
6aa0: 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45  de */.  u8 autoE
6ab0: 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  QP;            /
6ac0: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
6ad0: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
6ae0: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
6af0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6b00: 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  test;        /* 
6b10: 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65  autoEQP is in te
6b20: 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20  st mode */.  u8 
6b30: 61 75 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20  autoEQPtrace;   
6b40: 20 20 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69      /* autoEQP i
6b50: 73 20 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20  s in trace mode 
6b60: 2a 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b  */.  u8 statsOn;
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6b80: 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d  rue to display m
6b90: 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f  emory stats befo
6ba0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
6bb0: 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61   */.  u8 scansta
6bc0: 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  tsOn;        /* 
6bd0: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
6be0: 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72  scan stats befor
6bf0: 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20  e each finalize 
6c00: 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65  */.  u8 openMode
6c10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
6c20: 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
6c30: 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72  , _APPENDVFS, or
6c40: 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75   _ZIPFILE */.  u
6c50: 38 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20  8 doXdgOpen;    
6c60: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
6c70: 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
6c80: 70 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65  pen in output_re
6c90: 73 65 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45  set() */.  u8 nE
6ca0: 71 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  qpLevel;        
6cb0: 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68    /* Depth of th
6cc0: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6cd0: 70 68 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63  ph */.  u8 eTrac
6ce0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  eType;         /
6cf0: 2a 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20  * SHELL_TRACE_* 
6d00: 76 61 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f  value for type o
6d10: 66 20 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73  f trace */.  uns
6d20: 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b  igned mEqpLines;
6d30: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
6d40: 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69  eritical lines i
6d50: 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75 74  n the EQP output
6d60: 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20   graph */.  int 
6d70: 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  outCount;       
6d80: 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20     /* Revert to 
6d90: 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63  stdout when reac
6da0: 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69  hing zero */.  i
6db0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
6dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6dd0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
6de0: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
6df0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20   int lineno;    
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c  number of last l
6e20: 69 6e 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e  ine read from in
6e30: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e50: 52 65 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72  Read commands fr
6e60: 6f 6d 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a  om this stream *
6e70: 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20  /.  FILE *out;  
6e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6e90: 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
6ea0: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63   */.  FILE *trac
6eb0: 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  eOut;        /* 
6ec0: 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74  Output for sqlit
6ed0: 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20  e3_trace() */.  
6ee0: 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
6ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f00: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
6f10: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6f30: 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65  n output mode se
6f40: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d  tting */.  int m
6f50: 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20  odePrior;       
6f60: 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20    /* Saved mode 
6f70: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f90: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6fa0: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fb0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fc0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fd0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fe0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6ff0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
7000: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7010: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7020: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7030: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7040: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7050: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7060: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7070: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7080: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7090: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
70a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70b0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70c0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70d0: 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65  unsigned nProgre
70e0: 73 73 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ss;    /* Number
70f0: 20 6f 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c   of progress cal
7100: 6c 62 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72  lbacks encounter
7110: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
7120: 20 6d 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f   mxProgress;   /
7130: 2a 20 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65  * Maximum progre
7140: 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66  ss callbacks bef
7150: 6f 72 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20  ore failing */. 
7160: 20 75 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f   unsigned flgPro
7170: 67 72 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73  gress;  /* Flags
7180: 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73   for the progres
7190: 73 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  s callback */.  
71a0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
71b0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
71c0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  s flags */.  sql
71d0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78  ite3_int64 szMax
71e0: 3b 20 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65  ;   /* --maxsize
71f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70   argument to .op
7200: 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  en */.  char *zD
7210: 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f  estTable;      /
7220: 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e  * Name of destin
7230: 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e  ation table when
7240: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a   MODE_Insert */.
7250: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
7260: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  e;       /* Temp
7270: 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20  orary file that 
7280: 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74  might need delet
7290: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
72a0: 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20  estcase[30];    
72b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65  /* Name of curre
72c0: 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a  nt test case */.
72d0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61    char colSepara
72e0: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75  tor[20]; /* Colu
72f0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
7300: 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72  racter for sever
7310: 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68  al modes */.  ch
7320: 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  ar rowSeparator[
7330: 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61  20]; /* Row sepa
7340: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
7350: 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a  for MODE_Ascii *
7360: 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50  /.  char colSepP
7370: 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61  rior[20];  /* Sa
7380: 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ved column separ
7390: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72  ator */.  char r
73a0: 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  owSepPrior[20]; 
73b0: 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65   /* Saved row se
73c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
73d0: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
73e0: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
73f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
7400: 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f  olumn when in co
7410: 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e  lumn mode*/.  in
7420: 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30  t actualWidth[10
7430: 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77  0];  /* Actual w
7440: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7450: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75  umn */.  char nu
7460: 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20  llValue[20];    
7470: 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70  /* The text to p
7480: 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c  rint when a NULL
7490: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
74a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
74c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
74d0: 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45  har outfile[FILE
74e0: 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69  NAME_MAX]; /* Fi
74f0: 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20  lename for *out 
7500: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7510: 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20  *zDbFilename;   
7520: 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
7530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7540: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e  .  char *zFreeOn
7550: 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Close;         /
7560: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72  * Filename to fr
7570: 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ee when closing 
7580: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7590: 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *zVfs;          
75a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
75b0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
75c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
75d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
75e0: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20  atement if any. 
75f0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b  */.  FILE *pLog;
7600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
7610: 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20  rite log output 
7620: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  here */.  int *a
7630: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
7640: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
7650: 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44  ents used in MOD
7660: 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69  E_Explain */.  i
7670: 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt nIndent;     
7680: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7690: 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b   array aiIndent[
76a0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  ] */.  int iInde
76b0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
76c0: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
76d0: 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74  t op in aiIndent
76e0: 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68  [] */.  EQPGraph
76f0: 20 73 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f   sGraph;       /
7700: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * Information fo
7710: 72 20 74 68 65 20 67 72 61 70 68 69 63 61 6c 20  r the graphical 
7720: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7730: 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  AN */.#if define
7740: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
7750: 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e  SESSION).  int n
7760: 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Session;        
7770: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7780: 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e  f active session
7790: 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69  s */.  OpenSessi
77a0: 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20  on aSession[4]; 
77b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73   /* Array of ses
77c0: 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69  sions.  [0] is i
77d0: 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64  n focus. */.#end
77e0: 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20  if.  ExpertInfo 
77f0: 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f  expert;        /
7800: 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69  * Valid if previ
7810: 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  ous command was 
7820: 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22  ".expert OPT..."
7830: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f   */.};.../* Allo
7840: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53  wed values for S
7850: 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51  hellState.autoEQ
7860: 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  P.*/.#define AUT
7870: 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20  OEQP_off      0 
7880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74            /* Aut
7890: 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
78a0: 55 45 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66  UERY PLAN is off
78b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f   */.#define AUTO
78c0: 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20  EQP_on       1  
78d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f           /* Auto
78e0: 6d 61 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20  matic EQP is on 
78f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7900: 51 50 5f 74 72 69 67 67 65 72 20 20 32 20 20 20  QP_trigger  2   
7910: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e          /* On an
7920: 64 20 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e  d also show plan
7930: 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a  s for triggers *
7940: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7950: 50 5f 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20  P_full     3    
7960: 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66         /* Show f
7970: 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  ull EXPLAIN */..
7980: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7990: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
79a0: 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65  .openMode.*/.#de
79b0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79c0: 55 4e 53 50 45 43 20 20 20 20 20 20 30 20 20 20  UNSPEC      0   
79d0: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
79e0: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
79f0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7a00: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31  EN_NORMAL      1
7a10: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
7a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7a30: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a40: 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20  PEN_APPENDVFS   
7a50: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7a60: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
7a70: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
7a80: 50 46 49 4c 45 20 20 20 20 20 33 20 20 20 20 20  PFILE     3     
7a90: 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66   /* Use the zipf
7aa0: 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
7ab0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7ac0: 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
7ad0: 20 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70      4      /* Op
7ae0: 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61  en a normal data
7af0: 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  base read-only *
7b00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7b10: 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
7b20: 20 35 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   5      /* Open 
7b30: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  using sqlite3_de
7b40: 73 65 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23  serialize() */.#
7b50: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7b60: 4e 5f 48 45 58 44 42 20 20 20 20 20 20 20 36 20  N_HEXDB       6 
7b70: 20 20 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74       /* Use "dbt
7b80: 6f 74 78 74 22 20 6f 75 74 70 75 74 20 61 73 20  otxt" output as 
7b90: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a  data source */..
7ba0: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7bb0: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7bc0: 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23  .eTraceType.*/.#
7bd0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7be0: 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20  CE_PLAIN      0 
7bf0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70       /* Show inp
7c00: 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23  ut SQL text */.#
7c10: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7c20: 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20  CE_EXPANDED   1 
7c30: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70       /* Show exp
7c40: 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a  anded SQL text *
7c50: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7c60: 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
7c70: 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20   2      /* Show 
7c80: 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74  normalized SQL t
7c90: 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20  ext */../* Bits 
7ca0: 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  in the ShellStat
7cb0: 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61  e.flgProgress va
7cc0: 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  riable */.#defin
7cd0: 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  e SHELL_PROGRESS
7ce0: 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20  _QUIET 0x01  /* 
7cf0: 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20  Omit announcing 
7d00: 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20 63  every progress c
7d10: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69  allback */.#defi
7d20: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7d30: 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a  S_RESET 0x02  /*
7d40: 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
7d50: 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65   when the progre
7d60: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
7d90: 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65   limit is reache
7da0: 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  d, and for each.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7de0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
7df0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50  .#define SHELL_P
7e00: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78  ROGRESS_ONCE  0x
7e10: 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68  04  /* Cancel th
7e20: 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20  e --limit after 
7e30: 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a  firing once */..
7e40: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7e50: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7e60: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7e70: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7e80: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7e90: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7ea0: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7eb0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7ec0: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7ed0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7ee0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ef0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7f00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7f10: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7f20: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7f30: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7f40: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7f50: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7f60: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7f70: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7f80: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7f90: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7fa0: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7fb0: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7fc0: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7fd0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7fe0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7ff0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
8000: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
8010: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
8020: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
8030: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
8040: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
8050: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
8060: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
8070: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
8080: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
8090: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
80a0: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
80b0: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
80c0: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
80d0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
80e0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
80f0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
8100: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
8110: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
8120: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
8130: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
8140: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
8150: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
8160: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
8170: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
8180: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
8190: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
81a0: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
81b0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
81c0: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
81d0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81e0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
81f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8200: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
8210: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
8220: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
8230: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
8240: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
8250: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
8260: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
8270: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
8280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8290: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
82a0: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
82b0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
82c0: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
82d0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
82e0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
82f0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
8300: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
8310: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
8320: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
8330: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
8340: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
8350: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
8360: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
8370: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
8380: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
8390: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
83a0: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
83b0: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
83c0: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
83d0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
83e0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
83f0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
8400: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
8410: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
8420: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8430: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8440: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8450: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8460: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8470: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8480: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8490: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
84a0: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
84b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
84c0: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
84d0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
84e0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
84f0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8500: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8510: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8520: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8530: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8540: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8550: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8560: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8570: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8580: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8590: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
85a0: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
85b0: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
85c0: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
85d0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
85e0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
85f0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
8600: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
8610: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
8620: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8630: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8640: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8650: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8660: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8670: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8680: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8690: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
86a0: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
86b0: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
86c0: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
86d0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
86e0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
86f0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
8700: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
8710: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
8720: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8730: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8740: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8750: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8760: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8780: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8790: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
87a0: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
87b0: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
87c0: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
87d0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
87e0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
87f0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
8800: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
8810: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
8820: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8830: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8840: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8850: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8860: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8870: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8880: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8890: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
88a0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
88b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88c0: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
88d0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
88e0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
88f0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
8900: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
8910: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
8920: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8930: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8940: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8950: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8960: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8970: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8980: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8990: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
89b0: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
89c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
89d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
89e0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
89f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
8a00: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
8a10: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
8a20: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8a30: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8a40: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8a50: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8a60: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8a70: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8a80: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8a90: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8aa0: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8ab0: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8ac0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8ad0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8ae0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8af0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8b00: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8b10: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
8b20: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8b30: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8b40: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8b50: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8b60: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8b70: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8b80: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8b90: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8ba0: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8bb0: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8bd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8be0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8bf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8c10: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
8c20: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8c30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8c40: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8c50: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8c60: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8c70: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8c80: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8c90: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8ca0: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8cc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8cd0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8ce0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8cf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8d00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
8d20: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8d30: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8d40: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d60: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d70: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8d80: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8da0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8db0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8dc0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8dd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8de0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8df0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8e00: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8e10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8e20: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8e30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e40: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8e50: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8e60: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8e70: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8e80: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8e90: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8ea0: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8eb0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8ec0: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8ed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8ee0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ef0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8f00: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8f10: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8f20: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8f30: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f50: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8f60: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8f70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8f80: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8fa0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8fb0: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8fc0: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8fd0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8fe0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8ff0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
9000: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
9010: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
9020: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
9030: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
9040: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
9050: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
9060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9080: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
9090: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
90a0: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
90b0: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
90c0: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
90d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
90e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
90f0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
9100: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
9110: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
9120: 30 5d 29 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29  0]), 1, (size_t)
9130: 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  sz, f);.  }else{
9140: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
9150: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
9160: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9170: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9180: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 77     /* Remember w
9190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
91a0: 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e 61 6c  e value original
91b0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c 72 5c  ly contained \r\
91c0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 20 26  n */.    if( z &
91d0: 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72 5c 6e  & strstr(z,"\r\n
91e0: 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e 4c 20  ")!=0 ) hasCRNL 
91f0: 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66 77 72  = 1;.    x = fwr
9200: 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ite(sqlite3_valu
9210: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
9220: 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a 2c 20   1, (size_t)sz, 
9230: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9240: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9250: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9260: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9270: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9280: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9290: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
92a0: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
92b0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
92c0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
92d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92e0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92f0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
9300: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
9310: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9320: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
9330: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9340: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9350: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9360: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9370: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9380: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9390: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
93a0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
93b0: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
93c0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
93d0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93e0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93f0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
9400: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
9410: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
9420: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9430: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9440: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9450: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9460: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9470: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9480: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9490: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
94a0: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
94b0: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
94c0: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
94d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94e0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
9500: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9510: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9520: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
9530: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9540: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9550: 70 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a  p, 1, (size_t)sz
9560: 2c 20 66 29 3b 0a 20 20 66 63 6c 6f 73 65 28 66  , f);.  fclose(f
9570: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
9580: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
9590: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
95a0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f  ror(context, "co
95b0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62 61 63  uld not read bac
95c0: 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c 65  k the whole file
95d0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
95e0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
95f0: 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20 29    }.  if( bBin )
9600: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9610: 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74  sult_blob64(cont
9620: 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71 6c 69  ext, p, sz, sqli
9630: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c  te3_free);.  }el
9640: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
9650: 69 6e 74 36 34 20 69 2c 20 6a 3b 0a 20 20 20 20  int64 i, j;.    
9660: 69 66 28 20 68 61 73 43 52 4e 4c 20 29 7b 0a 20  if( hasCRNL ){. 
9670: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f       /* If the o
9680: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  riginal contains
9690: 20 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20 6e 6f   \r\n then do no
96a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 61 63   conversions bac
96b0: 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20 20  k to \n */.     
96c0: 20 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d 65 6c   j = sz;.    }el
96d0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
96e0: 74 68 65 20 66 69 6c 65 20 64 69 64 20 6e 6f 74  the file did not
96f0: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74   originally cont
9700: 61 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20 63 6f  ain \r\n then co
9710: 6e 76 65 72 74 20 61 6e 79 20 6e 65 77 0a 20 20  nvert any new.  
9720: 20 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61 63 6b      ** \r\n back
9730: 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20   into \n */.    
9740: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73    for(i=j=0; i<s
9750: 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; i++){.       
9760: 20 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72 27 20   if( p[i]=='\r' 
9770: 26 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e 27 20  && p[i+1]=='\n' 
9780: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  ) i++;.        p
9790: 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a 20 20  [j++] = p[i];.  
97a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d      }.      sz =
97b0: 20 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a 5d 20   j;.      p[sz] 
97c0: 3d 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20  = 0;.    } .    
97d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
97e0: 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 28  ext64(context, (
97f0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20 73  const char*)p, s
9800: 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
9820: 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49 54  ite3_free, SQLIT
9830: 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20 70  E_UTF8);.  }.  p
9840: 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e 63   = 0;..edit_func
9850: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29 20  _end:.  if( f ) 
9860: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e 6c  fclose(f);.  unl
9870: 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ink(zTempFile);.
9880: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9890: 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  TempFile);.  sql
98a0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a  ite3_free(p);.}.
98b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98c0: 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20 2a  _NOHAVE_SYSTEM *
98d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f 72  /../*.** Save or
98e0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
98f0: 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
9900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9910: 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 53  outputModePush(S
9920: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9930: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d 20   p->modePrior = 
9940: 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63 70  p->mode;.  memcp
9950: 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  y(p->colSepPrior
9960: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9970: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
9980: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
9990: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 50  emcpy(p->rowSepP
99a0: 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 61  rior, p->rowSepa
99b0: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
99c0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
99d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  .}.static void o
99e0: 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68 65  utputModePop(She
99f0: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 70  llState *p){.  p
9a00: 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  ->mode = p->mode
9a10: 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79 28  Prior;.  memcpy(
9a20: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
9a30: 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72 2c   p->colSepPrior,
9a40: 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65   sizeof(p->colSe
9a50: 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65 6d  parator));.  mem
9a60: 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cpy(p->rowSepara
9a70: 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50 72  tor, p->rowSepPr
9a80: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 72  ior, sizeof(p->r
9a90: 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 7d  owSeparator));.}
9aa0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
9ab0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9ac0: 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64  as a hex-encoded
9ad0: 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33   blob (eg. X'123
9ae0: 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  4' ).*/.static v
9af0: 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62  oid output_hex_b
9b00: 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  lob(FILE *out, c
9b10: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
9b20: 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20  , int nBlob){.  
9b30: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
9b40: 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70  Blob = (char *)p
9b50: 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e  Blob;.  raw_prin
9b60: 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20  tf(out,"X'");.  
9b70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62  for(i=0; i<nBlob
9b80: 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e  ; i++){ raw_prin
9b90: 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42  tf(out,"%02x",zB
9ba0: 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a  lob[i]&0xff); }.
9bb0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
9bc0: 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ,"'");.}../*.** 
9bd0: 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68  Find a string th
9be0: 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20  at is not found 
9bf0: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e  anywhere in z[].
9c00: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
9c10: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74  er.** to that st
9c20: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20  ring..**.** Try 
9c30: 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42  to use zA and zB
9c40: 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68   first.  If both
9c50: 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c   of those are al
9c60: 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a  ready found in z
9c70: 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  [].** then make 
9c80: 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61  up some string a
9c90: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  nd store it in t
9ca0: 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  he buffer zBuf..
9cb0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9cc0: 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72  char *unused_str
9cd0: 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ing(.  const cha
9ce0: 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9d00: 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65  lt must not appe
9d10: 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a  ar anywhere in z
9d20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9d30: 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72   *zA, const char
9d40: 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74   *zB,   /* Try t
9d50: 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  hese first */.  
9d60: 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20  char *zBuf      
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74    /* Space to st
9d90: 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64 20  ore a generated 
9da0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  string */.){.  u
9db0: 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20  nsigned i = 0;. 
9dc0: 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a   if( strstr(z, z
9dd0: 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a  A)==0 ) return z
9de0: 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  A;.  if( strstr(
9df0: 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75  z, zB)==0 ) retu
9e00: 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20  rn zB;.  do{.   
9e10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9e20: 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75  f(20,zBuf,"(%s%u
9e30: 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20  )", zA, i++);.  
9e40: 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a  }while( strstr(z
9e50: 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72  ,zBuf)!=0 );.  r
9e60: 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f  eturn zBuf;.}../
9e70: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
9e80: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
9e90: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
9ea0: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
9eb0: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
9ec0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f  *.** See also: o
9ed0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
9ee0: 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f  aped_string().*/
9ef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
9f00: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
9f10: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
9f20: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
9f30: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
9f40: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
9f50: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
9f60: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
9f70: 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b  0 && c!='\''; i+
9f80: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
9f90: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9fa0: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
9fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9fc0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9fd0: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
9fe0: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
9ff0: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
a000: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
a010: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
a020: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
a030: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
a040: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
a050: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
a060: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
a070: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
a080: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a090: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
a0a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a0b0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
a0c0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a0d0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
a0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0f0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
a100: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
a110: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a120: 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65   }.  setTextMode
a130: 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  (out, 1);.}../*.
a140: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a150: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
a160: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
a170: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
a180: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20  conventions..** 
a190: 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20  Additionallly , 
a1a0: 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20  escape the "\n" 
a1b0: 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63 74  and "\r" charact
a1c0: 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ers so that they
a1d0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63   do not.** get c
a1e0: 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d  orrupted by end-
a1f0: 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74  of-line translat
a200: 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69  ion facilities i
a210: 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  n some operating
a220: 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  .** systems..**.
a230: 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  ** This is like 
a240: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
a250: 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68 20  ring() but with 
a260: 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
a270: 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61  the \r\n.** esca
a280: 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f  pe mechanism..*/
a290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a2a0: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
a2b0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
a2c0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a2d0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
a2e0: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
a2f0: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
a300: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
a310: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
a320: 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20  '\'' && c!='\n' 
a330: 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  && c!='\r'; i++)
a340: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
a350: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
a360: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
a370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
a380: 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30  st char *zNL = 0
a390: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
a3a0: 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69   *zCR = 0;.    i
a3b0: 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  nt nNL = 0;.    
a3c0: 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20  int nCR = 0;.   
a3d0: 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c   char zBuf1[20],
a3e0: 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
a3f0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
a400: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
a410: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b  [i]=='\n' ) nNL+
a420: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  +;.      if( z[i
a430: 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b  ]=='\r' ) nCR++;
a440: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
a450: 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  NL ){.      raw_
a460: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70  printf(out, "rep
a470: 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a  lace(");.      z
a480: 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69  NL = unused_stri
a490: 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c  ng(z, "\\n", "\\
a4a0: 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20  012", zBuf1);.  
a4b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20    }.    if( nCR 
a4c0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a4d0: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
a4e0: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20  e(");.      zCR 
a4f0: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
a500: 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35  z, "\\r", "\\015
a510: 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d  ", zBuf2);.    }
a520: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
a530: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
a540: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
a550: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
a560: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
a570: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26  \n' && c!='\r' &
a580: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
a590: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5a0: 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  \'' ) i++;.     
a5b0: 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20   if( i ){.      
a5c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
a5d0: 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29  t, "%.*s", i, z)
a5e0: 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69  ;.        z += i
a5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a600: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20  if( c=='\'' ){. 
a610: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
a620: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
a630: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a650: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
a660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a670: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
a680: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a   if( c=='\n' ){.
a690: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
a6a0: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e  tf(out, "%s", zN
a6b0: 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  L);.        cont
a6c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
a6d0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a6e0: 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a  ut, "%s", zCR);.
a6f0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a700: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a710: 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20      if( nCR ){. 
a720: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a730: 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72  out, ",'%s',char
a740: 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20  (13))", zCR);.  
a750: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
a760: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a770: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
a780: 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29  char(10))", zNL)
a790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65  ;.    }.  }.  se
a7a0: 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31  tTextMode(out, 1
a7b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
a7c0: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
a7d0: 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20  ing as a quoted 
a7e0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f  according to C o
a7f0: 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75  r TCL quoting ru
a800: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
a810: 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72  oid output_c_str
a820: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
a830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
a840: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b   unsigned int c;
a850: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
a860: 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20  t);.  while( (c 
a870: 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a  = *(z++))!=0 ){.
a880: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
a890: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  ){.      fputc(c
a8a0: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70  , out);.      fp
a8b0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a8c0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22   }else if( c=='"
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a8e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a8f0: 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75     fputc('"', ou
a900: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a910: 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20  ( c=='\t' ){.   
a920: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a930: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a940: 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('t', out);.    
a950: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e  }else if( c=='\n
a960: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a970: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a980: 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75     fputc('n', ou
a990: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9a0: 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  ( c=='\r' ){.   
a9b0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a9c0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a9d0: 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('r', out);.    
a9e0: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72 69  }else if( !ispri
a9f0: 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20  nt(c&0xff) ){.  
aa00: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
aa10: 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26  ut, "\\%03o", c&
aa20: 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0xff);.    }else
aa30: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  {.      fputc(c,
aa40: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   out);.    }.  }
aa50: 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75  .  fputc('"', ou
aa60: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  t);.}../*.** Out
aa70: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
aa80: 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61 63  ring with charac
aa90: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73 70  ters that are sp
aaa0: 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c  ecial to.** HTML
aab0: 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61   escaped..*/.sta
aac0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
aad0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45  html_string(FILE
aae0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
aaf0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
ab00: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
ab10: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
ab20: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
ab30: 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20     z[i].        
ab40: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27      && z[i]!='<'
ab50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
ab60: 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20  z[i]!='&'.      
ab70: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
ab80: 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  >'.            &
ab90: 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20  & z[i]!='\"'.   
aba0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
abb0: 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20  !='\'';.        
abc0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69  i++){}.    if( i
abd0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >0 ){.      utf8
abe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  _printf(out,"%.*
abf0: 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20  s",i,z);.    }. 
ac00: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27     if( z[i]=='<'
ac10: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
ac20: 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29  intf(out,"&lt;")
ac30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ac40: 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20  z[i]=='&' ){.   
ac50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ac60: 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20  t,"&amp;");.    
ac70: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
ac80: 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '>' ){.      raw
ac90: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74  _printf(out,"&gt
aca0: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
acb0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b  f( z[i]=='\"' ){
acc0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
acd0: 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b  f(out,"&quot;");
ace0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
acf0: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  [i]=='\'' ){.   
ad00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ad10: 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20  t,"&#39;");.    
ad20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
ad30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  ak;.    }.    z 
ad40: 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a  += i + 1;.  }.}.
ad50: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c  ./*.** If a fiel
ad60: 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63  d contains any c
ad70: 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69 66  haracter identif
ad80: 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74 68  ied by a 1 in th
ad90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61  e following.** a
ada0: 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73  rray, then the s
adb0: 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75  tring must be qu
adc0: 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f  oted for CSV..*/
add0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
ade0: 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  ar needCsvQuote[
adf0: 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c  ] = {.  1, 1, 1,
ae00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae10: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
ae20: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
ae30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
ae40: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
ae50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
ae60: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
ae70: 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20  , 0, 1,   0, 0, 
ae80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae90: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aeb0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aec0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
aed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aee0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
aef0: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af10: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
af30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af40: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
af50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af60: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
af70: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af90: 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  0, 1,.  1, 1, 1,
afa0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afb0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
afc0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
afd0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
afe0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
aff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b000: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b010: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b020: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b030: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b040: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b050: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b060: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b070: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b080: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b090: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0a0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0b0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b0c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b0d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b0e0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b0f0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b100: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b110: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b120: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b130: 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  1, 1,.};../*.** 
b140: 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20  Output a single 
b150: 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63  term of CSV.  Ac
b160: 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65  tually, p->colSe
b170: 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64 20  parator is used 
b180: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72  for.** the separ
b190: 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20  ator, which may 
b1a0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  or may not be a 
b1b0: 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56  comma.  p->nullV
b1c0: 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e  alue is.** the n
b1d0: 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69  ull value.  Stri
b1e0: 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20 69  ngs are quoted i
b1f0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
b200: 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69  e separator.** i
b210: 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66  s only issued if
b220: 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a   bSep is true..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
b240: 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74  tput_csv(ShellSt
b250: 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
b260: 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29  ar *z, int bSep)
b270: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  {.  FILE *out = 
b280: 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d  p->out;.  if( z=
b290: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
b2a0: 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70  rintf(out,"%s",p
b2b0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
b2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
b2d0: 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d  ;.    int nSep =
b2e0: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c   strlen30(p->col
b2f0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b300: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
b310: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
b320: 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e  eedCsvQuote[((un
b330: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b  signed char*)z)[
b340: 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  i]].         || 
b350: 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70  (z[i]==p->colSep
b360: 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20  arator[0] &&.   
b370: 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d            (nSep=
b380: 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20  =1 || memcmp(z, 
b390: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
b3a0: 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20   nSep)==0)) ){. 
b3b0: 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
b3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
b3e0: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
b3f0: 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d   char *zQuoted =
b400: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
b410: 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20  ("\"%w\"", z);. 
b420: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b430: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f  (out, "%s", zQuo
b440: 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
b450: 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64  te3_free(zQuoted
b460: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b470: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b480: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
b490: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62     }.  }.  if( b
b4a0: 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Sep ){.    utf8_
b4b0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b4c0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b4d0: 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ator);.  }.}../*
b4e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b4f0: 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75   runs when the u
b500: 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72 6c  ser presses Ctrl
b510: 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  -C.*/.static voi
b520: 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64  d interrupt_hand
b530: 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29  ler(int NotUsed)
b540: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
b550: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
b560: 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b   seenInterrupt++
b570: 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65  ;.  if( seenInte
b580: 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28 31  rrupt>2 ) exit(1
b590: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44  );.  if( globalD
b5a0: 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  b ) sqlite3_inte
b5b0: 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b  rrupt(globalDb);
b5c0: 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64  .}..#if (defined
b5d0: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
b5e0: 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20 21  ned(WIN32)) && !
b5f0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
b600: 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CE)./*.** This r
b610: 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20  outine runs for 
b620: 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28  console events (
b630: 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20  e.g. Ctrl-C) on 
b640: 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20  Win32.*/.static 
b650: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73  BOOL WINAPI Cons
b660: 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a  oleCtrlHandler(.
b670: 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79    DWORD dwCtrlTy
b680: 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  pe /* One of the
b690: 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f   CTRL_*_EVENT co
b6a0: 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  nstants */.){.  
b6b0: 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d  if( dwCtrlType==
b6c0: 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a  CTRL_C_EVENT ){.
b6d0: 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61      interrupt_ha
b6e0: 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65  ndler(0);.    re
b6f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20  turn TRUE;.  }. 
b700: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
b710: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
b720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b730: 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  HORIZATION./*.**
b740: 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68   When the ".auth
b750: 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65   ON" is set, the
b760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f   following autho
b770: 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  rizer callback i
b780: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49  s.** invoked.  I
b790: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
b7a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
b7b0: 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41  tatic int shellA
b7c0: 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  uth(.  void *pCl
b7d0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20  ientData,.  int 
b7e0: 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  op,.  const char
b7f0: 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA1,.  const c
b800: 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73  har *zA2,.  cons
b810: 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63  t char *zA3,.  c
b820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29  onst char *zA4.)
b830: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
b840: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
b850: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
b860: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b870: 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20  r *azAction[] = 
b880: 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54  { 0,.     "CREAT
b890: 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  E_INDEX",       
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22    "CREATE_TABLE"
b8b0: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b8c0: 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  E_TEMP_INDEX",. 
b8d0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8e0: 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45  _TABLE",    "CRE
b8f0: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
b900: 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50  ",  "CREATE_TEMP
b910: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52  _VIEW",.     "CR
b920: 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20  EATE_TRIGGER",  
b930: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49 45       "CREATE_VIE
b940: 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44 45  W",          "DE
b950: 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f  LETE",.     "DRO
b960: 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  P_INDEX",       
b970: 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22      "DROP_TABLE"
b980: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b990: 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20  P_TEMP_INDEX",. 
b9a0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b9b0: 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f  ABLE",      "DRO
b9c0: 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  P_TEMP_TRIGGER",
b9d0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56      "DROP_TEMP_V
b9e0: 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50  IEW",.     "DROP
b9f0: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20 20  _TRIGGER",      
ba00: 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20     "DROP_VIEW", 
ba10: 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
ba20: 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d  RT",.     "PRAGM
ba30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
ba40: 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20 20    "READ",       
ba50: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
ba60: 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41  T",.     "TRANSA
ba70: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
ba80: 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20 20   "UPDATE",      
ba90: 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43 48           "ATTACH
baa0: 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48 22  ",.     "DETACH"
bab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bac0: 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20  "ALTER_TABLE",  
bad0: 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45 58          "REINDEX
bae0: 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45  ",.     "ANALYZE
baf0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
bb00: 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c  "CREATE_VTABLE",
bb10: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54          "DROP_VT
bb20: 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e  ABLE",.     "FUN
bb30: 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20  CTION",         
bb40: 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c      "SAVEPOINT",
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 43              "REC
bb60: 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69  URSIVE".  };.  i
bb70: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
bb80: 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b  ar *az[4];.  az[
bb90: 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31  0] = zA1;.  az[1
bba0: 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d  ] = zA2;.  az[2]
bbb0: 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20   = zA3;.  az[3] 
bbc0: 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72  = zA4;.  utf8_pr
bbd0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75  intf(p->out, "au
bbe0: 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61  thorizer: %s", a
bbf0: 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20  zAction[op]);.  
bc00: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
bc10: 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  +){.    raw_prin
bc20: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b  tf(p->out, " ");
bc30: 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29  .    if( az[i] )
bc40: 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  {.      output_c
bc50: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
bc60: 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  az[i]);.    }els
bc70: 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
bc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c  ntf(p->out, "NUL
bc90: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
bca0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bcb0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74  ut, "\n");.  ret
bcc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bcd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
bce0: 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74  rint a schema st
bcf0: 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f  atement.  Part o
bd00: 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20  f MODE_Semi and 
bd10: 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70  MODE_Pretty outp
bd20: 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ut..**.** This r
bd30: 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20  outine converts 
bd40: 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c  some CREATE TABL
bd50: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  E statements for
bd60: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a   shadow tables.*
bd70: 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e  * in FTS3/4/5 in
bd80: 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  to CREATE TABLE 
bd90: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74  IF NOT EXISTS st
bda0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
bdb0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63  tic void printSc
bdc0: 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f  hemaLine(FILE *o
bdd0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
bde0: 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  z, const char *z
bdf0: 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 7a 3d 3d  Tail){.  if( z==
be00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
be10: 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65 74  ( zTail==0 ) ret
be20: 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
be30: 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41  e3_strglob("CREA
be40: 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22  TE TABLE ['\"]*"
be50: 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , z)==0 ){.    u
be60: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
be70: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
be80: 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25 73   NOT EXISTS %s%s
be90: 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b  ", z+13, zTail);
bea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
beb0: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
bec0: 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29  %s%s", z, zTail)
bed0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
bee0: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
bef0: 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ineN(FILE *out, 
bf00: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
bf10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
bf20: 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a  l){.  char c = z
bf30: 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  [n];.  z[n] = 0;
bf40: 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  .  printSchemaLi
bf50: 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c  ne(out, z, zTail
bf60: 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d  );.  z[n] = c;.}
bf70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bf80: 72 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a 5b  rue if string z[
bf90: 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62 75  ] has nothing bu
bfa0: 74 20 77 68 69 74 65 73 70 61 63 65 20 61 6e 64  t whitespace and
bfb0: 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65   comments to the
bfc0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
bfd0: 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74  irst line..*/.st
bfe0: 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c  atic int wsToEol
bff0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
c000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c010: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
c020: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
c030: 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  \n' ) return 1;.
c040: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
c050: 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  z[i]) ) continue
c060: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ;.    if( z[i]==
c070: 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  '-' && z[i+1]=='
c080: 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  -' ) return 1;. 
c090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c0a0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
c0b0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
c0c0: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45 58 50  entry to the EXP
c0d0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
c0e0: 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 76  data.*/.static v
c0f0: 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64 28 53  oid eqp_append(S
c100: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
c110: 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20 70 32  t iEqpId, int p2
c120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
c130: 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61 70 68  ext){.  EQPGraph
c140: 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  Row *pNew;.  int
c150: 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e 33   nText = strlen3
c160: 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20  0(zText);.  if( 
c170: 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 29  p->autoEQPtest )
c180: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
c190: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c 25 64  f(p->out, "%d,%d
c1a0: 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64 2c 20  ,%s\n", iEqpId, 
c1b0: 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  p2, zText);.  }.
c1c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
c1d0: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
c1e0: 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65 78 74  f(*pNew) + nText
c1f0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
c200: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
c210: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70 4e 65  _memory();.  pNe
c220: 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45 71 70  w->iEqpId = iEqp
c230: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50 61 72  Id;.  pNew->iPar
c240: 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20 6d 65  entId = p2;.  me
c250: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65 78 74  mcpy(pNew->zText
c260: 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2b 31  , zText, nText+1
c270: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  );.  pNew->pNext
c280: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 73   = 0;.  if( p->s
c290: 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b 0a 20  Graph.pLast ){. 
c2a0: 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c 61     p->sGraph.pLa
c2b0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  st->pNext = pNew
c2c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c2d0: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20  ->sGraph.pRow = 
c2e0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73  pNew;.  }.  p->s
c2f0: 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20 70 4e  Graph.pLast = pN
c300: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
c310: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
c320: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
c330: 41 4e 20 64 61 74 61 20 74 68 61 74 20 68 61 73  AN data that has
c340: 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65 64 0a   been collected.
c350: 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70 68 2e  ** in p->sGraph.
c360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c370: 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c 6c 53  eqp_reset(ShellS
c380: 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47  tate *p){.  EQPG
c390: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a  raphRow *pRow, *
c3a0: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 52 6f  pNext;.  for(pRo
c3b0: 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e 70 52  w = p->sGraph.pR
c3c0: 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d  ow; pRow; pRow =
c3d0: 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65   pNext){.    pNe
c3e0: 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  xt = pRow->pNext
c3f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c400: 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a 20 20  ee(pRow);.  }.  
c410: 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72 61 70  memset(&p->sGrap
c420: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  h, 0, sizeof(p->
c430: 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a 20  sGraph));.}../* 
c440: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  Return the next 
c450: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
c460: 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69 45 71  AN line with iEq
c470: 70 49 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  pId that occurs 
c480: 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20 6f  after.** pOld, o
c490: 72 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  r return the fir
c4a0: 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69 66 20  st such line if 
c4b0: 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f 0a  pOld is NULL.*/.
c4c0: 73 74 61 74 69 63 20 45 51 50 47 72 61 70 68 52  static EQPGraphR
c4d0: 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72 6f 77  ow *eqp_next_row
c4e0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
c4f0: 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51 50 47  int iEqpId, EQPG
c500: 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29 7b 0a  raphRow *pOld){.
c510: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c520: 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70 4f 6c  Row = pOld ? pOl
c530: 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e 73 47  d->pNext : p->sG
c540: 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77 68 69  raph.pRow;.  whi
c550: 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52 6f 77  le( pRow && pRow
c560: 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69 45 71  ->iParentId!=iEq
c570: 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70 52 6f  pId ) pRow = pRo
c580: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  w->pNext;.  retu
c590: 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20 52  rn pRow;.}../* R
c5a0: 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65 20 6c  ender a single l
c5b0: 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72 61 70  evel of the grap
c5c0: 68 20 74 68 61 74 20 68 61 73 20 69 45 71 70 49  h that has iEqpI
c5d0: 64 20 61 73 20 69 74 73 20 70 61 72 65 6e 74 2e  d as its parent.
c5e0: 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65 63 75    Called.** recu
c5f0: 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e 64 65  rsively to rende
c600: 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f 0a  r sublevels..*/.
c610: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c620: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53 68 65  render_level(She
c630: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
c640: 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50 47 72  iEqpId){.  EQPGr
c650: 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a 70  aphRow *pRow, *p
c660: 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Next;.  int n = 
c670: 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47 72 61  strlen30(p->sGra
c680: 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20 20 63  ph.zPrefix);.  c
c690: 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 70 52  har *z;.  for(pR
c6a0: 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f  ow = eqp_next_ro
c6b0: 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30 29 3b  w(p, iEqpId, 0);
c6c0: 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e   pRow; pRow = pN
c6d0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
c6e0: 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70  = eqp_next_row(p
c6f0: 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77 29 3b  , iEqpId, pRow);
c700: 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d 3e 7a  .    z = pRow->z
c710: 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38 5f 70  Text;.    utf8_p
c720: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c730: 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73 47 72  s%s%s\n", p->sGr
c740: 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70 4e 65  aph.zPrefix, pNe
c750: 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22 60 2d  xt ? "|--" : "`-
c760: 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20  -", z);.    if( 
c770: 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  n<(int)sizeof(p-
c780: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 29  >sGraph.zPrefix)
c790: 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -7 ){.      memc
c7a0: 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e 7a 50  py(&p->sGraph.zP
c7b0: 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78 74 20  refix[n], pNext 
c7c0: 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20 22 2c  ? "|  " : "   ",
c7d0: 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70 5f 72   4);.      eqp_r
c7e0: 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20 70  ender_level(p, p
c7f0: 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a 20 20  Row->iEqpId);.  
c800: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50      p->sGraph.zP
c810: 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20 20  refix[n] = 0;.  
c820: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c830: 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65 73   Display and res
c840: 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  et the EXPLAIN Q
c850: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
c860: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c870: 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53 74  p_render(ShellSt
c880: 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47 72  ate *p){.  EQPGr
c890: 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70  aphRow *pRow = p
c8a0: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20  ->sGraph.pRow;. 
c8b0: 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20 20   if( pRow ){.   
c8c0: 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78 74   if( pRow->zText
c8d0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
c8e0: 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65 78    if( pRow->pNex
c8f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
c900: 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  eqp_reset(p);.  
c910: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
c920: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38      }.      utf8
c930: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c940: 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a 54  "%s\n", pRow->zT
c950: 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70 2d  ext+3);.      p-
c960: 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20 70  >sGraph.pRow = p
c970: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
c980: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c990: 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Row);.    }else{
c9a0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
c9b0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45 52  tf(p->out, "QUER
c9c0: 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20 20  Y PLAN\n");.    
c9d0: 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e  }.    p->sGraph.
c9e0: 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b 0a  zPrefix[0] = 0;.
c9f0: 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c      eqp_render_l
ca00: 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20 20  evel(p, 0);.    
ca10: 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20 20  eqp_reset(p);.  
ca20: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
ca30: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
ca40: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
ca50: 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65   Progress handle
ca60: 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  r callback..*/.s
ca70: 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67 72 65  tatic int progre
ca80: 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69 64 20  ss_handler(void 
ca90: 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a  *pClientData) {.
caa0: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
cab0: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
cac0: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 70 2d  ClientData;.  p-
cad0: 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20 20  >nProgress++;.  
cae0: 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73  if( p->nProgress
caf0: 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73 20  >=p->mxProgress 
cb00: 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73  && p->mxProgress
cb10: 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  >0 ){.    raw_pr
cb20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 72  intf(p->out, "Pr
cb30: 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72 65 61  ogress limit rea
cb40: 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20 70 2d  ched (%u)\n", p-
cb50: 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20  >nProgress);.   
cb60: 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f 67 72   if( p->flgProgr
cb70: 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47  ess & SHELL_PROG
cb80: 52 45 53 53 5f 52 45 53 45 54 20 29 20 70 2d 3e  RESS_RESET ) p->
cb90: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
cba0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f     if( p->flgPro
cbb0: 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52  gress & SHELL_PR
cbc0: 4f 47 52 45 53 53 5f 4f 4e 43 45 20 29 20 70 2d  OGRESS_ONCE ) p-
cbd0: 3e 6d 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  >mxProgress = 0;
cbe0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
cbf0: 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 67   }.  if( (p->flg
cc00: 50 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c 4c  Progress & SHELL
cc10: 5f 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54 29  _PROGRESS_QUIET)
cc20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  ==0 ){.    raw_p
cc30: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
cc40: 72 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c 20 70  rogress %u\n", p
cc50: 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->nProgress);.  
cc60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
cc70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cc80: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
cc90: 41 4c 4c 42 41 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a  ALLBACK */../*.*
cca0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
ccb0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
ccc0: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
ccd0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
cce0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
ccf0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
cd00: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
cd10: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
cd20: 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Arg,.  int nArg,
cd30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cd40: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
cd50: 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mns */.  char **
cd60: 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78  azArg,    /* Tex
cd70: 74 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74  t of each result
cd80: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
cd90: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a  r **azCol,    /*
cda0: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   Column names */
cdb0: 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20  .  int *aiType  
cdc0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79      /* Column ty
cdd0: 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  pes */.){.  int 
cde0: 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  i;.  ShellState 
cdf0: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
ce00: 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61  *)pArg;..  if( a
ce10: 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
ce20: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d   0;.  switch( p-
ce30: 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  >cMode ){.    ca
ce40: 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a  se MODE_Line: {.
ce50: 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b        int w = 5;
ce60: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
ce70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ce80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
ce90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
cea0: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
ceb0: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
cec0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
ced0: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
cee0: 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20  w ) w = len;.   
cef0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
cf00: 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38  ->cnt++>0 ) utf8
cf10: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
cf20: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
cf30: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f  rator);.      fo
cf40: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
cf50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
cf60: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cf70: 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c  "%*s = %s%s", w,
cf80: 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20   azCol[i],.     
cf90: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
cfa0: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
cfb0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70   p->nullValue, p
cfc0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
cfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cfe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cff0: 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69  case MODE_Explai
d000: 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  n:.    case MODE
d010: 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20  _Column: {.     
d020: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
d030: 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  t aExplainWidths
d040: 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20  [] = {4, 13, 4, 
d050: 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d  4, 4, 13, 2, 13}
d060: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
d070: 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  t *colWidth;.   
d080: 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a     int showHdr;.
d090: 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53        char *rowS
d0a0: 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ep;.      if( p-
d0b0: 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c  >cMode==MODE_Col
d0c0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  umn ){.        c
d0d0: 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c  olWidth = p->col
d0e0: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73  Width;.        s
d0f0: 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77  howHdr = p->show
d100: 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  Header;.        
d110: 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  rowSep = p->rowS
d120: 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20  eparator;.      
d130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
d140: 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61  olWidth = aExpla
d150: 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20  inWidths;.      
d160: 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20    showHdr = 1;. 
d170: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
d180: 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d  SEP_Row;.      }
d190: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
d1a0: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
d1b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d1c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d1d0: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
d1e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
d1f0: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
d200: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
d210: 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b     w = colWidth[
d220: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  i];.          }e
d230: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d240: 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   w = 0;.        
d250: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
d260: 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( w==0 ){.      
d270: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
d280: 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  Char(azCol[i] ? 
d290: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d2b0: 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20  w<10 ) w = 10;. 
d2c0: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73             n = s
d2d0: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20  trlenChar(azArg 
d2e0: 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  && azArg[i] ? az
d2f0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
d300: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
d310: 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20      if( w<n ) w 
d320: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = n;.          }
d330: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
d340: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
d350: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
d360: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74            p->act
d370: 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b  ualWidth[i] = w;
d380: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d390: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48         if( showH
d3a0: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
d3b0: 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69    utf8_width_pri
d3c0: 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a  nt(p->out, w, az
d3d0: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
d3e0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d3f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
d400: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
d410: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
d420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d430: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f  .        if( sho
d440: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
d450: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d460: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d470: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
d480: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d490: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
d4a0: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d4b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
d4c0: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4e0: 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77  if( w<0 ) w = -w
d4f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
d500: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
d510: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
d520: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d530: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d540: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
d550: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
d560: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20  -------".       
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20  -------",.      
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
d610: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
d620: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
d630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d650: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d660: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
d670: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d680: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a  .        int w;.
d690: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d6a0: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
d6b0: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
d6c0: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
d6d0: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
d6e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d6f0: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
d700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d710: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
d720: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61  ODE_Explain && a
d730: 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65  zArg[i] && strle
d740: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e  nChar(azArg[i])>
d750: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  w ){.          w
d760: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
d770: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
d790: 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65  ==1 && p->aiInde
d7a0: 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  nt && p->pStmt )
d7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d7c0: 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49  p->iIndent<p->nI
d7d0: 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ndent ){.       
d7e0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d7f0: 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c  (p->out, "%*.s",
d800: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e   p->aiIndent[p->
d810: 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20  iIndent], "");. 
d820: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d830: 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b       p->iIndent+
d840: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
d850: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
d860: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
d870: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
d880: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
d890: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74  lue);.        ut
d8a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d8b0: 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d  , "%s", i==nArg-
d8c0: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
d8d0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
d8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d8f0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d     case MODE_Sem
d900: 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d  i: {   /* .schem
d910: 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d  a and .fullschem
d920: 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  a output */.    
d930: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
d940: 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  e(p->out, azArg[
d950: 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  0], ";\n");.    
d960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d970: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65     case MODE_Pre
d980: 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65  tty: {  /* .sche
d990: 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65  ma and .fullsche
d9a0: 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74  ma with --indent
d9b0: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
d9c0: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  z;.      int j;.
d9d0: 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e        int nParen
d9e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
d9f0: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
da00: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69   char c;.      i
da10: 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20  nt nLine = 0;.  
da20: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
da30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
da40: 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62   azArg[0]==0 ) b
da50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
da60: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
da70: 22 43 52 45 41 54 45 20 56 49 45 57 25 22 2c 20  "CREATE VIEW%", 
da80: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
da90: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
daa0: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
dab0: 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b  E TRIG%", azArg[
dac0: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
dad0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
dae0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
daf0: 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  %s;\n", azArg[0]
db00: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
db10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
db20: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
db30: 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
db40: 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  0]);.      j = 0
db50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
db60: 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20   IsSpace(z[i]); 
db70: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72  i++){}.      for
db80: 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  (; (c = z[i])!=0
db90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
dba0: 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
dbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
dbc0: 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a  z[j-1]=='\r' ) z
dbd0: 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20  [j-1] = '\n';.  
dbe0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
dbf0: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a  ace(z[j-1]) || z
dc00: 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e  [j-1]=='(' ) con
dc10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
dc20: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27  else if( (c=='('
dc30: 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a   || c==')') && j
dc40: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
dc50: 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  j-1]) ){.       
dc60: 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
dc70: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
dc80: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
dc90: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
dca0: 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  & IsSpace(z[j-1]
dcb0: 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ) ){ j--; }.    
dcc0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
dcd0: 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a    if( strlen30(z
dce0: 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20  )>=79 ){.       
dcf0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
dd00: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
dd10: 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67 65    /* Copy change
dd20: 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b  s from z[i] back
dd30: 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20   to z[j] */.    
dd40: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e        if( c==cEn
dd50: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
dd60: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
dd70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
dd80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27  =='"' || c=='\''
dd90: 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20   || c=='`' ){.  
dda0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
ddb0: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   c;.          }e
ddc0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
ddd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
dde0: 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20  nd = ']';.      
ddf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
de00: 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d  ='-' && z[i+1]==
de10: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
de20: 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a     cEnd = '\n';.
de30: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
de40: 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20  if( c=='(' ){.  
de50: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
de60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
de70: 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20 29  lse if( c==')' )
de80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
de90: 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20  aren--;.        
dea0: 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20      if( nLine>0 
deb0: 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20  && nParen==0 && 
dec0: 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j>0 ){.         
ded0: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
dee0: 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c  LineN(p->out, z,
def0: 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20   j, "\n");.     
df00: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a           j = 0;.
df10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
df20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
df40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50            if( nP
df50: 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64 3d  aren==1 && cEnd=
df60: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
df70: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
df80: 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20 26  \n' || (c==',' &
df90: 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31  & !wsToEol(z+i+1
dfa0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ))).          ){
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
dfc0: 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a   c=='\n' ) j--;.
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
dfe0: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
dff0: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20  out, z, j, "\n  
e000: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
e010: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
e020: 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
e030: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
e040: 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20 29  sSpace(z[i+1]) )
e050: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { i++; }.       
e060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
e070: 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b         z[j] = 0;
e080: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e090: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70  rintSchemaLine(p
e0a0: 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29  ->out, z, ";\n")
e0b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e0c0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 62  free(z);.      b
e0d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e0e0: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20  case MODE_List: 
e0f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
e100: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e110: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e120: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e130: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e140: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e150: 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61  (p->out,"%s%s",a
e160: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
e170: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41             i==nA
e180: 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70  rg-1 ? p->rowSep
e190: 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53  arator : p->colS
e1a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e1b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e1c0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e1d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
e1e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e1f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
e200: 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
e210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  ;.        if( z=
e220: 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c  =0 ) z = p->null
e230: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 75  Value;.        u
e240: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e250: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
e260: 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d       if( i<nArg-
e270: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  1 ){.          u
e280: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e290: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e2a0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e2b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e2d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e2e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e2f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e300: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e310: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e320: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
e330: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e340: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e350: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  r ){.        raw
e360: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e370: 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TR>");.        
e380: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e390: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
e3a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e3b0: 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20  ut,"<TH>");.    
e3c0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d        output_htm
e3d0: 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  l_string(p->out,
e3e0: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
e3f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e400: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e  (p->out,"</TH>\n
e410: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
e420: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e430: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
e440: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
e450: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
e460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 61   break;.      ra
e470: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e480: 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 66  "<TR>");.      f
e490: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e4a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61  i++){.        ra
e4b0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e4c0: 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TD>");.       
e4d0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
e4e0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e4f0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
e500: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
e510: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
e520: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44  ntf(p->out,"</TD
e530: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
e540: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e550: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
e560: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e570: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e580: 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20  ODE_Tcl: {.     
e590: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e5a0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e5b0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
e5c0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e5d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
e5e0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
e5f0: 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  >out,azCol[i] ? 
e600: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
e610: 20 20 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e            if(i<n
e620: 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e  Arg-1) utf8_prin
e630: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e640: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e650: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e660: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e670: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e680: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e6a0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
e6b0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
e6c0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
e6d0: 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  {.        output
e6e0: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
e6f0: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
e700: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
e710: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
e720: 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38  f(i<nArg-1) utf8
e730: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e740: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
e750: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e760: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e770: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e780: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e790: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e7a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e7b0: 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20  DE_Csv: {.      
e7c0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
e7d0: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
e7e0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e7f0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e800: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e810: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
e830: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c  put_csv(p, azCol
e840: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
e850: 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a   "", i<nArg-1);.
e860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e870: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e880: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e890: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e8b0: 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nArg>0 ){.      
e8c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e8d0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e8e0: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
e8f0: 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72   azArg[i], i<nAr
e900: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
e910: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
e920: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e930: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e940: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
e950: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
e960: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
e970: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e980: 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72   case MODE_Inser
e990: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61  t: {.      if( a
e9a0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e9b0: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
e9c0: 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52  tf(p->out,"INSER
e9d0: 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a 44  T INTO %s",p->zD
e9e0: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
e9f0: 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64   if( p->showHead
ea00: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  er ){.        ra
ea10: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ea20: 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  "(");.        fo
ea30: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ea40: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
ea50: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
ea60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
ea70: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ea80: 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
ea90: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
eaa0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
eab0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
eac0: 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29  %w\"", azCol[i])
ead0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
eae0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eaf0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
eb00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eb10: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  free(z);.       
eb20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb30: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eb40: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
eb50: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
eb60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
eb70: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
eb80: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a  tf(p->out,")");.
eb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
eba0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
ebb0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ebc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ++){.        raw
ebd0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
ebe0: 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56 41  i>0 ? "," : " VA
ebf0: 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 20  LUES(");.       
ec00: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
ec10: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
ec20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ec30: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
ec40: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ec50: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
ec60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
ec70: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
ec80: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ec90: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
eca0: 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c    if( ShellHasFl
ecb0: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
ecc0: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
ecd0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
ece0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
ecf0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
ed00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ed10: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
ed20: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
ed30: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
ed40: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
ed50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
ed60: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
ed70: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
ed80: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
ed90: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
eda0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
edb0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
edc0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
edd0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
ede0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  i]==SQLITE_FLOAT
edf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
ee00: 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20  ar z[50];.      
ee10: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
ee20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
ee30: 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69  uble(p->pStmt, i
ee40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ee50: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72 3b 0a  ite3_uint64 ur;.
ee60: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
ee70: 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66 28 72  (&ur,&r,sizeof(r
ee80: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
ee90: 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30 30 30  ( ur==0x7ff00000
eea0: 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20 20  00000000LL ){.  
eeb0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
eec0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 31 65  intf(p->out, "1e
eed0: 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20 20  999");.         
eee0: 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d 3d 30   }else if( ur==0
eef0: 78 66 66 66 30 30 30 30 30 30 30 30 30 30 30 30  xfff000000000000
ef00: 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0LL ){.         
ef10: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
ef20: 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22 29 3b  >out, "-1e999");
ef30: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ef40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ef50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
ef60: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
ef70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
ef80: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ef90: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
efa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
efb0: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
efc0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
efd0: 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e  LITE_BLOB && p->
efe0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
eff0: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70     const void *p
f000: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
f010: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53  olumn_blob(p->pS
f020: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
f030: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
f040: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
f050: 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  tes(p->pStmt, i)
f060: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
f070: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f  ut_hex_blob(p->o
f080: 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ut, pBlob, nBlob
f090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f0a0: 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a   if( isNumber(az
f0b0: 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20  Arg[i], 0) ){.  
f0c0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
f0d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
f0e0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
f0f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 68      }else if( Sh
f100: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
f110: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
f120: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f130: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f140: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
f150: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f160: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
f170: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
f180: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
f190: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
f1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f1b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f1c0: 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20  ->out,");\n");. 
f1d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f1e0: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
f1f0: 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20 69  Quote: {.      i
f200: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
f210: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
f220: 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73  ->cnt==0 && p->s
f230: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
f240: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f250: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f260: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
f270: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
f280: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
f290: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f2a0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f2b0: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
f2c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
f2d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f2e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
f2f0: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
f300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f310: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f320: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
f330: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f340: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ",");.        if
f350: 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20  ( (azArg[i]==0) 
f360: 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69  || (aiType && ai
f370: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
f380: 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
f390: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f3a0: 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  ->out,"NULL");. 
f3b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f3c0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f3d0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58  e[i]==SQLITE_TEX
f3e0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
f3f0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f400: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f410: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f420: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f430: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f440: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
f450: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f460: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f470: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f480: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f490: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
f4a0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
f4b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
f4c0: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
f4d0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
f4e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
f4f0: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
f500: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
f510: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
f520: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
f530: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
f540: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f550: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
f560: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f570: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f580: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
f590: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
f5a0: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
f5b0: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
f5c0: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
f5d0: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f5e0: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
f5f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f600: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
f610: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
f620: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
f630: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
f640: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
f650: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
f660: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
f670: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f680: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f690: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f6a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f6b0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f6c0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f6d0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6f0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
f700: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
f710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f720: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f730: 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20 20  _Ascii: {.      
f740: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
f750: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
f760: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
f770: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f790: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
f7a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
f7b0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
f7c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  );.          utf
f7d0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f7e0: 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  "%s",azCol[i] ? 
f7f0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
f800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f810: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f820: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
f830: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
f840: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f850: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
f860: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f870: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
f880: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f890: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f8a0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
f8b0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
f8c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f8d0: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41  (p->out,"%s",azA
f8e0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
f8f0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
f900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f910: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f920: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
f930: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
f940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f950: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 51 50     case MODE_EQP
f960: 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f 61 70  : {.      eqp_ap
f970: 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61 7a 41  pend(p, atoi(azA
f980: 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61 7a 41  rg[0]), atoi(azA
f990: 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b 33 5d  rg[1]), azArg[3]
f9a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f9b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f9c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
f9d0: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
f9e0: 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61 74  ack routine that
f9f0: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
fa00: 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 66  ary.** invokes f
fa10: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 61  or each row of a
fa20: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 2a   query result..*
fa30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6c  /.static int cal
fa40: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
fa50: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
fa60: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
fa70: 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73 69  *azCol){.  /* si
fa80: 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61 76  nce we don't hav
fa90: 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61 6c  e type info, cal
faa0: 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c 6c  l the shell_call
fab0: 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c 4c  back with a NULL
fac0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74 75   value */.  retu
fad0: 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  rn shell_callbac
fae0: 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61 7a  k(pArg, nArg, az
faf0: 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c 4c  Arg, azCol, NULL
fb00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
fb10: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
fb20: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73 71   routine from sq
fb30: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68 61  lite3_exec() tha
fb40: 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a 2a  t appends all.**
fb50: 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68 65   output onto the
fb60: 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c 54   end of a ShellT
fb70: 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ext object..*/.s
fb80: 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75 72  tatic int captur
fb90: 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 28  eOutputCallback(
fba0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
fbb0: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
fbc0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b 0a  rg, char **az){.
fbd0: 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20 3d    ShellText *p =
fbe0: 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41 72   (ShellText*)pAr
fbf0: 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e  g;.  int i;.  UN
fc00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
fc10: 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67 3d  z);.  if( azArg=
fc20: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fc30: 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70 65   if( p->n ) appe
fc40: 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20 30  ndText(p, "|", 0
fc50: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
fc60: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
fc70: 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54 65  if( i ) appendTe
fc80: 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  xt(p, ",", 0);. 
fc90: 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 20     if( azArg[i] 
fca0: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
fcb0: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20 20  azArg[i], 0);.  
fcc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fcd0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
fce0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 53  an appropriate S
fcf0: 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69 6e  ELFTEST table in
fd00: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
fd10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
fd20: 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65 73  id createSelftes
fd30: 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61 74  tTable(ShellStat
fd40: 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  e *p){.  char *z
fd50: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71  ErrMsg = 0;.  sq
fd60: 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
fd70: 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54  ,.    "SAVEPOINT
fd80: 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b 5c   selftest_init;\
fd90: 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  n".    "CREATE T
fda0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
fdb0: 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22 0a  TS selftest(\n".
fdc0: 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45 47      "  tno INTEG
fdd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c  ER PRIMARY KEY,\
fde0: 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75 6d  n"   /* Test num
fdf0: 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f 70  ber */.    "  op
fe00: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fe20: 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20 72  perator:  memo r
fe30: 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d 64  un */.    "  cmd
fe40: 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20 20   TEXT,\n"       
fe50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fe60: 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20 20  mmand text */.  
fe70: 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e 22    "  ans TEXT\n"
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61 6e     /* Desired an
fea0: 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b 22  swer */.    ");"
feb0: 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d  .    "CREATE TEM
fec0: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
fed0: 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e 73  self](op,cmd,ans
fee0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
fef0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
ff00: 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63 6d  elf](rowid,op,cm
ff10: 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c  d)\n".    "  VAL
ff20: 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53 45  UES(coalesce((SE
ff30: 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b 31  LECT (max(tno)+1
ff40: 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c 66  00)/10 FROM self
ff50: 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20 20  test),10),\n".  
ff60: 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65 6d    "         'mem
ff70: 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72 61  o','Tests genera
ff80: 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29 3b  ted by --init');
ff90: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
ffa0: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
ffb0: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
ffc0: 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20 20  ECT 'run',\n".  
ffd0: 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20 68    "    'SELECT h
ffe0: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 27  ex(sha3_query(''
fff0: 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
10000 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
10040 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
10050 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20  ',224))',\n".   
10060 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71   "    hex(sha3_q
10070 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79 70  uery('SELECT typ
10080 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
10090 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73  "FROM sqlite_mas
100c0 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27 2c  ter ORDER BY 2',
100d0 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22 49  224));\n".    "I
100e0 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
100f0 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
10100 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
10110 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45  ".    "    'SELE
10120 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72  CT hex(sha3_quer
10130 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52 4f  y(''SELECT * FRO
10140 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22 20  M \"' ||".    " 
10150 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27 25         printf('%
10160 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22 20  w',name) || '\" 
10170 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32 32  NOT INDEXED'',22
10180 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20  4))',\n".    "  
10190 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79    hex(sha3_query
101a0 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54 20  (printf('SELECT 
101b0 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e 4f  * FROM \"%w\" NO
101c0 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65 29  T INDEXED',name)
101d0 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22 20  ,224))\n".    " 
101e0 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22   FROM (\n".    "
101f0 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
10200 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
10210 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  er\n".    "     
10220 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
10230 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  e'\n".    "     
10240 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65 6c    AND name<>'sel
10250 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22 20  ftest'\n".    " 
10260 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73        AND coales
10270 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 30  ce(rootpage,0)>0
10280 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a  \n".    "  )\n".
10290 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
102a0 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ame;\n".    "INS
102b0 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
102c0 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20  $self]\n".    " 
102d0 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27 50   VALUES('run','P
102e0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
102f0 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e 22  check','ok');\n"
10300 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
10310 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c 6f  O selftest(tno,o
10320 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20 20  p,cmd,ans)".    
10330 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2a  "  SELECT rowid*
10340 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52  10,op,cmd,ans FR
10350 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  OM [_shell$self]
10360 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20 54  ;\n".    "DROP T
10370 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  ABLE [_shell$sel
10380 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26 7a  f];".    ,0,0,&z
10390 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
103a0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 74  ErrMsg ){.    ut
103b0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
103c0 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69 74  , "SELFTEST init
103d0 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 75  ialization failu
103e0 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  re: %s\n", zErrM
103f0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
10400 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
10410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78    }.  sqlite3_ex
10420 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41  ec(p->db, "RELEA
10430 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  SE selftest_init
10440 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f 2a  ",0,0,0);.}.../*
10450 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
10460 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66 69  ination table fi
10470 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c 6c  eld of the Shell
10480 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  State structure 
10490 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
104a0 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76 65  f the table give
104b0 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20 71  n.  Escape any q
104c0 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 20  uote characters 
104d0 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  in the.** table 
104e0 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  name..*/.static 
104f0 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f 6e  void set_table_n
10500 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ame(ShellState *
10510 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
10520 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Name){.  int i, 
10530 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65  n;.  char cQuote
10540 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20  ;.  char *z;..  
10550 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  if( p->zDestTabl
10560 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70 2d  e ){.    free(p-
10570 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zDestTable);.  
10580 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
10590 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
105a0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
105b0 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f  ;.  cQuote = quo
105c0 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20  teChar(zName);. 
105d0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4e   n = strlen30(zN
105e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75 6f  ame);.  if( cQuo
105f0 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a 20  te ) n += n+2;. 
10600 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62   z = p->zDestTab
10610 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b 31  le = malloc( n+1
10620 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   );.  if( z==0 )
10630 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
10640 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20 30 3b  mory();.  n = 0;
10650 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
10660 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
10670 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d  .  for(i=0; zNam
10680 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e[i]; i++){.    
10690 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69  z[n++] = zName[i
106a0 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  ];.    if( zName
106b0 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b  [i]==cQuote ) z[
106c0 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
106d0 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20   }.  if( cQuote 
106e0 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
106f0 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d  e;.  z[n] = 0;.}
10700 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
10710 20 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65   a query stateme
10720 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e  nt that will gen
10730 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74  erate SQL output
10740 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20  .  Print.** the 
10750 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20  result columns, 
10760 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c  comma-separated,
10770 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74   on a line and t
10780 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d  hen add a.** sem
10790 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
107a0 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
107b0 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  that line..**.**
107c0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
107d0 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61  f columns is 1 a
107e0 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63  nd that column c
107f0 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d  ontains text "--
10800 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ".** then write 
10810 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e  the semicolon on
10820 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65   a separate line
10830 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20  .  That way, if 
10840 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e  a.** "--" commen
10850 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
10860 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74 65  end of the state
10870 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e  ment, the commen
10880 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75  t.** won't consu
10890 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e  me the semicolon
108a0 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a   terminator..*/.
108b0 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74  static int run_t
108c0 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28  able_dump_query(
108d0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
108e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ,           /* Q
108f0 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  uery context */.
10900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
10910 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45  elect,     /* SE
10920 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10930 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e  o extract conten
10940 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
10950 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20  r *zFirstRow    
10960 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20  /* Print before 
10970 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f  first row, if no
10980 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73  t NULL */.){.  s
10990 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65  qlite3_stmt *pSe
109a0 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lect;.  int rc;.
109b0 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20    int nResult;. 
109c0 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
109d0 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20  char *z;.  rc = 
109e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
109f0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63  v2(p->db, zSelec
10a00 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c  t, -1, &pSelect,
10a10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
10a20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65  QLITE_OK || !pSe
10a30 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38  lect ){.    utf8
10a40 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10a50 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
10a60 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
10a70 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
10a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
10a90 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
10aa0 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
10ab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
10ac0 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20   p->nErr++;.    
10ad0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
10af0 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e  ep(pSelect);.  n
10b00 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33  Result = sqlite3
10b10 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
10b20 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28  elect);.  while(
10b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
10b40 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73  ){.    if( zFirs
10b50 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74  tRow ){.      ut
10b60 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10b70 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f  , "%s", zFirstRo
10b80 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74  w);.      zFirst
10b90 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Row = 0;.    }. 
10ba0 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68     z = (const ch
10bb0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
10bc0 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
10bd0 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72   0);.    utf8_pr
10be0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
10bf0 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  ", z);.    for(i
10c00 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69  =1; i<nResult; i
10c10 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ++){.      utf8_
10c20 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10c30 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ,%s", sqlite3_co
10c40 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
10c50 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20  t, i));.    }.  
10c60 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
10c70 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20   "";.    while( 
10c80 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27  z[0] && (z[0]!='
10c90 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29  -' || z[1]!='-')
10ca0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
10cb0 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61  z[0] ){.      ra
10cc0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
10cd0 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d   "\n;\n");.    }
10ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
10cf0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10d00 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ;\n");.    }.   
10d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
10d20 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  ep(pSelect);.  }
10d30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10d40 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74  finalize(pSelect
10d50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74  ITE_OK ){.    ut
10d70 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10d80 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
10d90 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
10da0 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
10db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10dc0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
10dd0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
10de0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
10df0 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
10e00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10e10 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
10e20 20 73 70 61 63 65 20 61 6e 64 20 73 61 76 65 20   space and save 
10e30 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f  off current erro
10e40 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  r string..*/.sta
10e50 74 69 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65  tic char *save_e
10e60 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65  rr_msg(.  sqlite
10e70 33 20 2a 64 62 20 20 20 20 20 20 20 20 20 20 20  3 *db           
10e80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
10e90 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  query */.){.  in
10ea0 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74  t nErrMsg = 1+st
10eb0 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65  rlen30(sqlite3_e
10ec0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68  rrmsg(db));.  ch
10ed0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71  ar *zErrMsg = sq
10ee0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
10ef0 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
10f00 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65  ErrMsg ){.    me
10f10 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71  mcpy(zErrMsg, sq
10f20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
10f30 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  , nErrMsg);.  }.
10f40 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67    return zErrMsg
10f50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69  ;.}..#ifdef __li
10f60 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65  nux__./*.** Atte
10f70 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49  mpt to display I
10f80 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75  /O stats on Linu
10f90 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49  x using /proc/PI
10fa0 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D/io.*/.static v
10fb0 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78  oid displayLinux
10fc0 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75  IoStats(FILE *ou
10fd0 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  t){.  FILE *in;.
10fe0 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20    char z[200];. 
10ff0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11000 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
11010 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67  "/proc/%d/io", g
11020 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d  etpid());.  in =
11030 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b   fopen(z, "rb");
11040 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
11050 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
11060 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28  fgets(z, sizeof(
11070 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20  z), in)!=0 ){.  
11080 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
11090 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f  truct {.      co
110a0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65  nst char *zPatte
110b0 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rn;.      const 
110c0 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20  char *zDesc;.   
110d0 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a   } aTrans[] = {.
110e0 20 20 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20        { "rchar: 
110f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11100 20 20 20 20 22 42 79 74 65 73 20 72 65 63 65 69      "Bytes recei
11110 76 65 64 20 62 79 20 72 65 61 64 28 29 3a 22 20  ved by read():" 
11120 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61  },.      { "wcha
11130 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  r: ",           
11140 20 20 20 20 20 20 20 22 42 79 74 65 73 20 73 65         "Bytes se
11150 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20  nt to write():" 
11160 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73     },.      { "s
11170 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20  yscr: ",        
11180 20 20 20 20 20 20 20 20 20 20 22 52 65 61 64 28            "Read(
11190 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22  ) system calls:"
111a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
111b0 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20   "syscw: ",     
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 72               "Wr
111d0 69 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ite() system cal
111e0 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20  ls:"     },.    
111f0 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a    { "read_bytes:
11200 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11210 22 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d  "Bytes read from
11220 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20   storage:"  },. 
11230 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79       { "write_by
11240 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20  tes: ",         
11250 20 20 20 22 42 79 74 65 73 20 77 72 69 74 74 65     "Bytes writte
11260 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d  n to storage:" }
11270 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65  ,.      { "cance
11280 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73  lled_write_bytes
11290 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64  : ",  "Cancelled
112a0 20 77 72 69 74 65 20 62 79 74 65 73 3a 22 20 20   write bytes:"  
112b0 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
112c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
112d0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
112e0 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20  aTrans); i++){. 
112f0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
11300 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e  len30(aTrans[i].
11310 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20  zPattern);.     
11320 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72   if( strncmp(aTr
11330 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c  ans[i].zPattern,
11340 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20   z, n)==0 ){.   
11350 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11360 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22  (out, "%-36s %s"
11370 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73  , aTrans[i].zDes
11380 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20  c, &z[n]);.     
11390 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
113a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63  }.    }.  }.  fc
113b0 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64  lose(in);.}.#end
113c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61  if../*.** Displa
113d0 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  y a single line 
113e0 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e 67 20  of status using 
113f0 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a  64-bit values..*
11400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
11410 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20  splayStatLine(. 
11420 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
11430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11440 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20  e shell context 
11450 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65  */.  char *zLabe
11460 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11470 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73  * Label for this
11480 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63   one line */.  c
11490 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20  har *zFormat,   
114a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d           /* Form
114b0 61 74 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  at for the resul
114c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74  t */.  int iStat
114d0 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20  usCtrl,         
114e0 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75 73   /* Which status
114f0 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20   to display */. 
11500 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20   int bReset     
11510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
11520 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ue to reset the 
11530 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  stats */.){.  sq
11540 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72  lite3_int64 iCur
11550 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33   = -1;.  sqlite3
11560 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20  _int64 iHiwtr = 
11570 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65  -1;.  int i, nPe
11580 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c  rcent;.  char zL
11590 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69  ine[200];.  sqli
115a0 74 65 33 5f 73 74 61 74 75 73 36 34 28 69 53 74  te3_status64(iSt
115b0 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c  atusCtrl, &iCur,
115c0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
115d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50  );.  for(i=0, nP
115e0 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61  ercent=0; zForma
115f0 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  t[i]; i++){.    
11600 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d  if( zFormat[i]==
11610 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b  '%' ) nPercent++
11620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72  ;.  }.  if( nPer
11630 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71  cent>1 ){.    sq
11640 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
11650 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c  izeof(zLine), zL
11660 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43  ine, zFormat, iC
11670 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  ur, iHiwtr);.  }
11680 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11690 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
116a0 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c  f(zLine), zLine,
116b0 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72   zFormat, iHiwtr
116c0 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69  );.  }.  raw_pri
116d0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33  ntf(p->out, "%-3
116e0 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c  6s %s\n", zLabel
116f0 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zLine);.}../*.
11700 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72  ** Display memor
11710 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74  y stats..*/.stat
11720 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73  ic int display_s
11730 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
11740 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
11750 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11760 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
11770 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
11780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
11790 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
117a0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73  te */.  int bRes
117b0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
117c0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72      /* True to r
117d0 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a  eset the stats *
117e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  /.){.  int iCur;
117f0 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 20  .  int iHiwtr;. 
11800 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 69 66   FILE *out;.  if
11810 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70 41 72  ( pArg==0 || pAr
11820 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65 74 75  g->out==0 ) retu
11830 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20 70 41  rn 0;.  out = pA
11840 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66 28 20  rg->out;..  if( 
11850 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26 20 28  pArg->pStmt && (
11860 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 26 20  pArg->statsOn & 
11870 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  2) ){.    int nC
11880 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20 73 71  ol, i, x;.    sq
11890 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
118a0 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b  t = pArg->pStmt;
118b0 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  .    char z[100]
118c0 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c  ;.    nCol = sql
118d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
118e0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 61  t(pStmt);.    ra
118f0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
11900 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e 75 6d  -36s %d\n", "Num
11910 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
11920 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29 3b 0a  lumns:", nCol);.
11930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11940 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
11950 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11960 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c 22 43  f(sizeof(z),z,"C
11970 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d 65 3a  olumn %d %nname:
11980 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20 20 20  ", i, &x);.     
11990 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
119a0 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
119b0 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  z, sqlite3_colum
119c0 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  n_name(pStmt,i))
119d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
119e0 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
119f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11a00 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
11a10 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a 22 29  declared type:")
11a20 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
11a30 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
11a40 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
11a50 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
11a60 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 23 65  e(pStmt, i));.#e
11a70 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
11a80 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
11a90 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
11aa0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11ab0 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74 61 62  (30, z+x, "datab
11ac0 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  ase name:");.   
11ad0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11ae0 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11af0 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11b00 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
11b10 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
11b20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11b30 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 74 61  ntf(30, z+x, "ta
11b40 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  ble name:");.   
11b50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11b60 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11b70 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11b80 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70  umn_table_name(p
11b90 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
11ba0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11bb0 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69 67 69  (30, z+x, "origi
11bc0 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20 20  n name:");.     
11bd0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
11be0 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
11bf0 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  z, sqlite3_colum
11c00 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 70 53  n_origin_name(pS
11c10 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69 66 0a  tmt,i));.#endif.
11c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 69 73      }.  }..  dis
11c30 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11c40 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a  g, "Memory Used:
11c50 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11c60 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c  ax %lld) bytes",
11c70 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11c80 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65 73  EMORY_USED, bRes
11c90 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11ca0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11cb0 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e 64  mber of Outstand
11cc0 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a  ing Allocations:
11cd0 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d  ",.     "%lld (m
11ce0 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54  ax %lld)", SQLIT
11cf0 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f  E_STATUS_MALLOC_
11d00 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a  COUNT, bReset);.
11d10 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
11d20 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61  lFlgs & SHFLG_Pa
11d30 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 64  gecache ){.    d
11d40 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11d50 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11d60 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73 65  Pcache Pages Use
11d70 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  d:",.       "%ll
11d80 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70 61 67  d (max %lld) pag
11d90 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11da0 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45  US_PAGECACHE_USE
11db0 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 7d 0a  D, bReset);.  }.
11dc0 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
11dd0 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
11de0 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
11df0 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20  ow Bytes:",.    
11e00 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
11e10 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
11e20 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
11e30 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65 73  E_OVERFLOW, bRes
11e40 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11e50 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
11e60 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e  rgest Allocation
11e70 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62  :",.     "%lld b
11e80 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
11e90 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45  ATUS_MALLOC_SIZE
11ea0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
11eb0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
11ec0 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61 63  g, "Largest Pcac
11ed0 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c  he Allocation:",
11ee0 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65  .     "%lld byte
11ef0 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11f00 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a 45  S_PAGECACHE_SIZE
11f10 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64 65  , bReset);.#ifde
11f20 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41 43  f YYTRACKMAXSTAC
11f30 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c 61 79  KDEPTH.  display
11f40 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11f50 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20 53  Deepest Parser S
11f60 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22 25 6c  tack:",.     "%l
11f70 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20  ld (max %lld)", 
11f80 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
11f90 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73  RSER_STACK, bRes
11fa0 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  et);.#endif..  i
11fb0 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28  f( db ){.    if(
11fc0 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73   pArg->shellFlgs
11fd0 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69   & SHFLG_Lookasi
11fe0 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77  de ){.      iHiw
11ff0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12010 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12020 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12030 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20  ASIDE_USED,.    
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12050 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
12060 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
12070 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12080 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20  rg->out,.       
12090 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64         "Lookasid
120a0 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20  e Slots Used:   
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
120c0 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20  (max %d)\n",.   
120d0 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 2c             iCur,
120e0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
120f0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
12100 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
12110 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
12120 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  HIT,.           
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
12140 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12150 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
12160 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12170 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f  , "Successful lo
12180 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74 73  okaside attempts
12190 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  :       %d\n",. 
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
121b0 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
121c0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
121d0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
121e0 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
121f0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
12210 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12220 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
12230 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12240 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
12250 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73  ailures due to s
12260 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c  ize:      %d\n",
12270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
12280 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
12290 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
122a0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
122b0 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
122c0 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20  SS_FULL,.       
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
122f0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
12300 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12310 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
12320 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
12330 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e   OOM:       %d\n
12340 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12350 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a   iHiwtr);.    }.
12360 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12370 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12380 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12390 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
123a0 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69  S_CACHE_USED, &i
123b0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
123c0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
123d0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
123e0 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73 61   "Pager Heap Usa
123f0 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
12400 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
12410 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12420 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12430 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12440 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12450 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12460 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48  DBSTATUS_CACHE_H
12470 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  IT, &iCur, &iHiw
12480 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
12490 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
124a0 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68 69  , "Page cache hi
124b0 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts:             
124c0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
124d0 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
124e0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
124f0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12500 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12510 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49  BSTATUS_CACHE_MI
12520 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  SS, &iCur, &iHiw
12530 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f  tr, 1);.    raw_
12540 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12550 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d 69  , "Page cache mi
12560 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20 20  sses:           
12570 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12580 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
12590 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
125a0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
125b0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
125c0 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52  BSTATUS_CACHE_WR
125d0 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ITE, &iCur, &iHi
125e0 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
125f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12600 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 77  t, "Page cache w
12610 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20 20  rites:          
12620 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12630 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12640 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12650 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12660 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
12670 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 53  DBSTATUS_CACHE_S
12680 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69 48  PILL, &iCur, &iH
12690 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
126a0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
126b0 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
126c0 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20 20 20  spills:         
126d0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
126e0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
126f0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12700 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12710 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12720 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
12730 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
12740 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12750 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12760 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d  Arg->out, "Schem
12770 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  a Heap Usage:   
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
127a0 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
127b0 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
127c0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
127d0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
127e0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
127f0 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43  S_STMT_USED, &iC
12800 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
12810 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12820 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12830 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 2f  "Statement Heap/
12840 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65 3a  Lookaside Usage:
12850 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
12860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
12870 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
12880 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b 0a   pArg->pStmt ){.
12890 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
128a0 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
128b0 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
128c0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
128d0 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20 20  LLSCAN_STEP,.   
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128f0 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65 73              bRes
12900 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12910 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12920 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a 20  Fullscan Steps: 
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12950 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12960 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12970 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12980 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12990 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b 0a  _SORT, bReset);.
129a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
129b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74 20  Arg->out, "Sort 
129c0 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20 20  Operations:     
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
129f0 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12a00 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12a10 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12a20 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
12a30 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a 20  INDEX,bReset);. 
12a40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12a50 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69 6e  rg->out, "Autoin
12a60 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20 20  dex Inserts:    
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12a80 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12a90 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12aa0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12ab0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12ac0 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
12ad0 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  EP, bReset);.   
12ae0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12af0 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c 20  ->out, "Virtual 
12b00 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20 20  Machine Steps:  
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12b20 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12b30 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12b40 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12b50 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12b60 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41  MTSTATUS_REPREPA
12b70 52 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  RE, bReset);.   
12b80 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12b90 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70 61 72  ->out, "Reprepar
12ba0 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  e operations:   
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12bc0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
12bd0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
12be0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
12bf0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
12c00 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20 62 52  MTSTATUS_RUN, bR
12c10 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12c20 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12c30 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65   "Number of time
12c40 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20 20 20  s run:          
12c50 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12c60 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12c70 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12c80 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12c90 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12ca0 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52 65 73  US_MEMUSED, bRes
12cb0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12cc0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12cd0 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 70  Memory used by p
12ce0 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20 20 20  repared stmt:   
12cf0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12d00 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
12d10 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
12d20 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
12d30 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
12d40 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
12d50 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
12d60 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
12d70 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
12d80 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
12d90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
12da0 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
12db0 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
12dc0 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
12dd0 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
12de0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e00 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
12e10 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
12e20 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
12e30 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12e40 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
12e50 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
12e60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
12e70 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
12e80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e90 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
12ea0 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
12eb0 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
12ec0 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
12ed0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12ee0 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
12ef0 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
12f00 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
12f10 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
12f20 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
12f30 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
12f40 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
12f50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
12f60 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
12f70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
12f80 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12f90 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
12fa0 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
12fb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
12fc0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
12fd0 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
12fe0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
12ff0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13000 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13010 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
13020 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
13030 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13040 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13050 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
13060 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
13070 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
13080 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
13090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
130a0 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
130b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
130c0 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
130d0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
130e0 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
130f0 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
13100 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
13110 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
13120 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
13130 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
13140 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
13150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13160 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
13170 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
13180 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
13190 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
131a0 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
131b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
131c0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
131d0 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
131e0 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
131f0 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
13200 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13210 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13220 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
13230 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
13240 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
13250 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
13260 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
13270 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
13280 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
13290 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
132a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
132b0 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
132c0 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
132d0 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
132e0 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
132f0 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
13300 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
13310 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
13320 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
13330 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
13340 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
13350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
13360 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13370 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
13380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
13390 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
133a0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
133b0 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
133c0 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
133d0 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
133e0 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
133f0 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
13400 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
13410 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
13420 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
13430 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
13440 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
13450 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
13460 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
13470 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
13480 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
13490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
134a0 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
134b0 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
134c0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
134d0 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
134e0 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
134f0 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
13500 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
13510 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
13520 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
13530 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
13540 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
13550 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
13560 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
13570 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
13580 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
13590 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
135a0 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
135b0 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
135c0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
135d0 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
135e0 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
135f0 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
13600 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
13610 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
13620 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
13630 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13640 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
13650 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
13660 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
13670 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
13680 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
13690 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
136a0 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
136b0 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
136c0 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
136d0 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
136e0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
136f0 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
13700 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
13710 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
13720 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
13730 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
13740 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
13750 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
13760 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
13770 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
13780 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
13790 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
137a0 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
137b0 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
137c0 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
137d0 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
137e0 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
137f0 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
13800 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
13810 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
13820 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13830 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
13840 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
13850 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
13860 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
13870 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
13880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13890 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
138a0 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
138b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
138e0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
138f0 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
13900 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13920 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
13930 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
13940 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13960 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
13970 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
13980 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
13990 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
139c0 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
139d0 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
139e0 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
139f0 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
13a00 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
13a10 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
13a20 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  ext", 0 };.  con
13a30 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
13a40 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
13a50 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
13a60 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
13a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
13a90 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
13aa0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
13ab0 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
13ac0 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
13ad0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
13ae0 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
13af0 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
13b00 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
13b10 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
13b20 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
13b30 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
13b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
13b50 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
13b60 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
13b70 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
13b80 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
13b90 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
13ba0 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
13bb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
13bc0 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
13bd0 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
13be0 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
13bf0 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
13c00 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
13c10 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
13c20 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
13c30 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
13c40 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
13c50 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
13c60 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
13c70 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
13c80 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
13c90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13ca0 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
13cb0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
13cc0 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
13cd0 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
13ce0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
13cf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
13d00 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
13d10 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
13d20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
13d30 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
13d40 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
13d50 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
13d60 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
13d70 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
13d80 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
13d90 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
13da0 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
13db0 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
13dc0 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
13dd0 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
13de0 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
13df0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
13e00 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
13e10 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
13e20 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
13e30 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
13e40 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
13e50 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
13e60 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
13e70 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
13e80 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
13e90 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
13ea0 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
13eb0 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
13ec0 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
13ed0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
13ee0 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
13ef0 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
13f00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
13f10 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
13f20 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
13f30 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
13f40 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
13f50 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
13f60 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
13f70 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
13f80 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
13f90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
13fa0 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
13fb0 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
13fc0 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
13fd0 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
13fe0 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
13ff0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
14000 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
14010 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
14020 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
14030 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
14040 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
14050 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
14060 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
14070 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
14080 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
14090 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
140a0 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
140b0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
140c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
140d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
140e0 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
140f0 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
14100 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
14110 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
14120 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
14130 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14140 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49 6e 64      if( p->aiInd
14150 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ent==0 ) shell_o
14160 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
14170 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20        abYield = 
14180 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
14190 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c  alloc64(abYield,
141a0 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
141b0 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
141c0 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73 68 65  abYield==0 ) she
141d0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
141e0 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ();.    }.    ab
141f0 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
14200 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
14210 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
14220 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
14230 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
14240 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
14250 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
14260 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
14270 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
14280 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
14290 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
142a0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
142b0 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
142c0 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
142d0 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
142e0 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
142f0 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
14300 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
14310 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
14320 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
14330 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
14340 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
14350 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
14360 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
14370 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
14380 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
14390 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
143a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
143b0 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
143c0 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
143d0 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
143e0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
143f0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
14400 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
14410 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
14420 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
14430 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
14440 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
14450 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
14460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
14470 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
14480 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
14490 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
144a0 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
144b0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
144c0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
144d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
144e0 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
144f0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
14500 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
14510 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
14520 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
14530 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
14540 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
14550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
14560 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
14570 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
14580 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
14590 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
145a0 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
145b0 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
145c0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
145d0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
145e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
145f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14600 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14610 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
14620 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
14630 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
14640 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14650 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
14660 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
14670 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14690 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
146a0 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
146b0 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
146c0 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
146d0 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
146e0 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
146f0 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
14700 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
14710 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
14720 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
14730 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14740 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
14750 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
14760 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
14770 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
14780 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
14790 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
147a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
147b0 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
147c0 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
147d0 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
147e0 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
147f0 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74 65  dif.}../* Create
14800 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20   the TEMP table 
14810 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70 61  used to store pa
14820 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
14830 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
14840 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28  bind_table_init(
14850 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
14860 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61 20 3d    int wrSchema =
14870 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62   0;.  sqlite3_db
14880 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
14890 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57  QLITE_DBCONFIG_W
148a0 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20  RITABLE_SCHEMA, 
148b0 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b 0a  -1, &wrSchema);.
148c0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
148d0 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
148e0 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
148f0 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c 20 30  BLE_SCHEMA, 1, 0
14900 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
14910 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 43 52  c(p->db,.    "CR
14920 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
14930 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e 73 71  T EXISTS temp.sq
14940 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73 28  lite_parameters(
14950 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20 54  \n".    "  key T
14960 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14970 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75 65  \n".    "  value
14980 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20 57   ANY\n".    ") W
14990 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c 0a  ITHOUT ROWID;",.
149a0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
149b0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
149c0 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  g(p->db, SQLITE_
149d0 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c  DBCONFIG_WRITABL
149e0 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63 68 65  E_SCHEMA, wrSche
149f0 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ma, 0);.}../*.**
14a00 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   Bind parameters
14a10 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64 20 73   on a prepared s
14a20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
14a30 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  Parameter bindin
14a40 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
14a50 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 6f  m a TEMP table o
14a60 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
14a70 2a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50  *    CREATE TEMP
14a80 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 70 61   TABLE sqlite_pa
14a90 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54 45 58  rameters(key TEX
14aa0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  T PRIMARY KEY, v
14ab0 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49 54 48  alue).**    WITH
14ac0 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a 2a  OUT ROWID;.**.**
14ad0 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f 63 63   No bindings occ
14ae0 75 72 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ur if this table
14af0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
14b00 20 20 54 68 65 20 73 70 65 63 69 61 6c 20 63 68    The special ch
14b10 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a 20 69  aracter '$'.** i
14b20 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
14b30 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
14b40 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63 6f 6c  help prevent col
14b50 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61 63 74  lisions with act
14b60 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a 20 54  ual tables..** T
14b70 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
14b80 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63 68   in the TEMP sch
14b90 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ema..*/.static v
14ba0 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61 72 65  oid bind_prepare
14bb0 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74 61 74  d_stmt(ShellStat
14bc0 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65 33  e *pArg, sqlite3
14bd0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
14be0 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69 6e 74   int nVar;.  int
14bf0 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   i;.  int rc;.  
14c00 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
14c10 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20 3d 20   = 0;..  nVar = 
14c20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
14c30 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
14c40 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61 72 3d  mt);.  if( nVar=
14c50 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
14c60 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   Nothing to do *
14c70 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
14c80 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
14c90 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62 2c 20  adata(pArg->db, 
14ca0 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74 65 5f  "TEMP", "sqlite_
14cb0 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20 20 20  parameters",.   
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30 2c   "key", 0, 0, 0,
14cf0 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 4f   0, 0)!=SQLITE_O
14d00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  K ){.    return;
14d10 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74 61   /* Parameter ta
14d20 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
14d30 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d  st */.  }.  rc =
14d40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
14d50 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20 20  _v2(pArg->db,.  
14d60 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
14d70 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70 2e  value FROM temp.
14d80 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14d90 73 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 57  s".          " W
14da0 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20 2d 31  HERE key=?1", -1
14db0 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69 66 28  , &pQ, 0);.  if(
14dc0 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29 20 72   rc || pQ==0 ) r
14dd0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31  eturn;.  for(i=1
14de0 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29 7b  ; i<=nVar; i++){
14df0 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33  .    char zNum[3
14e00 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0];.    const ch
14e10 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69 74  ar *zVar = sqlit
14e20 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
14e30 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  r_name(pStmt, i)
14e40 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 3d 3d  ;.    if( zVar==
14e50 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14e60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
14e70 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c 22 3f  of(zNum),zNum,"?
14e80 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 7a 56  %d",i);.      zV
14e90 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20 20 7d  ar = zNum;.    }
14ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
14eb0 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20 7a 56  d_text(pQ, 1, zV
14ec0 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  ar, -1, SQLITE_S
14ed0 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20  TATIC);.    if( 
14ee0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 29  sqlite3_step(pQ)
14ef0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
14f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
14f10 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c 20  nd_value(pStmt, 
14f20 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  i, sqlite3_colum
14f30 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29 29 3b  n_value(pQ, 0));
14f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14f50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
14f60 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ull(pStmt, i);. 
14f70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14f80 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20 7d 0a  _reset(pQ);.  }.
14f90 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
14fa0 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze(pQ);.}../*.**
14fb0 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20   Run a prepared 
14fc0 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61  statement.*/.sta
14fd0 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72  tic void exec_pr
14fe0 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53  epared_stmt(.  S
14ff0 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
15030 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71  ellState */.  sq
15040 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15050 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15070 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75  * Statment to ru
15080 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
15090 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20  ;..  /* perform 
150a0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e 20  the first step. 
150b0 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20   this will tell 
150c0 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61  us if we.  ** ha
150d0 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  ve a result set 
150e0 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77  or not and how w
150f0 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a  ide it is..  */.
15100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
15110 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  tep(pStmt);.  /*
15120 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72 65   if we have a re
15130 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20  sult set... */. 
15140 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20   if( SQLITE_ROW 
15150 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  == rc ){.    /* 
15160 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
15170 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72 2c  or col name ptr,
15180 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64 20   value ptr, and 
15190 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  type */.    int 
151a0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
151b0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
151c0 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44  t);.    void *pD
151d0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
151e0 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73 69  lloc64(3*nCol*si
151f0 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72 2a  zeof(const char*
15200 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ) + 1);.    if( 
15210 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  !pData ){.      
15220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15230 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
15240 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
15250 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
15260 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
15270 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
15280 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  mns */.      cha
15290 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
152a0 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
152b0 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
152c0 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79 70        int *aiTyp
152d0 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a 56  es = (int *)&azV
152e0 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52 65  als[nCol]; /* Re
152f0 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20 20  sult types */.  
15300 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20      int i, x;.  
15310 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
15320 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f 66  f(int) <= sizeof
15330 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20 20  (char *));.     
15340 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72   /* save off ptr
15350 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s to column name
15360 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  s */.      for(i
15370 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
15380 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73  {.        azCols
15390 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71  [i] = (char *)sq
153a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
153b0 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  e(pStmt, i);.   
153c0 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a 20     }.      do{. 
153d0 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61 63         /* extrac
153e0 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 64  t the data and d
153f0 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20 20  ata types */.   
15400 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15410 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15420 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69 5d        aiTypes[i]
15430 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 63   = x = sqlite3_c
15440 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
15450 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
15460 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c  if( x==SQLITE_BL
15470 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70 41  OB && pArg && pA
15480 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
15490 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Insert ){.      
154a0 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
154b0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
154c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
154d0 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
154e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
154f0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
15500 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   i);.          }
15510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
15520 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61 69  azVals[i] && (ai
15530 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54 45  Types[i]!=SQLITE
15540 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
15550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15560 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
15570 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20 66       break; /* f
15580 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  rom for */.     
15590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
155a0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
155b0 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61          /* if da
155c0 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78 74  ta and types ext
155d0 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66 75  racted successfu
155e0 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  lly... */.      
155f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
15600 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
15610 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
15620 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
15630 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
15640 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
15650 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65 6c          if( shel
15660 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
15670 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61   nCol, azVals, a
15680 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20  zCols, aiTypes) 
15690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
156a0 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  c = SQLITE_ABORT
156b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
156c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
156d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
156e0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
156f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15700 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51       } while( SQ
15710 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
15720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15730 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20 20  free(pData);.   
15740 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
15750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
15760 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
15770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15780 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
15790 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20 70  ess SQL if the p
157a0 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f  revious shell co
157b0 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65  mmand.** was ".e
157c0 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73 65  xpert". It passe
157d0 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65  s the SQL in the
157e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
157f0 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
15800 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65 72  the sqlite3exper
15810 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  t object..**.** 
15820 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
15830 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15840 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15850 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
15860 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
15870 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
15880 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
15890 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
158a0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
158b0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
158c0 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
158d0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
158e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
158f0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
15900 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
15910 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
15920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
15940 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a  xpertHandleSQL(.
15950 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
15960 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63  tate, .  const c
15970 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68  har *zSql, .  ch
15980 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15990 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
159a0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29  expert.pExpert )
159b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45 72  ;.  assert( pzEr
159c0 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d  r==0 || *pzErr==
159d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
159e0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
159f0 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e  (pState->expert.
15a00 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70  pExpert, zSql, p
15a10 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
15a20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15a30 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74   called either t
15a40 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e  o silently clean
15a50 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a   up the object.*
15a60 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
15a70 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61   ".expert" comma
15a80 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  nd (if bCancel==
15a90 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61  1), or to genera
15aa0 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20  te a .** report 
15ab0 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e  from it and then
15ac0 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66   clean it up (if
15ad0 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a   bCancel==0)..**
15ae0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
15af0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
15b00 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15b10 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
15b20 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e  rror.** code. In
15b30 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a   this case, (*pz
15b40 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74 20  Err) may be set 
15b50 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
15b60 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ffer containing.
15b70 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ** an English la
15b80 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73  nguage error mes
15b90 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
15ba0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
15bb0 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20  f the.** caller 
15bc0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
15bd0 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20 75  ee this buffer u
15be0 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
15bf0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
15c00 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68 28  nt expertFinish(
15c10 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15c20 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61  State,.  int bCa
15c30 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70  ncel,.  char **p
15c40 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
15c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15c60 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
15c70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72   = pState->exper
15c80 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73  t.pExpert;.  ass
15c90 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65  ert( p );.  asse
15ca0 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70  rt( bCancel || p
15cb0 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72  zErr==0 || *pzEr
15cc0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43  r==0 );.  if( bC
15cd0 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ancel==0 ){.    
15ce0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61  FILE *out = pSta
15cf0 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74  te->out;.    int
15d00 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61   bVerbose = pSta
15d10 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
15d20 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ose;..    rc = s
15d30 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
15d40 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b  alyze(p, pzErr);
15d50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15d70 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c  int nQuery = sql
15d80 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e  ite3_expert_coun
15d90 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  t(p);.      int 
15da0 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56  i;..      if( bV
15db0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
15dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
15dd0 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  and = sqlite3_ex
15de0 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c  pert_report(p,0,
15df0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41  EXPERT_REPORT_CA
15e00 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20  NDIDATES);.     
15e10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15e20 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65  t, "-- Candidate
15e30 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s --------------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
15e50 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  n");.        raw
15e60 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
15e70 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20  \n", zCand);.   
15e80 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15e90 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b  =0; i<nQuery; i+
15ea0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
15eb0 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73  t char *zSql = s
15ec0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15ed0 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15ee0 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20  T_REPORT_SQL);. 
15ef0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15f00 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65  r *zIdx = sqlite
15f10 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
15f20 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
15f30 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20  ORT_INDEXES);.  
15f40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15f50 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33   *zEQP = sqlite3
15f60 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15f70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15f80 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20  RT_PLAN);.      
15f90 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20    if( zIdx==0 ) 
15fa0 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20  zIdx = "(no new 
15fb0 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20  indexes)\n";.   
15fc0 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
15fd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
15fe0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15ff0 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d  -- Query %d ----
16000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c  ------------\n",
16020 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
16030 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
16040 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b  "%s\n\n", zSql);
16050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16060 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
16070 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29  t, "%s\n", zIdx)
16080 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
16090 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
160a0 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d  , zEQP);.      }
160b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
160c0 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74  ite3_expert_dest
160d0 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65  roy(p);.  pState
160e0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
160f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16100 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
16110 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e  ementation of ".
16120 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d  expert" dot comm
16130 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
16140 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d  nt expertDotComm
16150 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
16160 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
16170 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
16180 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
16190 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
161a0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
161b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
161c0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
161d0 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
161e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
161f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
16200 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16210 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
16220 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
16230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16240 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  _OK;.  char *zEr
16250 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
16260 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20    int iSample = 
16270 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
16280 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16290 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  pert==0 );.  mem
162a0 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70  set(&pState->exp
162b0 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  ert, 0, sizeof(E
162c0 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20  xpertInfo));..  
162d0 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
162e0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
162f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
16300 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
16310 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
16320 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
16330 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
16340 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
16350 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  0(z);.    if( n>
16360 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
16370 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20  (z, "-verbose", 
16380 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61  n) ){.      pSta
16390 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62  te->expert.bVerb
163a0 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ose = 1;.    }. 
163b0 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32     else if( n>=2
163c0 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a   && 0==strncmp(z
163d0 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20  , "-sample", n) 
163e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  ){.      if( i==
163f0 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
16400 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16410 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72  tderr, "option r
16420 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
16430 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ent: %s\n", z);.
16440 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16450 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16470 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69  iSample = (int)i
16480 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
16490 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20  g[++i]);.       
164a0 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c   if( iSample<0 |
164b0 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b  | iSample>100 ){
164c0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
164d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76  rintf(stderr, "v
164e0 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  alue out of rang
164f0 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  e: %s\n", azArg[
16500 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
16510 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c    }.    }.    el
16540 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
16550 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
16560 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
16570 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  \n", z);.      r
16580 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
165a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
165b0 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e   ){.    pState->
165c0 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
165d0 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
165e0 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  new(pState->db, 
165f0 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
16600 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
16610 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Expert==0 ){.   
16620 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
16630 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65  derr, "sqlite3_e
16640 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22  xpert_new: %s\n"
16650 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72  , zErr);.      r
16660 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16680 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72     sqlite3_exper
16690 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20  t_config(.      
166a0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
166b0 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45  rt.pExpert, EXPE
166c0 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45  RT_CONFIG_SAMPLE
166d0 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20  , iSample.      
166e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
166f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16700 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
16710 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16720 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
16730 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74 65   Execute a state
16740 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73  ment or set of s
16750 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e  tatements.  Prin
16760 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20  t.** any result 
16770 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70  rows/columns dep
16780 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75  ending on the cu
16790 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65  rrent mode.** se
167a0 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c 69  t via the suppli
167b0 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ed callback..**.
167c0 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79 20  ** This is very 
167d0 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74  similar to SQLit
167e0 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c  e's built-in sql
167f0 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
16800 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69  unction except i
16810 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74  t takes a slight
16820 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c  ly different cal
16830 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c  lback.** and cal
16840 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d  lback data argum
16850 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
16860 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20  nt shell_exec(. 
16870 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
16880 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
16890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
168a0 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
168b0 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
168c0 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20     /* SQL to be 
168f0 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20 63  evaluated */.  c
16900 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16930 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65  r msg written he
16940 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
16950 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16960 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74   NULL;     /* St
16970 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
16980 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  te. */.  int rc 
16990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
169a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
169b0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
169c0 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rc2;.  const ch
169d0 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20  ar *zLeftover;  
169e0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20          /* Tail 
169f0 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53  of unprocessed S
16a00 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  QL */.  sqlite3 
16a10 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b 0a  *db = pArg->db;.
16a20 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
16a30 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
16a40 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23 69   = NULL;.  }..#i
16a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
16a70 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72   if( pArg->exper
16a80 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20  t.pExpert ){.   
16a90 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64   rc = expertHand
16aa0 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c  leSQL(pArg, zSql
16ab0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
16ac0 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69   return expertFi
16ad0 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d  nish(pArg, (rc!=
16ae0 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72  SQLITE_OK), pzEr
16af0 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rMsg);.  }.#endi
16b00 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  f..  while( zSql
16b10 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f 4f  [0] && (SQLITE_O
16b20 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20 20  K == rc) ){.    
16b30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16b40 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20 20  r *zStmtSql;.   
16b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
16b60 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
16b70 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26  l, -1, &pStmt, &
16b80 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20 20  zLeftover);.    
16b90 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d  if( SQLITE_OK !=
16ba0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
16bb0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
16bc0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16bd0 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
16be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
16c00 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  !pStmt ){.      
16c10 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65 6e    /* this happen
16c20 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74 20  s for a comment 
16c30 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20 2a  or white-space *
16c40 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  /.        zSql =
16c50 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20   zLeftover;.    
16c60 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
16c70 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53  ce(zSql[0]) ) zS
16c80 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 6f  ql++;.        co
16c90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
16ca0 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20 3d        zStmtSql =
16cb0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
16cc0 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  mt);.      if( z
16cd0 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53 74  StmtSql==0 ) zSt
16ce0 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20  mtSql = "";.    
16cf0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
16d00 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29 20  (zStmtSql[0]) ) 
16d10 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20  zStmtSql++;..   
16d20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 74     /* save off t
16d30 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16d40 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64 20  ment handle and 
16d50 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74 20  reset row count 
16d60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
16d70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
16d80 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74  g->pStmt = pStmt
16d90 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  ;.        pArg->
16da0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  cnt = 0;.      }
16db0 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f 20  ..      /* echo 
16dc0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
16dd0 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a  t if echo on */.
16de0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
16df0 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  & ShellHasFlag(p
16e00 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  Arg, SHFLG_Echo)
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
16e20 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
16e30 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d 74  t, "%s\n", zStmt
16e40 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20 3a  Sql ? zStmtSql :
16e50 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   zSql);.      }.
16e60 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74  .      /* Show t
16e70 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
16e80 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69 73   PLAN if .eqp is
16e90 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28   on */.      if(
16ea0 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 61   pArg && pArg->a
16eb0 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74 65  utoEQP && sqlite
16ec0 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e  3_stmt_isexplain
16ed0 28 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20 20  (pStmt)==0 ){.  
16ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
16ef0 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20  mt *pExplain;.  
16f00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50        char *zEQP
16f10 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 72  ;.        int tr
16f20 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20  iggerEQP = 0;.  
16f30 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65        disable_de
16f40 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
16f50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16f60 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
16f70 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
16f80 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31  _TRIGGER_EQP, -1
16f90 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a  , &triggerEQP);.
16fa0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
16fb0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
16fc0 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20  QP_trigger ){.  
16fd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16fe0 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
16ff0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
17000 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29  IGGER_EQP, 1, 0)
17010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17020 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74      zEQP = sqlit
17030 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
17040 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
17050 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20  s", zStmtSql);. 
17060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17070 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17080 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
17090 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
170a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
170b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
170c0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
170d0 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
170e0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
170f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
17100 74 20 63 68 61 72 20 2a 7a 45 51 50 4c 69 6e 65  t char *zEQPLine
17110 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
17120 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
17130 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 33 29 3b  ext(pExplain,3);
17140 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
17150 20 69 45 71 70 49 64 20 3d 20 73 71 6c 69 74 65   iEqpId = sqlite
17160 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
17170 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
17180 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 65         int iPare
17190 6e 74 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ntId = sqlite3_c
171a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
171b0 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  in, 1);.        
171c0 20 20 20 20 69 66 28 20 7a 45 51 50 4c 69 6e 65      if( zEQPLine
171d0 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70 5f 72  [0]=='-' ) eqp_r
171e0 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20 20 20  ender(pArg);.   
171f0 20 20 20 20 20 20 20 20 20 65 71 70 5f 61 70 70           eqp_app
17200 65 6e 64 28 70 41 72 67 2c 20 69 45 71 70 49 64  end(pArg, iEqpId
17210 2c 20 69 50 61 72 65 6e 74 49 64 2c 20 7a 45 51  , iParentId, zEQ
17220 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  PLine);.        
17230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 71    }.          eq
17240 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
17250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17260 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17270 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
17280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
17290 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
172a0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
172b0 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
172c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
172d0 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
172e0 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
172f0 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
17300 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
17310 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
17320 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
17330 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
17340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17350 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
17360 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
17370 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
173a0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
173b0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
173c0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
173d0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
173e0 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
173f0 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
17400 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
17410 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
17420 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
17430 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17440 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
17450 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
17460 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
17470 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
17480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17490 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
174a0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
174b0 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
174c0 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72  QP_trigger && tr
174d0 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20  iggerEQP==0 ){. 
174e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
174f0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
17500 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
17510 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30  RIGGER_EQP, 0, 0
17520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
17530 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20  Reprepare pStmt 
17540 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e  before reactivin
17550 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f  g trace modes */
17560 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17570 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
17580 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
17590 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
175a0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
175b0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
175c0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 20       if( pArg ) 
175d0 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53  pArg->pStmt = pS
175e0 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tmt;.        }. 
175f0 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 64         restore_d
17600 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
17610 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ();.      }..   
17620 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
17630 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17640 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65 3b  de = pArg->mode;
17650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
17660 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 29  g->autoExplain )
17670 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
17680 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
17690 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 31  xplain(pStmt)==1
176a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176b0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
176c0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
176d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
176f0 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17700 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  mt)==2 ){.      
17710 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17720 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20 20  e = MODE_EQP;.  
17730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17740 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
17750 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20  If the shell is 
17760 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65  currently in ".e
17770 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61  xplain" mode, ga
17780 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a 20  ther the extra. 
17790 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72         ** data r
177a0 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20 69  equired to add i
177b0 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75  ndents to the ou
177c0 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20  tput.*/.        
177d0 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d  if( pArg->cMode=
177e0 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b  =MODE_Explain ){
177f0 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61  .          expla
17800 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
17810 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17830 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72 65 70  .      bind_prep
17840 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
17850 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78  pStmt);.      ex
17860 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
17870 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
17880 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
17890 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
178a0 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72        eqp_render
178b0 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f  (pArg);..      /
178c0 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74  * print usage st
178d0 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20  ats if stats on 
178e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
178f0 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73  g && pArg->stats
17900 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
17910 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20  splay_stats(db, 
17920 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pArg, 0);.      
17930 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  }..      /* prin
17940 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20  t loop-counters 
17950 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
17960 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
17970 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73   pArg->scanstats
17980 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  On ){.        di
17990 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
179a0 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  db, pArg);.     
179b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
179c0 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d  alize the statem
179d0 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65  ent just execute
179e0 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  d. If this fails
179f0 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  , save a.      *
17a00 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72  * copy of the er
17a10 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68  ror message. Oth
17a20 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c  erwise, set zSql
17a30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
17a40 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73  .      ** next s
17a50 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
17a60 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ute. */.      rc
17a70 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
17a80 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
17a90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17aa0 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72  E_NOMEM ) rc = r
17ab0 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
17ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17ad0 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c         zSql = zL
17ae0 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20  eftover;.       
17af0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
17b00 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b  zSql[0]) ) zSql+
17b10 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
17b20 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
17b30 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
17b40 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
17b50 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  db);.      }..  
17b60 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76      /* clear sav
17b70 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a  ed stmt handle *
17b80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
17b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
17ba0 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a  ->pStmt = NULL;.
17bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17bc0 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a  } /* end while *
17bd0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
17be0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
17bf0 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
17c00 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
17c10 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17c20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
17c30 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74  d freeColumnList
17c40 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a  (char **azCol){.
17c50 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
17c60 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
17c70 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
17c80 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a  free(azCol[i]);.
17c90 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30    }.  /* azCol[0
17ca0 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74  ] is a static st
17cb0 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ring */.  sqlite
17cc0 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d  3_free(azCol);.}
17cd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17ce0 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72   list of pointer
17cf0 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69  s to strings whi
17d00 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73  ch are the names
17d10 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d   of all.** colum
17d20 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62  ns in table zTab
17d30 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74  .   The memory t
17d40 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73  o hold the names
17d50 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
17d60 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
17d70 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
17d80 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
17d90 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65  using a subseque
17da0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72  nt call.** to fr
17db0 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a  eeColumnList()..
17dc0 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b  **.** The azCol[
17dd0 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61  0] entry is usua
17de0 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76  lly NULL.  Howev
17df0 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74  er, if zTab cont
17e00 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20  ains a rowid.** 
17e10 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73  value that needs
17e20 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64   to be preserved
17e30 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20  , then azCol[0] 
17e40 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
17e50 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66  h the.** name of
17e60 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   the rowid colum
17e70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  n..**.** The fir
17e80 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d  st regular colum
17e90 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69  n in the table i
17ea0 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65  s azCol[1].  The
17eb0 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61   list is termina
17ec0 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74  ted.** by an ent
17ed0 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d  ry with azCol[i]
17ee0 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ==0..*/.static c
17ef0 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d  har **tableColum
17f00 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65  nList(ShellState
17f10 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
17f20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a  *zTab){.  char *
17f30 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71  *azCol = 0;.  sq
17f40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17f50 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  t;.  char *zSql;
17f60 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
17f70 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20  .  int nAlloc = 
17f80 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30  0;.  int nPK = 0
17f90 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
17fa0 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59  r of PRIMARY KEY
17fb0 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f   columns seen */
17fc0 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30  .  int isIPK = 0
17fd0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
17fe0 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59   one PRIMARY KEY
17ff0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20   column of type 
18000 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74  INTEGER */.  int
18010 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18020 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c   ShellHasFlag(p,
18030 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52   SHFLG_PreserveR
18040 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b  owid);.  int rc;
18050 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ..  zSql = sqlit
18060 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
18070 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
18080 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d  ", zTab);.  rc =
18090 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
180a0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
180b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
180c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
180d0 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  zSql);.  if( rc 
180e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
180f0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
18100 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
18110 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
18120 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29  nCol>=nAlloc-2 )
18130 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d  {.      nAlloc =
18140 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c   nAlloc*2 + nCol
18150 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43   + 10;.      azC
18160 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ol = sqlite3_rea
18170 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c  lloc(azCol, nAll
18180 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b  oc*sizeof(azCol[
18190 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0]));.      if( 
181a0 61 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65 6c 6c  azCol==0 ) shell
181b0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
181c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  ;.    }.    azCo
181d0 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
181e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
181f0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
18200 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
18210 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
18220 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
18230 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  mt, 5) ){.      
18240 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nPK++;.      if(
18250 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26   nPK==1.       &
18260 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
18270 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
18280 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
18290 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20  xt(pStmt,2),.   
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22         "INTEGER"
182c0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
182d0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b        isIPK = 1;
182e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
182f0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b        isIPK = 0;
18300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18310 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
18320 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
18330 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
18340 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c  eturn 0;.  azCol
18350 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c  [0] = 0;.  azCol
18360 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20  [nCol+1] = 0;.. 
18370 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e   /* The decision
18380 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
18390 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c  ot a rowid reall
183a0 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  y needs to be pr
183b0 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20  eserved.  ** is 
183c0 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65  tricky.  We neve
183d0 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72  r need to preser
183e0 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61  ve a rowid for a
183f0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18400 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74  able.  ** or a t
18410 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54  able with an INT
18420 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
18430 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65  .  We are unable
18440 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a   to preserve.  *
18450 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c  * rowids on tabl
18460 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  es where the row
18470 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  id is inaccessib
18480 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  le because there
18490 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   are other.  ** 
184a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
184b0 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69  able named "rowi
184c0 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61  d", "_rowid_", a
184d0 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20  nd "oid"..  */. 
184e0 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
184f0 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20  id && isIPK ){. 
18500 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c     /* If a singl
18510 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
18520 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49  lumn with type I
18530 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c  NTEGER was seen,
18540 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
18550 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73  might be an alis
18560 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  e for the ROWID.
18570 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61    But it might a
18580 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54  lso be a WITHOUT
18590 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61   ROWID.    ** ta
185a0 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52  ble or a INTEGER
185b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53   PRIMARY KEY DES
185c0 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65  C column, neithe
185d0 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20  r of which are. 
185e0 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61     ** ROWID alia
185f0 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67  ses.  To disting
18600 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73  uish these cases
18610 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
18620 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
18630 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69  s a "pk" entry i
18640 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  n "PRAGMA index_
18650 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69  list".  There wi
18660 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20  ll be.    ** no 
18670 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68  "pk" index if th
18680 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65  e PRIMARY KEY re
18690 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73  ally is an alias
186a0 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a   for the ROWID..
186b0 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
186c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
186d0 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  f("SELECT 1 FROM
186e0 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69   pragma_index_li
186f0 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20  st(%Q)".        
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69     " WHERE origi
18720 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a  n='pk'", zTab);.
18730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18740 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
18750 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
18760 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
18770 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
18780 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18790 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c       freeColumnL
187a0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
187b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
187c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
187d0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
187e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
187f0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
18800 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
18810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b   rc==SQLITE_ROW;
18820 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65  .  }.  if( prese
18830 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  rveRowid ){.    
18840 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65  /* Only preserve
18850 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65   the rowid if we
18860 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65   can find a name
18870 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a   to use for the.
18880 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a      ** rowid */.
18890 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
188a0 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22  *azRowid[] = { "
188b0 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
188c0 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20  ", "oid" };.    
188d0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
188e0 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
188f0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
18900 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a   i<=nCol; i++){.
18910 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
18920 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f  te3_stricmp(azRo
18930 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29  wid[j],azCol[i])
18940 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
18950 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
18960 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
18970 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
18980 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
18990 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f  azRowid[j] is no
189a0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  t the name of an
189b0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64  y.        ** ord
189c0 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  inary column in 
189d0 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69  the table.  Veri
189e0 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  fy that azRowid[
189f0 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20  j] is a valid.  
18a00 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f        ** name fo
18a10 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f  r the rowid befo
18a20 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20  re adding it to 
18a30 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f  azCol[0].  WITHO
18a40 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT ROWID.       
18a50 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20   ** tables will 
18a60 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63  fail this last c
18a70 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
18a80 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
18a90 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
18aa0 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c  ta(p->db,0,zTab,
18ab0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30  azRowid[j],0,0,0
18ac0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ,0,0);.        i
18ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18ae0 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a   ) azCol[0] = az
18af0 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20  Rowid[j];.      
18b00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18b10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18b20 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a  urn azCol;.}../*
18b30 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72  .** Toggle the r
18b40 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
18b50 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67  _selects setting
18b60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b70 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
18b80 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
18b90 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18ba0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
18bb0 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a  t iSetting = 0;.
18bc0 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30    char zStmt[100
18bd0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  ];.  sqlite3_pre
18be0 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
18bf0 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
18c00 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20  dered_selects", 
18c10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
18c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
18c30 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
18c40 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65  E_ROW ){.    iSe
18c50 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tting = sqlite3_
18c60 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
18c70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
18c80 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18c90 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt);.  sqlite3_s
18ca0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
18cb0 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20  Stmt), zStmt,.  
18cc0 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76       "PRAGMA rev
18cd0 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
18ce0 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53  elects(%d)", !iS
18cf0 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  etting);.  sqlit
18d00 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d  e3_exec(db, zStm
18d10 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  t, 0, 0, 0);.}..
18d20 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
18d30 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
18d40 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  ck routine used 
18d50 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20  for dumping the 
18d60 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63  database..** Eac
18d70 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62  h row received b
18d80 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  y this callback 
18d90 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61  consists of a ta
18da0 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  ble name,.** the
18db0 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e   table type ("in
18dc0 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29  dex" or "table")
18dd0 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61   and SQL to crea
18de0 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  te the table..**
18df0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
18e00 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20  ould print text 
18e10 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65  sufficient to re
18e20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
18e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18e40 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f  dump_callback(vo
18e50 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
18e60 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
18e70 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73  , char **azNotUs
18e80 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
18e90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
18ea0 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
18eb0 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
18ec0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
18ed0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
18ee0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41  (ShellState *)pA
18ef0 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg;..  UNUSED_PA
18f00 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65  RAMETER(azNotUse
18f10 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  d);.  if( nArg!=
18f20 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20  3 || azArg==0 ) 
18f30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62  return 0;.  zTab
18f40 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
18f50 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31   zType = azArg[1
18f60 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72  ];.  zSql = azAr
18f70 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72  g[2];..  if( str
18f80 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
18f90 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
18fa0 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
18fb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c  ntf(p->out, "DEL
18fc0 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
18fd0 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20  sequence;\n");. 
18fe0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
18ff0 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
19000 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
19010 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  e)==0 ){.    raw
19020 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19030 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
19040 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
19050 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
19060 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
19070 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
19080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
19090 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
190a0 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
190b0 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
190c0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
190d0 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21  *zIns;.    if( !
190e0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
190f0 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
19100 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
19110 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
19120 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20  chema=ON;\n");. 
19130 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
19140 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
19150 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c  }.    zIns = sql
19160 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
19170 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
19180 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28  O sqlite_master(
19190 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
191a0 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29  me,rootpage,sql)
191b0 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53  ".       "VALUES
191c0 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25  ('table','%q','%
191d0 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20  q',0,'%q');",.  
191e0 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61       zTable, zTa
191f0 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ble, zSql);.    
19200 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
19210 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
19220 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
19230 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
19240 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
19250 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d  {.    printSchem
19260 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53  aLine(p->out, zS
19270 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a  ql, ";\n");.  }.
19280 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
19290 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
192a0 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
192b0 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
192c0 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b  hellText sTable;
192d0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
192e0 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  l;.    int i;.  
192f0 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73    char *savedDes
19300 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  tTable;.    int 
19310 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20  savedMode;..    
19320 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c  azCol = tableCol
19330 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c  umnList(p, zTabl
19340 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  e);.    if( azCo
19350 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
19360 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
19370 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
19380 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
19390 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
193a0 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
193b0 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
193c0 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
193d0 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
193e0 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
193f0 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
19400 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69  " ... */.    ini
19410 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  tText(&sTable);.
19420 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
19430 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  sTable, zTable, 
19440 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
19450 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72  ));.    /* If pr
19460 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77  eserving the row
19470 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e  id, add a column
19480 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20   list after the 
19490 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20  table name..    
194a0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
194b0 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  s:  "INSERT INTO
194c0 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63   tab(rowid,a,b,c
194d0 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e  ,...) VALUES(...
194e0 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61  )".    ** instea
194f0 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22  d of the usual "
19500 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20  INSERT INTO tab 
19510 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20  VALUES(...)"..  
19520 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43    */.    if( azC
19530 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
19540 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
19550 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20  e, "(", 0);.    
19560 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19570 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  able, azCol[0], 
19580 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
19590 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
195a0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
195b0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
195c0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
195d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
195e0 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  le, azCol[i], qu
195f0 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
19600 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
19610 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
19620 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20  able, ")", 0);. 
19630 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69     }..    /* Bui
19640 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ld an appropriat
19650 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19660 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  nt */.    initTe
19670 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
19680 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
19690 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22  elect, "SELECT "
196a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
196b0 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
196c0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
196d0 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ect, azCol[0], 0
196e0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
196f0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
19700 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
19710 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
19720 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
19730 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
19740 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ect, azCol[i], q
19750 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
19760 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
19770 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  zCol[i+1] ){.   
19780 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
19790 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
197a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
197b0 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  .    freeColumnL
197c0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
197d0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
197e0 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30  ect, " FROM ", 0
197f0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
19800 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62  t(&sSelect, zTab
19810 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
19820 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76  able));..    sav
19830 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d  edDestTable = p-
19840 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  >zDestTable;.   
19850 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e   savedMode = p->
19860 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  mode;.    p->zDe
19870 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65  stTable = sTable
19880 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  .z;.    p->mode 
19890 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  = p->cMode = MOD
198a0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  E_Insert;.    rc
198b0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c   = shell_exec(p,
198c0 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
198d0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
198e0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )==SQLITE_CORRUP
198f0 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  T ){.      raw_p
19900 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19910 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19920 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19930 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67  \n");.      togg
19940 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d  leSelectOrder(p-
19950 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c  >db);.      shel
19960 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63  l_exec(p, sSelec
19970 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 74  t.z, 0);.      t
19980 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72  oggleSelectOrder
19990 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  (p->db);.    }. 
199a0 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
199b0 20 3d 20 73 61 76 65 64 44 65 73 74 54 61 62 6c   = savedDestTabl
199c0 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  e;.    p->mode =
199d0 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20   savedMode;.    
199e0 66 72 65 65 54 65 78 74 28 26 73 54 61 62 6c 65  freeText(&sTable
199f0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  );.    freeText(
19a00 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69  &sSelect);.    i
19a10 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b  f( rc ) p->nErr+
19a20 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
19a30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  0;.}../*.** Run 
19a40 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d  zQuery.  Use dum
19a50 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20  p_callback() as 
19a60 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
19a70 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20  tine so that.** 
19a80 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19a90 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f 75  the query are ou
19aa0 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61 74  tput as SQL stat
19ab0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
19ac0 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54 45   we get a SQLITE
19ad0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20  _CORRUPT error, 
19ae0 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79 20  rerun the query 
19af0 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a  after appending.
19b00 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  ** "ORDER BY row
19b10 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65 20  id DESC" to the 
19b20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  end..*/.static i
19b30 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75  nt run_schema_du
19b40 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c  mp_query(.  Shel
19b50 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e  lState *p,.  con
19b60 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a  st char *zQuery.
19b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
19b80 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
19b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
19ba0 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  ec(p->db, zQuery
19bb0 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
19bc0 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   p, &zErr);.  if
19bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  ( rc==SQLITE_COR
19be0 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72  RUPT ){.    char
19bf0 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c   *zQ2;.    int l
19c00 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51  en = strlen30(zQ
19c10 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70  uery);.    raw_p
19c20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
19c30 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f  ****** CORRUPTIO
19c40 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f  N ERROR *******/
19c50 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  \n");.    if( zE
19c60 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
19c70 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19c80 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a  "/****** %s ****
19c90 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
19ca0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19cb0 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a  e(zErr);.      z
19cc0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Err = 0;.    }. 
19cd0 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28     zQ2 = malloc(
19ce0 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20   len+100 );.    
19cf0 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74  if( zQ2==0 ) ret
19d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
19d10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e  te3_snprintf(len
19d20 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f  +100, zQ2, "%s O
19d30 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45  RDER BY rowid DE
19d40 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20  SC", zQuery);.  
19d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19d60 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20  xec(p->db, zQ2, 
19d70 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
19d80 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
19d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74  ( rc ){.      ut
19da0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
19db0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52  , "/****** ERROR
19dc0 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  : %s ******/\n",
19dd0 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73   zErr);.    }els
19de0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19df0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
19e00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
19e10 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
19e20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20  free(zQ2);.  }. 
19e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e40 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68 65 6c  *.** Text of hel
19e50 70 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a 0a 2a  p messages..**.*
19e60 2a 20 54 68 65 20 68 65 6c 70 20 74 65 78 74 20  * The help text 
19e70 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64  for each individ
19e80 75 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65 67 69  ual command begi
19e90 6e 73 20 77 69 74 68 20 61 20 6c 69 6e 65 20 74  ns with a line t
19ea0 68 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77 69  hat starts.** wi
19eb0 74 68 20 22 2e 22 2e 20 20 53 75 62 73 65 71 75  th ".".  Subsequ
19ec0 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 73 75  ent lines are su
19ed0 70 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66 6f 72  pplimental infor
19ee0 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  mation..**.** Th
19ef0 65 72 65 20 6d 75 73 74 20 62 65 20 74 77 6f 20  ere must be two 
19f00 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 62  or more spaces b
19f10 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
19f20 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 6e  f the command an
19f30 64 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f  d the.** start o
19f40 66 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  f the descriptio
19f50 6e 20 6f 66 20 77 68 61 74 20 74 68 61 74 20 63  n of what that c
19f60 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a 2f 0a  ommand does..*/.
19f70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
19f80 72 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20 3d 20  r *(azHelp[]) = 
19f90 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
19fa0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
19fb0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19fc0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
19fd0 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69 76  ABLE).  ".archiv
19fe0 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20  e ...           
19ff0 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63    Manage SQL arc
1a000 68 69 76 65 73 22 2c 0a 20 20 22 20 20 20 45 61  hives",.  "   Ea
1a010 63 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ch command must 
1a020 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
1a030 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a040 67 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  g options:",.  "
1a050 20 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74       -c, --creat
1a060 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1a070 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63  Create a new arc
1a080 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d  hive",.  "     -
1a090 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20  u, --update     
1a0a0 20 20 20 20 20 20 20 20 20 20 41 64 64 20 66 69            Add fi
1a0b0 6c 65 73 20 6f 72 20 75 70 64 61 74 65 20 66 69  les or update fi
1a0c0 6c 65 73 20 77 69 74 68 20 63 68 61 6e 67 65 64  les with changed
1a0d0 20 6d 74 69 6d 65 22 2c 0a 20 20 22 20 20 20 20   mtime",.  "    
1a0e0 20 2d 69 2c 20 2d 2d 69 6e 73 65 72 74 20 20 20   -i, --insert   
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b 65              Like
1a100 20 2d 75 20 62 75 74 20 61 6c 77 61 79 73 20 61   -u but always a
1a110 64 64 20 65 76 65 6e 20 69 66 20 6d 74 69 6d 65  dd even if mtime
1a120 20 75 6e 63 68 61 6e 67 65 64 22 2c 0a 20 20 22   unchanged",.  "
1a130 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20       -t, --list 
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  List contents of
1a160 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
1a170 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74     -x, --extract
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1a190 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d  tract files from
1a1a0 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
1a1b0 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   Optional argume
1a1c0 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d  nts:",.  "     -
1a1d0 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20  v, --verbose    
1a1e0 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1a1f0 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73  each filename as
1a200 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64   it is processed
1a210 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49  ",.  "     -f FI
1a220 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20  LE, --file FILE 
1a230 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e        Operate on
1a240 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64   archive FILE (d
1a250 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e  efault is curren
1a260 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20  t db)",.  "     
1a270 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e  -a FILE, --appen
1a280 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61  d FILE     Opera
1a290 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65  te on FILE opene
1a2a0 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64  d using the apnd
1a2b0 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20  vfs VFS",.  "   
1a2c0 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65    -C DIR, --dire
1a2d0 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61  ctory DIR    Cha
1a2e0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
1a2f0 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74   DIR to read/ext
1a300 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22  ract files",.  "
1a310 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75       -n, --dryru
1a320 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1a330 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61  Show the SQL tha
1a340 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63  t would have occ
1a350 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78  urred",.  "   Ex
1a360 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20  amples:",.  "   
1a370 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76    .ar -cf archiv
1a380 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23  e.sar foo bar  #
1a390 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e   Create archive.
1a3a0 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  sar from files f
1a3b0 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22  oo and bar",.  "
1a3c0 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63       .ar -tf arc
1a3d0 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
1a3e0 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73    # List members
1a3f0 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22   of archive.sar"
1a400 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78  ,.  "     .ar -x
1a410 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  vf archive.sar  
1a420 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65         # Verbose
1a430 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73  ly extract files
1a440 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61   from archive.sa
1a450 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c  r",.  "   See al
1a460 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68  so:",.  "      h
1a470 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
1a480 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f  /cli.html#sqlar_
1a490 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22  archive_support"
1a4a0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
1a4b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a4c0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
1a4d0 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
1a4e0 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68         Show auth
1a4f0 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73  orizer callbacks
1a500 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  ",.#endif.  ".ba
1a510 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
1a520 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
1a530 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
1a540 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ") to FILE",.  "
1a550 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20         --append 
1a560 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1a570 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20  he appendvfs",. 
1a580 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63   "       --async
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1a5a0 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f  te to FILE witho
1a5b0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ut a journal and
1a5c0 20 77 69 74 68 6f 75 74 20 66 73 79 6e 63 28 29   without fsync()
1a5d0 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f  ",.  ".bail on|o
1a5e0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ff             S
1a5f0 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
1a600 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66  g an error.  Def
1a610 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62  ault OFF",.  ".b
1a620 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20  inary on|off    
1a630 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61         Turn bina
1a640 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20  ry output on or 
1a650 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  off.  Default OF
1a660 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45 43  F",.  ".cd DIREC
1a670 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 20 20  TORY            
1a680 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69  Change the worki
1a690 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ng directory to 
1a6a0 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e  DIRECTORY",.  ".
1a6b0 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20  changes on|off  
1a6c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d          Show num
1a6d0 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e  ber of rows chan
1a6e0 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20 22  ged by SQL",.  "
1a6f0 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20  .check GLOB     
1a700 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
1a710 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
1a720 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
1a730 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f   match",.  ".clo
1a740 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20  ne NEWDB        
1a750 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20       Clone data 
1a760 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20  into NEWDB from 
1a770 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
1a780 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74 61  abase",.  ".data
1a790 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
1a7a0 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
1a7b0 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
1a7c0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 22 2c  ched databases",
1a7d0 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f  .  ".dbconfig ?o
1a7e0 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73  p? ?val?     Lis
1a7f0 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69  t or change sqli
1a800 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20  te3_db_config() 
1a810 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62  options",.  ".db
1a820 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20  info ?DB?       
1a830 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75        Show statu
1a840 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  s information ab
1a850 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
1a860 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42  ",.  ".dump ?TAB
1a870 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20 52  LE? ...        R
1a880 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62 61  ender all databa
1a890 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53 51  se content as SQ
1a8a0 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e  L",.  "   Option
1a8b0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70  s:",.  "     --p
1a8c0 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 20  reserve-rowids  
1a8d0 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57 49      Include ROWI
1a8e0 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  D values in the 
1a8f0 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1a900 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20 20   --newlines     
1a910 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e          Allow un
1a920 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65 20  escaped newline 
1a930 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f 75  characters in ou
1a940 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41 42  tput",.  "   TAB
1a950 4c 45 20 69 73 20 61 20 4c 49 4b 45 20 70 61 74  LE is a LIKE pat
1a960 74 65 72 6e 20 66 6f 72 20 74 68 65 20 74 61 62  tern for the tab
1a970 6c 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a 20 20  les to dump",.  
1a980 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20  ".echo on|off   
1a990 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
1a9a0 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
1a9b0 72 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71 70 20  r off",.  ".eqp 
1a9c0 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e 2e 20  on|off|full|... 
1a9d0 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69      Enable or di
1a9e0 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20  sable automatic 
1a9f0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1aa00 41 4e 22 2c 0a 20 20 22 20 20 20 4f 74 68 65 72  AN",.  "   Other
1aa10 20 4d 6f 64 65 73 3a 22 2c 0a 23 69 66 64 65 66   Modes:",.#ifdef
1aa20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1aa30 22 20 20 20 20 20 20 74 65 73 74 20 20 20 20 20  "      test     
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1aa50 77 20 72 61 77 20 45 58 50 4c 41 49 4e 20 51 55  w raw EXPLAIN QU
1aa60 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75 74 22  ERY PLAN output"
1aa70 2c 0a 20 20 22 20 20 20 20 20 20 74 72 61 63 65  ,.  "      trace
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62   Like \"full\" b
1aaa0 75 74 20 61 6c 73 6f 20 65 6e 61 62 6c 65 20 5c  ut also enable \
1aab0 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  "PRAGMA vdbe_tra
1aac0 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a 20 20  ce\"",.#endif.  
1aad0 22 20 20 20 20 20 20 74 72 69 67 67 65 72 20 20  "      trigger  
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b               Lik
1aaf0 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20 61  e \"full\" but a
1ab00 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67 65 72  lso show trigger
1ab10 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20 22 2e   bytecode",.  ".
1ab20 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20 20  excel           
1ab30 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79 20          Display 
1ab40 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e 65  the output of ne
1ab50 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20  xt command in a 
1ab60 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20  spreadsheet",.  
1ab70 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20 20 20  ".exit ?CODE?   
1ab80 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74            Exit t
1ab90 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74 68  his program with
1aba0 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f 44   return-code COD
1abb0 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74 20 20  E",.  ".expert  
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75  EXPERIMENTAL. Su
1abe0 67 67 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f  ggest indexes fo
1abf0 72 20 73 70 65 63 69 66 69 65 64 20 71 75 65 72  r specified quer
1ac00 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75 73 65  ies",./* Because
1ac10 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f   explain mode co
1ac20 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63  mes on automatic
1ac30 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e  ally now, the ".
1ac40 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a  explain" mode.**
1ac50 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
1ac60 20 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e   the help screen
1ac70 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73  .  It is still s
1ac80 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67  upported for leg
1ac90 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a  acy, however */.
1aca0 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c  /*".explain ?on|
1acb0 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75 72 6e  off|auto?   Turn
1acc0 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 20   EXPLAIN output 
1acd0 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f  mode on or off o
1ace0 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 22 2c  r to automatic",
1acf0 2a 2f 0a 20 20 22 2e 66 69 6c 65 63 74 72 6c 20  */.  ".filectrl 
1ad00 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 20 52  CMD ...        R
1ad10 75 6e 20 76 61 72 69 6f 75 73 20 73 71 6c 69 74  un various sqlit
1ad20 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
1ad30 29 20 6f 70 65 72 61 74 69 6f 6e 73 22 2c 0a 20  ) operations",. 
1ad40 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 52 75 6e               Run
1ad60 20 5c 22 2e 66 69 6c 65 63 74 72 6c 5c 22 20 77   \".filectrl\" w
1ad70 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
1ad80 20 66 6f 72 20 64 65 74 61 69 6c 73 22 2c 0a 20   for details",. 
1ad90 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d   ".fullschema ?-
1ada0 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f 77 20  -indent?   Show 
1adb0 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63  schema and the c
1adc0 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65  ontent of sqlite
1add0 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c 0a 20  _stat tables",. 
1ade0 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66   ".headers on|of
1adf0 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
1ae00 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65  display of heade
1ae10 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20  rs on or off",. 
1ae20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f   ".help ?-all? ?
1ae30 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f 77 20  PATTERN?   Show 
1ae40 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 50 41  help text for PA
1ae50 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f  TTERN",.  ".impo
1ae60 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20  rt FILE TABLE   
1ae70 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20      Import data 
1ae80 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54  from FILE into T
1ae90 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66 20 53  ABLE",.#ifndef S
1aea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f  QLITE_OMIT_TEST_
1aeb0 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f  CONTROL.  ".impo
1aec0 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c 45  ster INDEX TABLE
1aed0 20 20 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73      Create impos
1aee0 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20  ter table TABLE 
1aef0 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 22 2c  on index INDEX",
1af00 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65  .#endif.  ".inde
1af10 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  xes ?TABLE?     
1af20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f      Show names o
1af30 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20 22 20  f indexes",.  " 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
1af60 4c 45 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  LE is specified,
1af70 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78   only show index
1af80 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20 20 20  es for",.  "    
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 20 20 20 20 20 20 20 74 61 62 6c 65 73 20 6d 61         tables ma
1afb0 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75 73 69  tching TABLE usi
1afc0 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ng the LIKE oper
1afd0 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66 20 53  ator.",.#ifdef S
1afe0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
1aff0 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65  RACE.  ".iotrace
1b000 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1b010 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67   Enable I/O diag
1b020 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74  nostic logging t
1b030 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69 66 0a  o FILE",.#endif.
1b040 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54    ".limit ?LIMIT
1b050 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69 73 70  ? ?VAL?     Disp
1b060 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74 68  lay or change th
1b070 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53 51  e value of an SQ
1b080 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20 20 22  LITE_LIMIT",.  "
1b090 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20  .lint OPTIONS   
1b0a0 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74 20           Report 
1b0b0 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61  potential schema
1b0c0 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22 20 20   issues.",.  "  
1b0d0 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1b0e0 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e  "        fkey-in
1b0f0 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d  dexes     Find m
1b100 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b  issing foreign k
1b110 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23 69 66  ey indexes",.#if
1b120 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b130 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
1b140 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45    ".load FILE ?E
1b150 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f 61 64  NTRY?       Load
1b160 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69   an extension li
1b170 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66 0a 20  brary",.#endif. 
1b180 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20   ".log FILE|off 
1b190 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1b1a0 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  logging on or of
1b1b0 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20  f.  FILE can be 
1b1c0 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22 2c 0a  stderr/stdout",.
1b1d0 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54    ".mode MODE ?T
1b1e0 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65 74 20  ABLE?       Set 
1b1f0 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a 20 20  output mode",.  
1b200 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20  "   MODE is one 
1b210 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 73  of:",.  "     as
1b220 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72  cii    Columns/r
1b230 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79  ows delimited by
1b240 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 22 2c   0x1F and 0x1E",
1b250 0a 20 20 22 20 20 20 20 20 63 73 76 20 20 20 20  .  "     csv    
1b260 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
1b270 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20  d values",.  "  
1b280 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74     column   Left
1b290 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73  -aligned columns
1b2a0 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29 22  .  (See .width)"
1b2b0 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c 20 20  ,.  "     html  
1b2c0 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20     HTML <table> 
1b2d0 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20 69  code",.  "     i
1b2e0 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65  nsert   SQL inse
1b2f0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  rt statements fo
1b300 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20  r TABLE",.  "   
1b310 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76    line     One v
1b320 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22 2c 0a  alue per line",.
1b330 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20 20    "     list    
1b340 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65   Values delimite
1b350 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20 20 22  d by \"|\"",.  "
1b360 20 20 20 20 20 71 75 6f 74 65 20 20 20 20 45 73       quote    Es
1b370 63 61 70 65 20 61 6e 73 77 65 72 73 20 61 73 20  cape answers as 
1b380 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20 20 20  for SQL",.  "   
1b390 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d 73    tabs     Tab-s
1b3a0 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 22  eparated values"
1b3b0 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20 20 20  ,.  "     tcl   
1b3c0 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d     TCL list elem
1b3d0 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76  ents",.  ".nullv
1b3e0 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
1b3f0 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e     Use STRING in
1b400 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76   place of NULL v
1b410 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e 63 65  alues",.  ".once
1b420 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20 20   (-e|-x|FILE)   
1b430 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74      Output for t
1b440 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d  he next SQL comm
1b450 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45  and only to FILE
1b460 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46 49  ",.  "     If FI
1b470 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 27  LE begins with '
1b480 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61 73 20  |' then open as 
1b490 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20 20 20  a pipe",.  "    
1b4a0 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a 22   Other options:"
1b4b0 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65 20 20  ,.  "       -e  
1b4c0 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65 6d 20    Invoke system 
1b4d0 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a 20 20  text editor",.  
1b4e0 22 20 20 20 20 20 20 20 2d 78 20 20 20 20 4f 70  "       -x    Op
1b4f0 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64 73 68  en in a spreadsh
1b500 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f  eet",.  ".open ?
1b510 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20  OPTIONS? ?FILE? 
1b520 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67    Close existing
1b530 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
1b540 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20 22 20  open FILE",.  " 
1b550 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1b560 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70 70 65   "        --appe
1b570 6e 64 20 20 20 20 20 20 20 20 55 73 65 20 61 70  nd        Use ap
1b580 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70 65 6e  pendvfs to appen
1b590 64 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  d database to th
1b5a0 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22 2c 0a  e end of FILE",.
1b5b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b5c0 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
1b5d0 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 64 65  .  "        --de
1b5e0 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f 61 64  serialize   Load
1b5f0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75 73 65   into memory use
1b600 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
1b610 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20 22 20  rialize()",.  " 
1b620 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62 20 20         --hexdb  
1b630 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68 65 20         Load the 
1b640 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62 74 6f  output of \"dbto
1b650 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e 2d 6d  txt\" as an in-m
1b660 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 22 2c  emory database",
1b670 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6d 61  .  "        --ma
1b680 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61 78 69  xsize N     Maxi
1b690 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d 68  mum size for --h
1b6a0 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65 72 69  exdb or --deseri
1b6b0 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73 65 22  alized database"
1b6c0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20  ,.#endif.  "    
1b6d0 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20 20      --new       
1b6e0 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46      Initialize F
1b6f0 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ILE to an empty 
1b700 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20  database",.  "  
1b710 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79        --readonly
1b720 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c 45 20        Open FILE 
1b730 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20  readonly",.  "  
1b740 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20 20 20        --zip     
1b750 20 20 20 20 20 20 46 49 4c 45 20 69 73 20 61 20        FILE is a 
1b760 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a 20 20  ZIP archive",.  
1b770 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20  ".output ?FILE? 
1b780 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f            Send o
1b790 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72  utput to FILE or
1b7a0 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c 45 20   stdout if FILE 
1b7b0 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20 22  is omitted",.  "
1b7c0 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65 67       If FILE beg
1b7d0 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68 65  ins with '|' the
1b7e0 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61 20 70  n open it as a p
1b7f0 69 70 65 2e 22 2c 0a 20 20 22 2e 70 61 72 61 6d  ipe.",.  ".param
1b800 65 74 65 72 20 43 4d 44 20 2e 2e 2e 20 20 20 20  eter CMD ...    
1b810 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 70 61     Manage SQL pa
1b820 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73  rameter bindings
1b830 22 2c 0a 20 20 22 20 20 20 63 6c 65 61 72 20 20  ",.  "   clear  
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 45 72 61 73 65 20 61 6c 6c 20 62 69 6e 64 69   Erase all bindi
1b860 6e 67 73 22 2c 0a 20 20 22 20 20 20 69 6e 69 74  ngs",.  "   init
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74      Initialize t
1b890 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68  he TEMP table th
1b8a0 61 74 20 68 6f 6c 64 73 20 62 69 6e 64 69 6e 67  at holds binding
1b8b0 73 22 2c 0a 20 20 22 20 20 20 6c 69 73 74 20 20  s",.  "   list  
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 4c 69 73 74 20 74 68 65 20 63 75 72 72 65    List the curre
1b8e0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e  nt parameter bin
1b8f0 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 73 65  dings",.  "   se
1b900 74 20 50 41 52 41 4d 45 54 45 52 20 56 41 4c 55  t PARAMETER VALU
1b910 45 20 20 20 20 20 47 69 76 65 6e 20 53 51 4c 20  E     Given SQL 
1b920 70 61 72 61 6d 65 74 65 72 20 50 41 52 41 4d 45  parameter PARAME
1b930 54 45 52 20 61 20 76 61 6c 75 65 20 6f 66 20 56  TER a value of V
1b940 41 4c 55 45 22 2c 0a 20 20 22 20 20 20 20 20 20  ALUE",.  "      
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 50 41 52 41 4d 45 54 45 52 20 73       PARAMETER s
1b970 68 6f 75 6c 64 20 73 74 61 72 74 20 77 69 74 68  hould start with
1b980 20 27 24 27 2c 20 27 3a 27 2c 20 27 40 27 2c 20   '$', ':', '@', 
1b990 6f 72 20 27 3f 27 22 2c 0a 20 20 22 20 20 20 75  or '?'",.  "   u
1b9a0 6e 73 65 74 20 50 41 52 41 4d 45 54 45 52 20 20  nset PARAMETER  
1b9b0 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 50 41         Remove PA
1b9c0 52 41 4d 45 54 45 52 20 66 72 6f 6d 20 74 68 65  RAMETER from the
1b9d0 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65 22 2c   binding table",
1b9e0 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e  .  ".print STRIN
1b9f0 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72 69  G...         Pri
1ba00 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
1ba10 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  G",.#ifndef SQLI
1ba20 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
1ba30 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e 70 72  _CALLBACK.  ".pr
1ba40 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20 20 20  ogress N        
1ba50 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70 72 6f        Invoke pro
1ba60 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 61 66  gress handler af
1ba70 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70 63 6f  ter every N opco
1ba80 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c 69  des",.  "   --li
1ba90 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20 20 20  mit N           
1baa0 20 20 20 20 20 20 49 6e 74 65 72 72 75 70 74 20        Interrupt 
1bab0 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65 73 73  after N progress
1bac0 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20 22   callbacks",.  "
1bad0 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20 20     --once       
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f 20               Do 
1baf0 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
1bb00 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65 72 72   progress interr
1bb10 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71 75  upt",.  "   --qu
1bb20 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20 20 20  iet|-q          
1bb30 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75 74 20        No output 
1bb40 65 78 63 65 70 74 20 61 74 20 69 6e 74 65 72 72  except at interr
1bb50 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d 72  upts",.  "   --r
1bb60 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
1bb70 20 20 20 20 20 20 20 52 65 73 65 74 20 74 68 65         Reset the
1bb80 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63 68 20   count for each 
1bb90 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65 72 72  input and interr
1bba0 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  upt",.#endif.  "
1bbb0 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e  .prompt MAIN CON
1bbc0 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61 63 65  TINUE    Replace
1bbd0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72   the standard pr
1bbe0 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75 69 74  ompts",.  ".quit
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72      Exit this pr
1bc10 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61 64  ogram",.  ".read
1bc20 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
1bc30 20 20 20 20 52 65 61 64 20 69 6e 70 75 74 20 66      Read input f
1bc40 72 6f 6d 20 46 49 4c 45 22 2c 0a 23 69 66 20 21  rom FILE",.#if !
1bc50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bc60 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1bc70 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1bc80 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
1bc90 45 5f 56 54 41 42 29 0a 20 20 22 2e 72 65 63 6f  E_VTAB).  ".reco
1bca0 76 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ver             
1bcb0 20 20 20 20 52 65 63 6f 76 65 72 20 61 73 20 6d      Recover as m
1bcc0 75 63 68 20 64 61 74 61 20 61 73 20 70 6f 73 73  uch data as poss
1bcd0 69 62 6c 65 20 66 72 6f 6d 20 63 6f 72 72 75 70  ible from corrup
1bce0 74 20 64 62 2e 22 2c 0a 23 65 6e 64 69 66 0a 20  t db.",.#endif. 
1bcf0 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20   ".restore ?DB? 
1bd00 46 49 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f  FILE       Resto
1bd10 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42  re content of DB
1bd20 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
1bd30 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a  \") from FILE",.
1bd40 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20    ".save FILE   
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
1bd60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
1bd70 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c  base into FILE",
1bd80 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f  .  ".scanstats o
1bd90 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75 72  n|off        Tur
1bda0 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  n sqlite3_stmt_s
1bdb0 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72  canstatus() metr
1bdc0 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ics on or off",.
1bdd0 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54    ".schema ?PATT
1bde0 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77  ERN?        Show
1bdf0 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
1be00 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20  ements matching 
1be10 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20  PATTERN",.  "   
1be20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1be30 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e           --inden
1be40 74 20 20 20 20 20 20 20 20 20 20 20 20 54 72 79  t            Try
1be50 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74   to pretty-print
1be60 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20   the schema",.  
1be70 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49  ".selftest ?OPTI
1be80 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65  ONS?      Run te
1be90 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  sts defined in t
1bea0 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  he SELFTEST tabl
1beb0 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f  e",.  "    Optio
1bec0 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ns:",.  "       
1bed0 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  --init          
1bee0 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65       Create a ne
1bef0 77 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  w SELFTEST table
1bf00 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20  ",.  "       -v 
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74    Verbose output
1bf30 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72  ",.  ".separator
1bf40 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43   COL ?ROW?     C
1bf50 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e  hange the column
1bf60 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74   and row separat
1bf70 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65  ors",.#if define
1bf80 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1bf90 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73  SESSION).  ".ses
1bfa0 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20  sion ?NAME? CMD 
1bfb0 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63  ...  Create or c
1bfc0 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22  ontrol sessions"
1bfd0 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61  ,.  "   Subcomma
1bfe0 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61  nds:",.  "     a
1bff0 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20 20  ttach TABLE     
1c000 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20 54          Attach T
1c010 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63  ABLE",.  "     c
1c020 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20  hangeset FILE   
1c030 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
1c040 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46  changeset into F
1c050 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c  ILE",.  "     cl
1c060 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
1c070 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65         Close one
1c080 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20   session",.  "  
1c090 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45     enable ?BOOLE
1c0a0 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74 20  AN?         Set 
1c0b0 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e 61  or query the ena
1c0c0 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20  ble bit",.  "   
1c0d0 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e    filter GLOB...
1c0e0 20 20 20 20 20 20 20 20 20 20 20 52 65 6a 65 63             Rejec
1c0f0 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  t tables matchin
1c100 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20  g GLOBs",.  "   
1c110 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c    indirect ?BOOL
1c120 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20  EAN?       Mark 
1c130 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e 64  or query the ind
1c140 69 72 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20  irect status",. 
1c150 20 22 20 20 20 20 20 69 73 65 6d 70 74 79 20 20   "     isempty  
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74 68  Query whether th
1c180 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70  e session is emp
1c190 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73  ty",.  "     lis
1c1a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c1b0 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65        List curre
1c1c0 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
1c1d0 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20  n names",.  "   
1c1e0 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20    open DB NAME  
1c1f0 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20             Open 
1c200 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e  a new session on
1c210 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61   DB",.  "     pa
1c220 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20 20  tchset FILE     
1c230 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20 70         Write a p
1c240 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c  atchset into FIL
1c250 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41  E",.  "   If ?NA
1c260 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20  ME? is omitted, 
1c270 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 65  the first define
1c280 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65  d session is use
1c290 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  d.",.#endif.  ".
1c2a0 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20  sha3sum ...     
1c2b0 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20          Compute 
1c2c0 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20 64  a SHA3 hash of d
1c2d0 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22  atabase content"
1c2e0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1c2f0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  :",.  "      --s
1c300 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20 20  chema           
1c310 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65     Also hash the
1c320 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c330 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20  able",.  "      
1c340 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20 20 20  --sha3-224      
1c350 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1c360 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d  a3-224 algorithm
1c370 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1c380 61 33 2d 32 35 36 20 20 20 20 20 20 20 20 20 20  a3-256          
1c390 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 32    Use the sha3-2
1c3a0 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54  56 algorithm.  T
1c3b0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
1c3c0 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  lt.",.  "      -
1c3d0 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20 20 20  -sha3-384       
1c3e0 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61       Use the sha
1c3f0 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22  3-384 algorithm"
1c400 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61  ,.  "      --sha
1c410 33 2d 35 31 32 20 20 20 20 20 20 20 20 20 20 20  3-512           
1c420 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 35 31   Use the sha3-51
1c430 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20  2 algorithm",.  
1c440 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61  "    Any other a
1c450 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b  rgument is a LIK
1c460 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61  E pattern for ta
1c470 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23  bles to hash",.#
1c480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1c490 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
1c4a0 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e  shell CMD ARGS..
1c4b0 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20  .       Run CMD 
1c4c0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
1c4d0 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64  tem shell",.#end
1c4e0 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20  if.  ".show     
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1c500 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
1c510 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f  values for vario
1c520 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20  us settings",.  
1c530 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f  ".stats ?on|off?
1c540 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73            Show s
1c550 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61  tats or turn sta
1c560 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23  ts on or off",.#
1c570 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
1c580 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
1c590 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e  system CMD ARGS.
1c5a0 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20  ..      Run CMD 
1c5b0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
1c5c0 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64  tem shell",.#end
1c5d0 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54  if.  ".tables ?T
1c5e0 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c  ABLE?          L
1c5f0 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62  ist names of tab
1c600 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b  les matching LIK
1c610 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22  E pattern TABLE"
1c620 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e  ,.  ".testcase N
1c630 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 42 65  AME           Be
1c640 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
1c650 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74 63  output to 'testc
1c660 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20  ase-out.txt'",. 
1c670 20 22 2e 74 65 73 74 63 74 72 6c 20 43 4d 44 20   ".testctrl CMD 
1c680 2e 2e 2e 20 20 20 20 20 20 20 20 52 75 6e 20 76  ...        Run v
1c690 61 72 69 6f 75 73 20 73 71 6c 69 74 65 33 5f 74  arious sqlite3_t
1c6a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 6f 70  est_control() op
1c6b0 65 72 61 74 69 6f 6e 73 22 2c 0a 20 20 22 20 20  erations",.  "  
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 20 20 20 20 52 75 6e 20 5c 22 2e           Run \".
1c6e0 74 65 73 74 63 74 72 6c 5c 22 20 77 69 74 68 20  testctrl\" with 
1c6f0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
1c700 20 64 65 74 61 69 6c 73 22 2c 0a 20 20 22 2e 74   details",.  ".t
1c710 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
1c720 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69         Try openi
1c730 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73  ng locked tables
1c740 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63   for MS millisec
1c750 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65 72  onds",.  ".timer
1c760 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1c770 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d 65     Turn SQL time
1c780 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69  r on or off",.#i
1c790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c7a0 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61 63  T_TRACE.  ".trac
1c7b0 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20 20  e ?OPTIONS?     
1c7c0 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68 20      Output each 
1c7d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73  SQL statement as
1c7e0 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20 22   it is run",.  "
1c7f0 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20 20      FILE        
1c800 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64              Send
1c810 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 22   output to FILE"
1c820 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74 20  ,.  "    stdout 
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
1c850 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20 20  stdout",.  "    
1c860 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20 20  stderr          
1c870 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1c880 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c 0a  put to stderr",.
1c890 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20 20    "    off      
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1c8b0 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22 2c  isable tracing",
1c8c0 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e 64  .  "    --expand
1c8d0 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
1c8e0 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61 72  Expand query par
1c8f0 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65 66  ameters",.#ifdef
1c900 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
1c910 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20 20  ORMALIZE.  "    
1c920 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20 20  --normalized    
1c930 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 74          Normal t
1c940 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1c950 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  s",.#endif.  "  
1c960 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20 20    --plain       
1c970 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 53            Show S
1c980 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70 75  QL as it is inpu
1c990 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74 6d  t",.  "    --stm
1c9a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c9b0 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d 65     Trace stateme
1c9c0 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53 51  nt execution (SQ
1c9d0 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 29  LITE_TRACE_STMT)
1c9e0 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f 66  ",.  "    --prof
1c9f0 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ile             
1ca00 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65 6d    Profile statem
1ca10 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52 41  ents (SQLITE_TRA
1ca20 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20 20  CE_PROFILE)",.  
1ca30 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20 20  "    --row      
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1ca50 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51 4c  ce each row (SQL
1ca60 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22 2c  ITE_TRACE_ROW)",
1ca70 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65 20  .  "    --close 
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Trace connection
1caa0 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f 54   close (SQLITE_T
1cab0 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23 65  RACE_CLOSE)",.#e
1cac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1cad0 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20 22  MIT_TRACE */.  "
1cae0 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20 20  .vfsinfo ?AUX?  
1caf0 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61           Informa
1cb00 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74  tion about the t
1cb10 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c 0a 20  op-level VFS",. 
1cb20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20 20   ".vfslist      
1cb30 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
1cb40 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46  all available VF
1cb50 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e 61 6d  Ses",.  ".vfsnam
1cb60 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  e ?AUX?         
1cb70 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65    Print the name
1cb80 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61 63   of the VFS stac
1cb90 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20 4e 55  k",.  ".width NU
1cba0 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 20 20  M1 NUM2 ...     
1cbb0 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68  Set column width
1cbc0 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22  s for \"column\"
1cbd0 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20   mode",.  "     
1cbe0 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  Negative values 
1cbf0 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22 2c 0a  right-justify",.
1cc00 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
1cc10 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a 2a   help text..**.*
1cc20 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73 63 72  * zPattern descr
1cc30 69 62 65 73 20 74 68 65 20 73 65 74 20 6f 66 20  ibes the set of 
1cc40 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77 68 69  commands for whi
1cc50 63 68 20 68 65 6c 70 20 74 65 78 74 20 69 73 20  ch help text is 
1cc60 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49 66 20  provided..** If 
1cc70 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55 4c 4c  zPattern is NULL
1cc80 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c 20  , then show all 
1cc90 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e  commands, but on
1cca0 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d 6c 69  ly give a one-li
1ccb0 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 69 6f  ne.** descriptio
1ccc0 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a 2a  n of each..**.**
1ccd0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cce0 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e 0a 2a  er of matches..*
1ccf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f  /.static int sho
1cd00 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74 2c  wHelp(FILE *out,
1cd10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1cd20 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20 69 20  ttern){.  int i 
1cd30 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 30  = 0;.  int j = 0
1cd40 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
1cd50 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20 20 69   char *zPat;.  i
1cd60 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 0a 20  f( zPattern==0. 
1cd70 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d    || zPattern[0]
1cd80 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74 72 63  =='0'.   || strc
1cd90 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 22  mp(zPattern,"-a"
1cda0 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 63 6d  )==0.   || strcm
1cdb0 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 6c 6c  p(zPattern,"-all
1cdc0 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  ")==0.  ){.    /
1cdd0 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61  * Show all comma
1cde0 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 6f 6e  nds, but only on
1cdf0 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d 6d 61  e line per comma
1ce00 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 50  nd */.    if( zP
1ce10 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50 61 74  attern==0 ) zPat
1ce20 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20 20 66  tern = "";.    f
1ce30 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
1ce40 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b  ize(azHelp); i++
1ce50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 48  ){.      if( azH
1ce60 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 7c  elp[i][0]=='.' |
1ce70 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20 29 7b  | zPattern[0] ){
1ce80 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1ce90 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1cea0 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20  , azHelp[i]);.  
1ceb0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1cec0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ced0 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
1cee0 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20  r commands that 
1cef0 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74 74 65  for which zPatte
1cf00 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74 20 70  rn is an exact p
1cf10 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a 50 61  refix */.    zPa
1cf20 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
1cf30 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50 61 74  ntf(".%s*", zPat
1cf40 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  tern);.    for(i
1cf50 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1cf60 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20  azHelp); i++){. 
1cf70 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cf80 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c 20 61  _strglob(zPat, a
1cf90 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b 0a  zHelp[i])==0 ){.
1cfa0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1cfb0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1cfc0 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20 20   azHelp[i]);.   
1cfd0 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20       j = i+1;.  
1cfe0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
1cff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1d000 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b  ite3_free(zPat);
1d010 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a 20 20  .    if( n ){.  
1d020 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29 7b 0a      if( n==1 ){.
1d030 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e 20          /* when 
1d040 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20 70 72  zPattern is a pr
1d050 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c 79 20  efix of exactly 
1d060 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65  one command, the
1d070 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a 20 20  n include the.  
1d080 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c 73        ** details
1d090 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64   of that command
1d0a0 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62  , which should b
1d0b0 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74 20 6a  egin at offset j
1d0c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
1d0d0 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 61  e( j<ArraySize(a
1d0e0 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48 65  zHelp)-1 && azHe
1d0f0 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b  lp[j][0]!='.' ){
1d100 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
1d110 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1d120 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a  n", azHelp[j]);.
1d130 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
1d140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d150 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 3b  .      return n;
1d160 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4c 6f  .    }.    /* Lo
1d170 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20  ok for commands 
1d180 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a 50 61  that contain zPa
1d190 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65 2e 20  ttern anywhere. 
1d1a0 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65   Show the comple
1d1b0 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74 20 6f  te.    ** text o
1d1c0 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20 74  f all commands t
1d1d0 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  hat match. */.  
1d1e0 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65 33    zPat = sqlite3
1d1f0 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73 25 25  _mprintf("%%%s%%
1d200 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  ", zPattern);.  
1d210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
1d220 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20  aySize(azHelp); 
1d230 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1d240 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e  azHelp[i][0]=='.
1d250 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20 20 20  ' ) j = i;.     
1d260 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1d270 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48 65 6c  like(zPat, azHel
1d280 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p[i], 0)==0 ){. 
1d290 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1d2a0 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
1d2b0 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20  azHelp[j]);.    
1d2c0 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72 72      while( j<Arr
1d2d0 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d 31  aySize(azHelp)-1
1d2e0 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d 5b   && azHelp[j+1][
1d2f0 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1d300 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1d310 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1d320 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48  out, "%s\n", azH
1d330 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  elp[j]);.       
1d340 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a   }.        i = j
1d350 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  ;.        n++;. 
1d360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1d380 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  at);.  }.  retur
1d390 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n n;.}../* Forwa
1d3a0 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
1d3b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65  static int proce
1d3c0 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74  ss_input(ShellSt
1d3d0 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ate *p);../*.** 
1d3e0 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1d3f0 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69   of file zName i
1d400 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
1d410 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1d420 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61  _malloc64().** a
1d430 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
1d440 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  ter to the buffe
1d450 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  r. The caller is
1d460 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1d470 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20   freeing.** the 
1d480 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  memory..**.** If
1d490 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74   parameter pnByt
1d4a0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28  e is not NULL, (
1d4b0 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74 20  *pnByte) is set 
1d4c0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1d4d0 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a   bytes.** read..
1d4e0 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e  **.** For conven
1d4f0 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72  ience, a nul-ter
1d500 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
1d510 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64 20  always appended 
1d520 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61 64  to the data read
1d530 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1d540 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  e before the buf
1d550 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  fer is returned.
1d560 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f   This byte is no
1d570 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a  t included in.**
1d580 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65   the final value
1d590 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69   of (*pnByte), i
1d5a0 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a  f applicable..**
1d5b0 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
1d5c0 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f  rned if any erro
1d5d0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1d5e0 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  . The final valu
1d5f0 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20  e of *pnByte.** 
1d600 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
1d610 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1d620 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46  atic char *readF
1d630 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
1d640 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79  zName, int *pnBy
1d650 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  te){.  FILE *in 
1d660 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
1d670 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e  rb");.  long nIn
1d680 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64  ;.  size_t nRead
1d690 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a  ;.  char *pBuf;.
1d6a0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
1d6b0 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28  turn 0;.  fseek(
1d6c0 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  in, 0, SEEK_END)
1d6d0 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28  ;.  nIn = ftell(
1d6e0 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e  in);.  rewind(in
1d6f0 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69  );.  pBuf = sqli
1d700 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49  te3_malloc64( nI
1d710 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75  n+1 );.  if( pBu
1d720 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28 69  f==0 ){ fclose(i
1d730 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a  n); return 0; }.
1d740 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28    nRead = fread(
1d750 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e  pBuf, nIn, 1, in
1d760 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  );.  fclose(in);
1d770 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20  .  if( nRead!=1 
1d780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1d790 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72  ree(pBuf);.    r
1d7a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d7b0 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20  Buf[nIn] = 0;.  
1d7c0 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
1d7d0 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65  Byte = nIn;.  re
1d7e0 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69  turn pBuf;.}..#i
1d7f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d800 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1d810 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73  ./*.** Close a s
1d820 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f  ingle OpenSessio
1d830 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c  n object and rel
1d840 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  ease all of its 
1d850 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65  associated.** re
1d860 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  sources..*/.stat
1d870 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
1d880 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f  close(OpenSessio
1d890 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20  n *pSession){.  
1d8a0 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
1d8b0 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70  session_delete(p
1d8c0 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73  Session->p);.  s
1d8d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
1d8e0 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  sion->zName);.  
1d8f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73  for(i=0; i<pSess
1d900 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b  ion->nFilter; i+
1d910 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
1d920 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61  free(pSession->a
1d930 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d  zFilter[i]);.  }
1d940 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1d950 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1d960 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53  er);.  memset(pS
1d970 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f  ession, 0, sizeo
1d980 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b  f(OpenSession));
1d990 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d9a0 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53   Close all OpenS
1d9b0 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61  ession objects a
1d9c0 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61  nd release all a
1d9d0 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72  ssociated resour
1d9e0 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ces..*/.#if defi
1d9f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1da00 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69  E_SESSION).stati
1da10 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
1da20 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74  lose_all(ShellSt
1da30 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ate *p){.  int i
1da40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1da50 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29  ->nSession; i++)
1da60 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c  {.    session_cl
1da70 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e  ose(&p->aSession
1da80 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  [i]);.  }.  p->n
1da90 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23  Session = 0;.}.#
1daa0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65  else.# define se
1dab0 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
1dac0 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1dad0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1dae0 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66  of the xFilter f
1daf0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f  unction for an o
1db00 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d  pen session.  Om
1db10 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73  it.** any tables
1db20 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73   named by ".sess
1db30 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20  ion filter" but 
1db40 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61  let all other ta
1db50 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  ble through..*/.
1db60 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1db70 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1db80 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  N).static int se
1db90 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69  ssion_filter(voi
1dba0 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63  d *pCtx, const c
1dbb0 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70  har *zTab){.  Op
1dbc0 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73  enSession *pSess
1dbd0 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69  ion = (OpenSessi
1dbe0 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  on*)pCtx;.  int 
1dbf0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1dc00 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
1dc10 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
1dc20 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
1dc30 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1dc40 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30  ter[i], zTab)==0
1dc50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1dc60 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1dc70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
1dc80 20 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74   to deduce the t
1dc90 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20  ype of file for 
1dca0 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69  zName based on i
1dcb0 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74  ts content.  Ret
1dcc0 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  urn.** one of th
1dcd0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63  e SHELL_OPEN_* c
1dce0 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  onstants..**.** 
1dcf0 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
1dd00 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73   not exist or is
1dd10 20 65 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e   empty but its n
1dd20 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61  ame looks like a
1dd30 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20   ZIP.** archive 
1dd40 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20  and the dfltZip 
1dd50 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
1dd60 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73 20  en assume it is 
1dd70 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a  a ZIP archive..*
1dd80 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
1dd90 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  ume an ordinary 
1dda0 64 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c  database regardl
1ddb0 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  ess of the filen
1ddc0 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79  ame if.** the ty
1ddd0 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74  pe cannot be det
1dde0 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e  ermined from con
1ddf0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65 64  tent..*/.int ded
1de00 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
1de10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1de20 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29 7b  e, int dfltZip){
1de30 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f 70  .  FILE *f = fop
1de40 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
1de50 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 69  .  size_t n;.  i
1de60 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50  nt rc = SHELL_OP
1de70 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68 61  EN_UNSPEC;.  cha
1de80 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
1de90 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  f( f==0 ){.    i
1dea0 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  f( dfltZip && sq
1deb0 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1dec0 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1ded0 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75  0 ){.       retu
1dee0 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  rn SHELL_OPEN_ZI
1def0 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65  PFILE;.    }else
1df00 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  {.       return 
1df10 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1df20 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  L;.    }.  }.  n
1df30 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 31   = fread(zBuf, 1
1df40 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28 20  6, 1, f);.  if( 
1df50 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==1 && memcmp(z
1df60 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f 72  Buf, "SQLite for
1df70 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20 29  mat 3", 16)==0 )
1df80 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29 3b  {.    fclose(f);
1df90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c  .    return SHEL
1dfa0 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20  L_OPEN_NORMAL;. 
1dfb0 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d 32   }.  fseek(f, -2
1dfc0 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  5, SEEK_END);.  
1dfd0 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1dfe0 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28  25, 1, f);.  if(
1dff0 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28   n==1 && memcmp(
1e000 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66 2d  zBuf, "Start-Of-
1e010 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d 3d  SQLite3-", 17)==
1e020 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 48  0 ){.    rc = SH
1e030 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
1e040 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FS;.  }else{.   
1e050 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20 53   fseek(f, -22, S
1e060 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e 20  EEK_END);.    n 
1e070 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32 32  = fread(zBuf, 22
1e080 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66 28  , 1, f);.    if(
1e090 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30 5d   n==1 && zBuf[0]
1e0a0 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b 31  ==0x50 && zBuf[1
1e0b0 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66 5b  ]==0x4b && zBuf[
1e0c0 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20 20  2]==0x05.       
1e0d0 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30 36  && zBuf[3]==0x06
1e0e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e0f0 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c  HELL_OPEN_ZIPFIL
1e100 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
1e110 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69 70   n==0 && dfltZip
1e120 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1e130 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1e140 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1e150 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
1e160 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 0a  _ZIPFILE;.    }.
1e170 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b    }.  fclose(f);
1e180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a  .  return rc;  .
1e190 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e1a0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
1e1b0 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6e 73  IZE./*.** Recons
1e1c0 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  truct an in-memo
1e1d0 72 79 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  ry database usin
1e1e0 67 20 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f  g the output fro
1e1f0 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74 22 0a  m the "dbtotxt".
1e200 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52 65 61  ** program.  Rea
1e210 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1e220 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e 7a 44  he file in p->zD
1e230 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66 20 70  bFilename.  If p
1e240 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a 2a 2a  ->zDbFilename.**
1e250 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65 61 64   is 0, then read
1e260 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69   from standard i
1e270 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nput..*/.static 
1e280 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
1e290 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c 53 74  eadHexDb(ShellSt
1e2a0 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 44  ate *p, int *pnD
1e2b0 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ata){.  unsigned
1e2c0 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a 20 20   char *a = 0;.  
1e2d0 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e 74  int nLine;.  int
1e2e0 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67   n = 0;.  int pg
1e2f0 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  sz = 0;.  int iO
1e300 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  ffset = 0;.  int
1e310 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63 3b   j, k;.  int rc;
1e320 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 75  .  FILE *in;.  u
1e330 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 5b 31 36  nsigned int x[16
1e340 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b  ];.  char zLine[
1e350 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 70 2d 3e  1000];.  if( p->
1e360 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20  zDbFilename ){. 
1e370 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 70 2d     in = fopen(p-
1e380 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 22 72  >zDbFilename, "r
1e390 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
1e3a0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
1e3b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1e3c0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
1e3d0 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 5c 6e  \" for reading\n
1e3e0 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  ", p->zDbFilenam
1e3f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1e400 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4c   0;.    }.    nL
1e410 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ine = 0;.  }else
1e420 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d 3e 69 6e  {.    in = p->in
1e430 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 70 2d  ;.    nLine = p-
1e440 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 69 66 28  >lineno;.    if(
1e450 20 69 6e 3d 3d 30 20 29 20 69 6e 20 3d 20 73 74   in==0 ) in = st
1e460 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44 61  din;.  }.  *pnDa
1e470 74 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65 2b  ta = 0;.  nLine+
1e480 2b 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a  +;.  if( fgets(z
1e490 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
1e4a0 6e 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67 6f  ne), in)==0 ) go
1e4b0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e4c0 6f 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61 6e  or;.  rc = sscan
1e4d0 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a 65  f(zLine, "| size
1e4e0 20 25 64 20 70 61 67 65 73 69 7a 65 20 25 64 22   %d pagesize %d"
1e4f0 2c 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20  , &n, &pgsz);.  
1e500 69 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74 6f  if( rc!=2 ) goto
1e510 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e520 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 67 6f  ;.  if( n<0 ) go
1e530 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e540 6f 72 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35  or;.  if( pgsz<5
1e550 31 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36  12 || pgsz>65536
1e560 20 7c 7c 20 28 70 67 73 7a 26 28 70 67 73 7a 2d   || (pgsz&(pgsz-
1e570 31 29 29 21 3d 30 20 29 20 67 6f 74 6f 20 72 65  1))!=0 ) goto re
1e580 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20  adHexDb_error;. 
1e590 20 6e 20 3d 20 28 6e 2b 70 67 73 7a 2d 31 29 26   n = (n+pgsz-1)&
1e5a0 7e 28 70 67 73 7a 2d 31 29 3b 20 20 2f 2a 20 52  ~(pgsz-1);  /* R
1e5b0 6f 75 6e 64 20 6e 20 75 70 20 74 6f 20 74 68 65  ound n up to the
1e5c0 20 6e 65 78 74 20 6d 75 6c 74 69 70 6c 65 20 6f   next multiple o
1e5d0 66 20 70 67 73 7a 20 2a 2f 0a 20 20 61 20 3d 20  f pgsz */.  a = 
1e5e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1e5f0 6e 20 3f 20 6e 20 3a 20 31 20 29 3b 0a 20 20 69  n ? n : 1 );.  i
1e600 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( a==0 ){.    u
1e610 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e620 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "Out of memor
1e630 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  y!\n");.    goto
1e640 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72   readHexDb_error
1e650 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 61  ;.  }.  memset(a
1e660 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 70  , 0, n);.  if( p
1e670 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a 3e  gsz<512 || pgsz>
1e680 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 20 26  65536 || (pgsz &
1e690 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 7b   (pgsz-1))!=0 ){
1e6a0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1e6b0 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61 6c 69  (stderr, "invali
1e6c0 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b 0a  d pagesize\n");.
1e6d0 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65 78      goto readHex
1e6e0 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  Db_error;.  }.  
1e6f0 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67 65  for(nLine++; fge
1e700 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
1e710 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30 3b  (zLine), in)!=0;
1e720 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20 72   nLine++){.    r
1e730 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65  c = sscanf(zLine
1e740 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f 66 66  , "| page %d off
1e750 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b 29  set %d", &j, &k)
1e760 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 32 20  ;.    if( rc==2 
1e770 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73 65 74  ){.      iOffset
1e780 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = k;.      cont
1e790 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1e7a0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69 6e  if( strncmp(zLin
1e7b0 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d  e, "| end ", 6)=
1e7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
1e7d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
1e7e0 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 22  = sscanf(zLine,"
1e7f0 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78 20 25  | %d: %x %x %x %
1e800 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e810 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e820 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20 20 20  %x %x",.        
1e830 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78 5b 30          &j, &x[0
1e840 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32 5d 2c  ], &x[1], &x[2],
1e850 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c 20 26   &x[3], &x[4], &
1e860 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26 78 5b  x[5], &x[6], &x[
1e870 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  7],.            
1e880 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b 39 5d      &x[8], &x[9]
1e890 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31 31 5d  , &x[10], &x[11]
1e8a0 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31 33 5d  , &x[12], &x[13]
1e8b0 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31 35 5d  , &x[14], &x[15]
1e8c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 31  );.    if( rc==1
1e8d0 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 69  7 ){.      k = i
1e8e0 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20 20 20  Offset+j;.      
1e8f0 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b 0a 20  if( k+16<=n ){. 
1e900 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
1e910 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
1e920 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20 61 5b   ii<16; ii++) a[
1e930 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26 30 78  k+ii] = x[ii]&0x
1e940 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ff;.      }.    
1e950 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20  }.  }.  *pnData 
1e960 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21 3d 70  = n;.  if( in!=p
1e970 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f  ->in ){.    fclo
1e980 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  se(in);.  }else{
1e990 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d  .    p->lineno =
1e9a0 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 72 65   nLine;.  }.  re
1e9b0 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48 65 78  turn a;..readHex
1e9c0 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  Db_error:.  if( 
1e9d0 69 6e 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20 20  in!=p->in ){.   
1e9e0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
1e9f0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1ea00 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69   fgets(zLine, si
1ea10 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 2d 3e  zeof(zLine), p->
1ea20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  in)!=0 ){.      
1ea30 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
1ea40 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c  f(strncmp(zLine,
1ea50 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d 30   "| end ", 6)==0
1ea60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1ea70 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20      p->lineno = 
1ea80 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  nLine;.  }.  sql
1ea90 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20  ite3_free(a);.  
1eaa0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1eab0 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69 6e  rr,"Error on lin
1eac0 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62 20  e %d of --hexdb 
1ead0 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65 29  input\n", nLine)
1eae0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1eaf0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1eb00 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
1eb10 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 63  IZE */../*.** Sc
1eb20 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73  alar function "s
1eb30 68 65 6c 6c 5f 69 6e 74 33 32 22 2e 20 54 68 65  hell_int32". The
1eb40 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1eb50 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1eb60 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 20 62 6c  .** must be a bl
1eb70 6f 62 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  ob. The second a
1eb80 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
1eb90 74 65 67 65 72 2e 20 54 68 69 73 20 66 75 6e 63  teger. This func
1eba0 74 69 6f 6e 0a 2a 2a 20 72 65 61 64 73 20 61 6e  tion.** reads an
1ebb0 64 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d 62  d returns a 32-b
1ebc0 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  it big-endian in
1ebd0 74 65 67 65 72 20 66 72 6f 6d 20 62 79 74 65 0a  teger from byte.
1ebe0 2a 2a 20 6f 66 66 73 65 74 20 28 34 2a 3c 61 72  ** offset (4*<ar
1ebf0 67 32 3e 29 20 6f 66 20 74 68 65 20 62 6c 6f 62  g2>) of the blob
1ec00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ec10 20 73 68 65 6c 6c 49 6e 74 33 32 28 0a 20 20 73   shellInt32(.  s
1ec20 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1ec30 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
1ec40 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
1ec50 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
1ec60 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ec70 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a 20  d char *pBlob;. 
1ec80 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 69 6e   int nBlob;.  in
1ec90 74 20 69 49 6e 74 3b 0a 0a 20 20 55 4e 55 53 45  t iInt;..  UNUSE
1eca0 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
1ecb0 29 3b 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71 6c  );.  nBlob = sql
1ecc0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
1ecd0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70 42 6c  (argv[0]);.  pBl
1ece0 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ob = (const unsi
1ecf0 67 6e 65 64 20 63 68 61 72 2a 29 73 71 6c 69 74  gned char*)sqlit
1ed00 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
1ed10 67 76 5b 30 5d 29 3b 0a 20 20 69 49 6e 74 20 3d  gv[0]);.  iInt =
1ed20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
1ed30 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20  nt(argv[1]);..  
1ed40 69 66 28 20 69 49 6e 74 3e 3d 30 20 26 26 20 28  if( iInt>=0 && (
1ed50 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e 42 6c 6f 62  iInt+1)*4<=nBlob
1ed60 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e   ){.    const un
1ed70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20 3d  signed char *a =
1ed80 20 26 70 42 6c 6f 62 5b 69 49 6e 74 2a 34 5d 3b   &pBlob[iInt*4];
1ed90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1eda0 36 34 20 69 56 61 6c 20 3d 20 28 28 73 71 6c 69  64 iVal = ((sqli
1edb0 74 65 33 5f 69 6e 74 36 34 29 61 5b 30 5d 3c 3c  te3_int64)a[0]<<
1edc0 32 34 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  24).            
1edd0 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 73             + ((s
1ede0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 31  qlite3_int64)a[1
1edf0 5d 3c 3c 31 36 29 0a 20 20 20 20 20 20 20 20 20  ]<<16).         
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1ee10 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
1ee20 61 5b 32 5d 3c 3c 20 38 29 0a 20 20 20 20 20 20  a[2]<< 8).      
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   + ((sqlite3_int
1ee50 36 34 29 61 5b 33 5d 3c 3c 20 30 29 3b 0a 20 20  64)a[3]<< 0);.  
1ee60 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1ee70 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  _int64(context, 
1ee80 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iVal);.  }.}../*
1ee90 0a 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e 63 74  .** Scalar funct
1eea0 69 6f 6e 20 22 73 68 65 6c 6c 5f 69 64 71 75 6f  ion "shell_idquo
1eeb0 74 65 28 58 29 22 20 72 65 74 75 72 6e 73 20 73  te(X)" returns s
1eec0 74 72 69 6e 67 20 58 20 71 75 6f 74 65 64 20 61  tring X quoted a
1eed0 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2c  s an identifier,
1eee0 0a 2a 2a 20 75 73 69 6e 67 20 22 2e 2e 2e 22 20  .** using "..." 
1eef0 77 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 64 6f  with internal do
1ef00 75 62 6c 65 2d 71 75 6f 74 65 20 63 68 61 72 61  uble-quote chara
1ef10 63 74 65 72 73 20 64 6f 75 62 6c 65 64 2e 0a 2a  cters doubled..*
1ef20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
1ef30 65 6c 6c 49 64 51 75 6f 74 65 28 0a 20 20 73 71  ellIdQuote(.  sq
1ef40 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1ef50 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
1ef60 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  rgc, .  sqlite3_
1ef70 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1ef80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1ef90 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
1efa0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1efb0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
1efc0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1efd0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
1efe0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
1eff0 25 77 5c 22 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  %w\"", zName);. 
1f000 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1f010 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
1f020 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  z, -1, sqlite3_f
1f030 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
1f040 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e 63 74 69  ** Scalar functi
1f050 6f 6e 20 22 73 68 65 6c 6c 5f 65 73 63 61 70 65  on "shell_escape
1f060 5f 63 72 6e 6c 22 20 75 73 65 64 20 62 79 20 74  _crnl" used by t
1f070 68 65 20 2e 72 65 63 6f 76 65 72 20 63 6f 6d 6d  he .recover comm
1f080 61 6e 64 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  and..** The argu
1f090 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1f0a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f0b0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 62 75  the output of bu
1f0c0 69 6c 74 2d 69 6e 0a 2a 2a 20 66 75 6e 63 74 69  ilt-in.** functi
1f0d0 6f 6e 20 71 75 6f 74 65 28 29 2e 20 49 66 20 74  on quote(). If t
1f0e0 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
1f0f0 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
1f100 69 73 20 22 27 22 2c 20 0a 2a 2a 20 69 6e 64 69  is "'", .** indi
1f110 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
1f120 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20  value passed to 
1f130 71 75 6f 74 65 28 29 20 77 61 73 20 61 20 74 65  quote() was a te
1f140 78 74 20 76 61 6c 75 65 2c 0a 2a 2a 20 74 68 65  xt value,.** the
1f150 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1f160 73 65 61 72 63 68 65 73 20 74 68 65 20 69 6e 70  searches the inp
1f170 75 74 20 66 6f 72 20 22 5c 6e 22 20 61 6e 64 20  ut for "\n" and 
1f180 22 5c 72 22 20 63 68 61 72 61 63 74 65 72 73 0a  "\r" characters.
1f190 2a 2a 20 61 6e 64 20 61 64 64 73 20 61 20 77 72  ** and adds a wr
1f1a0 61 70 70 65 72 20 73 69 6d 69 6c 61 72 20 74 6f  apper similar to
1f1b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1f1c0 2a 2a 0a 2a 2a 20 20 20 72 65 70 6c 61 63 65 28  **.**   replace(
1f1d0 72 65 70 6c 61 63 65 28 3c 69 6e 70 75 74 3e 2c  replace(<input>,
1f1e0 20 27 5c 6e 27 2c 20 63 68 61 72 28 31 30 29 2c   '\n', char(10),
1f1f0 20 27 5c 72 27 2c 20 63 68 61 72 28 31 33 29 29   '\r', char(13))
1f200 3b 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ;.**.** Or, if t
1f210 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
1f220 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
1f230 69 73 20 6e 6f 74 20 22 27 22 2c 20 74 68 65 6e  is not "'", then
1f240 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
1f250 65 20 69 6e 70 75 74 20 69 73 20 72 65 74 75 72  e input is retur
1f260 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
1f270 6f 69 64 20 73 68 65 6c 6c 45 73 63 61 70 65 43  oid shellEscapeC
1f280 72 6e 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rnl(.  sqlite3_c
1f290 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1f2a0 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20   .  int argc, . 
1f2b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1f2c0 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
1f2d0 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
1f2e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1f2f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1f300 72 67 76 5b 30 5d 29 3b 0a 20 20 55 4e 55 53 45  rgv[0]);.  UNUSE
1f310 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 63  D_PARAMETER(argc
1f320 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 5b 30  );.  if( zText[0
1f330 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69  ]=='\'' ){.    i
1f340 6e 74 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74  nt nText = sqlit
1f350 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
1f360 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74  rgv[0]);.    int
1f370 20 69 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   i;.    char zBu
1f380 66 31 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72  f1[20];.    char
1f390 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20   zBuf2[20];.    
1f3a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20  const char *zNL 
1f3b0 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
1f3c0 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20  har *zCR = 0;.  
1f3d0 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20    int nCR = 0;. 
1f3e0 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
1f3f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54  .    for(i=0; zT
1f400 65 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ext[i]; i++){.  
1f410 20 20 20 20 69 66 28 20 7a 4e 4c 3d 3d 30 20 26      if( zNL==0 &
1f420 26 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 6e 27  & zText[i]=='\n'
1f430 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 4c 20   ){.        zNL 
1f440 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
1f450 7a 54 65 78 74 2c 20 22 5c 5c 6e 22 2c 20 22 5c  zText, "\\n", "\
1f460 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20  \012", zBuf1);. 
1f470 20 20 20 20 20 20 20 6e 4e 4c 20 3d 20 28 69 6e         nNL = (in
1f480 74 29 73 74 72 6c 65 6e 28 7a 4e 4c 29 3b 0a 20  t)strlen(zNL);. 
1f490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f4a0 20 7a 43 52 3d 3d 30 20 26 26 20 7a 54 65 78 74   zCR==0 && zText
1f4b0 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20  [i]=='\r' ){.   
1f4c0 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65       zCR = unuse
1f4d0 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74 2c 20  d_string(zText, 
1f4e0 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20  "\\r", "\\015", 
1f4f0 7a 42 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20  zBuf2);.        
1f500 6e 43 52 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  nCR = (int)strle
1f510 6e 28 7a 43 52 29 3b 0a 20 20 20 20 20 20 7d 0a  n(zCR);.      }.
1f520 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 7a      }..    if( z
1f530 4e 4c 20 7c 7c 20 7a 43 52 20 29 7b 0a 20 20 20  NL || zCR ){.   
1f540 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b     int iOut = 0;
1f550 0a 20 20 20 20 20 20 69 36 34 20 6e 4d 61 78 20  .      i64 nMax 
1f560 3d 20 28 6e 4e 4c 20 3e 20 6e 43 52 29 20 3f 20  = (nNL > nCR) ? 
1f570 6e 4e 4c 20 3a 20 6e 43 52 3b 0a 20 20 20 20 20  nNL : nCR;.     
1f580 20 69 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d   i64 nAlloc = nM
1f590 61 78 20 2a 20 6e 54 65 78 74 20 2b 20 28 6e 4d  ax * nText + (nM
1f5a0 61 78 2b 36 34 29 2a 32 3b 0a 20 20 20 20 20 20  ax+64)*2;.      
1f5b0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 28 63 68  char *zOut = (ch
1f5c0 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ar*)sqlite3_mall
1f5d0 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  oc64(nAlloc);.  
1f5e0 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
1f5f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f600 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
1f610 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
1f620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
1f630 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1f640 66 28 20 7a 4e 4c 20 26 26 20 7a 43 52 20 29 7b  f( zNL && zCR ){
1f650 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f660 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72 65  &zOut[iOut], "re
1f670 70 6c 61 63 65 28 72 65 70 6c 61 63 65 28 22 2c  place(replace(",
1f680 20 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69 4f   16);.        iO
1f690 75 74 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20  ut += 16;.      
1f6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1f6b0 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74  emcpy(&zOut[iOut
1f6c0 5d 2c 20 22 72 65 70 6c 61 63 65 28 22 2c 20 38  ], "replace(", 8
1f6d0 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20  );.        iOut 
1f6e0 2b 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += 8;.      }.  
1f6f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 65      for(i=0; zTe
1f700 78 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  xt[i]; i++){.   
1f710 20 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b 69       if( zText[i
1f720 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
1f730 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75       memcpy(&zOu
1f740 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e  t[iOut], zNL, nN
1f750 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  L);.          iO
1f760 75 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20  ut += nNL;.     
1f770 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 65     }else if( zTe
1f780 78 74 5b 69 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20  xt[i]=='\r' ){. 
1f790 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f7a0 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52  &zOut[iOut], zCR
1f7b0 2c 20 6e 43 52 29 3b 0a 20 20 20 20 20 20 20 20  , nCR);.        
1f7c0 20 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a 20    iOut += nCR;. 
1f7d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f7e0 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 69 4f 75          zOut[iOu
1f7f0 74 5d 20 3d 20 7a 54 65 78 74 5b 69 5d 3b 0a 20  t] = zText[i];. 
1f800 20 20 20 20 20 20 20 20 20 69 4f 75 74 2b 2b 3b           iOut++;
1f810 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f820 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   }..      if( zN
1f830 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  L ){.        mem
1f840 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f850 20 22 2c 27 22 2c 20 32 29 3b 20 69 4f 75 74 20   ",'", 2); iOut 
1f860 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6d 65  += 2;.        me
1f870 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d  mcpy(&zOut[iOut]
1f880 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 20 69 4f 75  , zNL, nNL); iOu
1f890 74 20 2b 3d 20 6e 4e 4c 3b 0a 20 20 20 20 20 20  t += nNL;.      
1f8a0 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
1f8b0 4f 75 74 5d 2c 20 22 27 2c 20 63 68 61 72 28 31  Out], "', char(1
1f8c0 30 29 29 22 2c 20 31 32 29 3b 20 69 4f 75 74 20  0))", 12); iOut 
1f8d0 2b 3d 20 31 32 3b 0a 20 20 20 20 20 20 7d 0a 20  += 12;.      }. 
1f8e0 20 20 20 20 20 69 66 28 20 7a 43 52 20 29 7b 0a       if( zCR ){.
1f8f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f900 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22  zOut[iOut], ",'"
1f910 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b  , 2); iOut += 2;
1f920 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f930 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 43 52  &zOut[iOut], zCR
1f940 2c 20 6e 43 52 29 3b 20 69 4f 75 74 20 2b 3d 20  , nCR); iOut += 
1f950 6e 43 52 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nCR;.        mem
1f960 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f970 20 22 27 2c 20 63 68 61 72 28 31 33 29 29 22 2c   "', char(13))",
1f980 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32   12); iOut += 12
1f990 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f9a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f9b0 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 4f  text(context, zO
1f9c0 75 74 2c 20 69 4f 75 74 2c 20 53 51 4c 49 54 45  ut, iOut, SQLITE
1f9d0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
1f9e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f9f0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
1fa00 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
1fa10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1fa20 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
1fa30 61 72 67 76 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20  argv[0]);.}../* 
1fa40 46 6c 61 67 73 20 66 6f 72 20 6f 70 65 6e 5f 64  Flags for open_d
1fa50 62 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  b()..**.** The d
1fa60 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
1fa70 6f 66 20 6f 70 65 6e 5f 64 62 28 29 20 69 73 20  of open_db() is 
1fa80 74 6f 20 65 78 69 74 28 31 29 20 69 66 20 74 68  to exit(1) if th
1fa90 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
1faa0 20 74 6f 0a 2a 2a 20 6f 70 65 6e 2e 20 20 54 68   to.** open.  Th
1fab0 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c  e OPEN_DB_KEEPAL
1fac0 49 56 45 20 66 6c 61 67 20 63 68 61 6e 67 65 73  IVE flag changes
1fad0 20 74 68 61 74 20 73 6f 20 74 68 61 74 20 69 74   that so that it
1fae0 20 70 72 69 6e 74 73 20 61 6e 20 65 72 72 6f 72   prints an error
1faf0 0a 2a 2a 20 62 75 74 20 73 74 69 6c 6c 20 72 65  .** but still re
1fb00 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 63 61  turns without ca
1fb10 6c 6c 69 6e 67 20 65 78 69 74 2e 0a 2a 2a 0a 2a  lling exit..**.*
1fb20 2a 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 5a 49  * The OPEN_DB_ZI
1fb30 50 46 49 4c 45 20 66 6c 61 67 20 63 61 75 73 65  PFILE flag cause
1fb40 73 20 6f 70 65 6e 5f 64 62 28 29 20 74 6f 20 70  s open_db() to p
1fb50 72 65 66 65 72 20 74 6f 20 6f 70 65 6e 20 66 69  refer to open fi
1fb60 6c 65 73 20 61 73 20 61 0a 2a 2a 20 5a 49 50 20  les as a.** ZIP 
1fb70 61 72 63 68 69 76 65 20 69 66 20 74 68 65 20 66  archive if the f
1fb80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
1fb90 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79 20 61  st or is empty a
1fba0 6e 64 20 69 74 73 20 6e 61 6d 65 20 6d 61 74 63  nd its name matc
1fbb0 68 65 73 0a 2a 2a 20 74 68 65 20 2a 2e 7a 69 70  hes.** the *.zip
1fbc0 20 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 23 64 65   pattern..*/.#de
1fbd0 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 4b 45 45  fine OPEN_DB_KEE
1fbe0 50 41 4c 49 56 45 20 20 20 30 78 30 30 31 20 20  PALIVE   0x001  
1fbf0 20 2f 2a 20 52 65 74 75 72 6e 20 61 66 74 65 72   /* Return after
1fc00 20 65 72 72 6f 72 20 69 66 20 74 72 75 65 20 2a   error if true *
1fc10 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44  /.#define OPEN_D
1fc20 42 5f 5a 49 50 46 49 4c 45 20 20 20 20 20 30 78  B_ZIPFILE     0x
1fc30 30 30 32 20 20 20 2f 2a 20 4f 70 65 6e 20 61 73  002   /* Open as
1fc40 20 5a 49 50 20 69 66 20 6e 61 6d 65 20 6d 61 74   ZIP if name mat
1fc50 63 68 65 73 20 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f  ches *.zip */../
1fc60 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1fc70 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  he database is o
1fc80 70 65 6e 2e 20 20 49 66 20 69 74 20 69 73 20 6e  pen.  If it is n
1fc90 6f 74 2c 20 74 68 65 6e 20 6f 70 65 6e 20 69 74  ot, then open it
1fca0 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 64 61 74  .  If.** the dat
1fcb0 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 20 6f  abase fails to o
1fcc0 70 65 6e 2c 20 70 72 69 6e 74 20 61 6e 20 65 72  pen, print an er
1fcd0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
1fce0 65 78 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  exit..*/.static 
1fcf0 76 6f 69 64 20 6f 70 65 6e 5f 64 62 28 53 68 65  void open_db(She
1fd00 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1fd10 6f 70 65 6e 46 6c 61 67 73 29 7b 0a 20 20 69 66  openFlags){.  if
1fd20 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
1fd30 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
1fd40 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  e==SHELL_OPEN_UN
1fd50 53 50 45 43 20 29 7b 0a 20 20 20 20 20 20 69 66  SPEC ){.      if
1fd60 28 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  ( p->zDbFilename
1fd70 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 62 46 69 6c  ==0 || p->zDbFil
1fd80 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20  ename[0]==0 ){. 
1fd90 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f         p->openMo
1fda0 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
1fdb0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 7d 65  NORMAL;.      }e
1fdc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
1fdd0 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75 38 29 64  openMode = (u8)d
1fde0 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1fdf0 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  e(p->zDbFilename
1fe00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45  (openFlags & OPE
1fe30 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 29 21 3d 30  N_DB_ZIPFILE)!=0
1fe40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1fe50 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
1fe60 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20  openMode ){.    
1fe70 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1fe80 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20  N_APPENDVFS: {. 
1fe90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
1fea0 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c  pen_v2(p->zDbFil
1feb0 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a  ename, &p->db, .
1fec0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1fed0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1fee0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
1fef0 41 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b  ATE, "apndvfs");
1ff00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ff10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1ff20 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45  se SHELL_OPEN_HE
1ff30 58 44 42 3a 0a 20 20 20 20 20 20 63 61 73 65 20  XDB:.      case 
1ff40 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52  SHELL_OPEN_DESER
1ff50 49 41 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  IALIZE: {.      
1ff60 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 30    sqlite3_open(0
1ff70 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  , &p->db);.     
1ff80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ff90 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1ffa0 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3a  LL_OPEN_ZIPFILE:
1ffb0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
1ffc0 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79  e3_open(":memory
1ffd0 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  :", &p->db);.   
1ffe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fff0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53    }.      case S
20000 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  HELL_OPEN_READON
20010 4c 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  LY: {.        sq
20020 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d  lite3_open_v2(p-
20030 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
20040 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ->db, SQLITE_OPE
20050 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20 30 29 3b 0a  N_READONLY, 0);.
20060 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
20080 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  e SHELL_OPEN_UNS
20090 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  PEC:.      case 
200a0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
200b0 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  L: {.        sql
200c0 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a 44 62  ite3_open(p->zDb
200d0 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
200e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
200f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20100 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70      globalDb = p
20110 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 2d  ->db;.    if( p-
20120 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  >db==0 || SQLITE
20130 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65 72 72  _OK!=sqlite3_err
20140 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20  code(p->db) ){. 
20150 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
20160 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
20170 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
20180 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22 3a 20  atabase \"%s\": 
20190 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
201a0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c   p->zDbFilename,
201b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
201c0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 69  p->db));.      i
201d0 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  f( openFlags & O
201e0 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
201f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20200 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
20210 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  y:", &p->db);.  
20220 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
20230 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 69 74      }.      exit
20240 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  (1);.    }.#ifnd
20250 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
20260 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
20270 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
20280 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
20290 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69  p->db, 1);.#endi
202a0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  f.    sqlite3_fi
202b0 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  leio_init(p->db,
202c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
202d0 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69  te3_shathree_ini
202e0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
202f0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70      sqlite3_comp
20300 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64  letion_init(p->d
20310 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20 21 64  b, 0, 0);.#if !d
20320 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
20330 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
20340 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
20350 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  TE_ENABLE_DBPAGE
20360 5f 56 54 41 42 29 0a 20 20 20 20 73 71 6c 69 74  _VTAB).    sqlit
20370 65 33 5f 64 62 64 61 74 61 5f 69 6e 69 74 28 70  e3_dbdata_init(p
20380 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e  ->db, 0, 0);.#en
20390 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
203a0 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20  E_HAVE_ZLIB.    
203b0 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
203c0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
203d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
203e0 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  qlar_init(p->db,
203f0 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
20400 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20410 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20420 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  , "shell_add_sch
20430 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f  ema", 3, SQLITE_
20440 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68       shellAddSch
20470 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a  emaName, 0, 0);.
20480 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
20490 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
204a0 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65  b, "shell_module
204b0 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c  _schema", 1, SQL
204c0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f           shellMo
204f0 64 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30  duleSchema, 0, 0
20500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20510 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20520 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74  ->db, "shell_put
20530 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  snl", 1, SQLITE_
20540 55 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20 20  UTF8, p,.       
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
20570 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
20580 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20590 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
205a0 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
205b0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
205c0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72 6e    shellEscapeCrn
205f0 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  l, 0, 0);.    sq
20600 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
20610 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
20620 65 6c 6c 5f 69 6e 74 33 32 22 2c 20 32 2c 20 53  ell_int32", 2, S
20630 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
20660 49 6e 74 33 32 2c 20 30 2c 20 30 29 3b 0a 20 20  Int32, 0, 0);.  
20670 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20680 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20690 20 22 73 68 65 6c 6c 5f 69 64 71 75 6f 74 65 22   "shell_idquote"
206a0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
206b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 73 68 65 6c 6c 49 64 51 75 6f 74 65 2c 20 30   shellIdQuote, 0
206e0 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
206f0 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
20700 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  EM.    sqlite3_c
20710 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20720 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c  ->db, "edit", 1,
20730 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
20740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
20760 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
20770 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20780 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20790 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49   "edit", 2, SQLI
207a0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63          editFunc
207d0 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
207e0 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
207f0 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20800 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
20810 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
20820 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
20830 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
20840 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69  VIRTUAL TABLE zi
20850 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  p USING zipfile(
20860 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c  %Q);", p->zDbFil
20870 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  ename);.      sq
20880 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
20890 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
208a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
208b0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
208c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
208d0 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
208e0 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  ZE.    else.    
208f0 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d  if( p->openMode=
20900 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45  =SHELL_OPEN_DESE
20910 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f 70  RIALIZE || p->op
20920 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
20930 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20 20  EN_HEXDB ){.    
20940 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
20950 69 6e 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20  int nData = 0;. 
20960 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
20970 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 20 20 20  ar *aData;.     
20980 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20990 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  ==SHELL_OPEN_DES
209a0 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20 20  ERIALIZE ){.    
209b0 20 20 20 20 61 44 61 74 61 20 3d 20 28 75 6e 73      aData = (uns
209c0 69 67 6e 65 64 20 63 68 61 72 2a 29 72 65 61 64  igned char*)read
209d0 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  File(p->zDbFilen
209e0 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  ame, &nData);.  
209f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a00 20 20 20 61 44 61 74 61 20 3d 20 72 65 61 64 48     aData = readH
20a10 65 78 44 62 28 70 2c 20 26 6e 44 61 74 61 29 3b  exDb(p, &nData);
20a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
20a30 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
20a40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
20a50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20a60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20a70 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e 64  deserialize(p->d
20a80 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74 61  b, "main", aData
20a90 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c 0a  , nData, nData,.
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49     SQLITE_DESERI
20ac0 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c 45  ALIZE_RESIZEABLE
20ad0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
20ae0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53        SQLITE_DES
20af0 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43  ERIALIZE_FREEONC
20b00 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66 28  LOSE);.      if(
20b10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75   rc ){.        u
20b20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
20b30 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74  r, "Error: sqlit
20b40 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 29  e3_deserialize()
20b50 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
20b60 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
20b70 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78 3e     if( p->szMax>
20b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
20b90 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
20ba0 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  l(p->db, "main",
20bb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
20bc0 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73 7a  ZE_LIMIT, &p->sz
20bd0 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Max);.      }.  
20be0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
20bf0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
20c00 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
20c10 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  abaes connection
20c20 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  .  Report errors
20c30 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65 5f  ..*/.void close_
20c40 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  db(sqlite3 *db){
20c50 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
20c60 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
20c70 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
20c80 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
20c90 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69 74  r, "Error: sqlit
20ca0 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75 72  e3_close() retur
20cb0 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20 20  ns %d: %s\n",.  
20cc0 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74 65        rc, sqlite
20cd0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
20ce0 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45 5f   } .}..#if HAVE_
20cf0 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56 45  READLINE || HAVE
20d00 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a 20  _EDITLINE./*.** 
20d10 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65 74  Readline complet
20d20 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2f  ion callbacks.*/
20d30 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65  .static char *re
20d40 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
20d50 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e 73  n_generator(cons
20d60 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69 6e  t char *text, in
20d70 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61 74  t state){.  stat
20d80 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
20d90 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
20da0 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28 20  ar *zRet;.  if( 
20db0 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  state==0 ){.    
20dc0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20  char *zSql;.    
20dd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20de0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71  (pStmt);.    zSq
20df0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
20e00 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53 54  ntf("SELECT DIST
20e10 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20 43  INCT candidate C
20e20 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
20e50 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 29  M completion(%Q)
20e60 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74 65   ORDER BY 1", te
20e70 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
20e80 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62  _prepare_v2(glob
20e90 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  alDb, zSql, -1, 
20ea0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
20eb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
20ec0 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
20ed0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
20ee0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
20ef0 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72 64  .    zRet = strd
20f00 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  up((const char*)
20f10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
20f20 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
20f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
20f40 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
20f50 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20  tmt);.    pStmt 
20f60 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d 20  = 0;.    zRet = 
20f70 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20f80 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63  zRet;.}.static c
20f90 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f 63  har **readline_c
20fa0 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20  ompletion(const 
20fb0 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
20fc0 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
20fd0 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70 74  d){.  rl_attempt
20fe0 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f 76  ed_completion_ov
20ff0 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  er = 1;.  return
21000 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6d   rl_completion_m
21010 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72 65  atches(zText, re
21020 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
21030 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d 0a  n_generator);.}.
21040 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45  .#elif HAVE_LINE
21050 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e 65  NOISE./*.** Line
21060 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f 6e  noise completion
21070 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
21080 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f 69  tic void linenoi
21090 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f  se_completion(co
210a0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  nst char *zLine,
210b0 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c 65   linenoiseComple
210c0 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69 6e  tions *lc){.  in
210d0 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65 6e  t nLine = strlen
210e0 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e 74  30(zLine);.  int
210f0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73 71   i, iStart;.  sq
21100 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21110 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
21120 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
21130 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6e  [1000];..  if( n
21140 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75 66  Line>sizeof(zBuf
21150 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )-30 ) return;. 
21160 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27   if( zLine[0]=='
21170 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d 3d  .' || zLine[0]==
21180 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  '#') return;.  f
21190 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69 3e  or(i=nLine-1; i>
211a0 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 7a  =0 && (isalnum(z
211b0 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69 6e  Line[i]) || zLin
211c0 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d 29  e[i]=='_'); i--)
211d0 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69 6e  {}.  if( i==nLin
211e0 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  e-1 ) return;.  
211f0 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
21200 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
21210 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7a  ne, iStart);.  z
21220 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
21230 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
21240 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
21250 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
21260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21270 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
21280 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51 2c  M completion(%Q,
21290 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
212a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
212b0 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e 65            &zLine
212c0 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65 29  [iStart], zLine)
212d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
212e0 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c  are_v2(globalDb,
212f0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
21300 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
21310 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73  _free(zSql);.  s
21320 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f 62  qlite3_exec(glob
21330 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70 61  alDb, "PRAGMA pa
21340 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30 2c  ge_count", 0, 0,
21350 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68 65   0); /* Load the
21360 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68 69   schema */.  whi
21370 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
21380 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
21390 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ROW ){.    const
213a0 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74 69   char *zCompleti
213b0 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  on = (const char
213c0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
213d0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
213e0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c 65  .    int nComple
213f0 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  tion = sqlite3_c
21400 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
21410 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  t, 0);.    if( i
21420 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69 6f  Start+nCompletio
21430 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29  n < sizeof(zBuf)
21440 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  -1 ){.      memc
21450 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c 20  py(zBuf+iStart, 
21460 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43 6f  zCompletion, nCo
21470 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20 20  mpletion+1);.   
21480 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64 43     linenoiseAddC
21490 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a 42  ompletion(lc, zB
214a0 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  uf);.    }.  }. 
214b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
214c0 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e 64  e(pStmt);.}.#end
214d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d 6c  if../*.** Do C-l
214e0 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64 65  anguage style de
214f0 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  quoting..**.**  
21500 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72 6d    \a    -> alarm
21510 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e 20  .**    \b    -> 
21520 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20 20  backspace.**    
21530 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a 20  \t    -> tab.** 
21540 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77 6c     \n    -> newl
21550 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20 20  ine.**    \v    
21560 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62 0a  -> vertical tab.
21570 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20 66  **    \f    -> f
21580 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20 5c  orm feed.**    \
21590 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67 65  r    -> carriage
215a0 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c 73   return.**    \s
215b0 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a 20      -> space.** 
215c0 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a 2a     \"    -> ".**
215d0 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a 2a      \'    -> '.*
215e0 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62 61  *    \\    -> ba
215f0 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c 4e  ckslash.**    \N
21600 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68 61  NN  -> ascii cha
21610 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f 63  racter NNN in oc
21620 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  tal.*/.static vo
21630 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73  id resolve_backs
21640 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29 7b  lashes(char *z){
21650 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
21660 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20  har c;.  while( 
21670 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20 29  *z && *z!='\\' )
21680 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d   z++;.  for(i=j=
21690 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
216a0 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
216b0 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26 20   if( c=='\\' && 
216c0 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20 20  z[i+1]!=0 ){.   
216d0 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
216e0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27 20       if( c=='a' 
216f0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
21700 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \a';.      }else
21710 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20   if( c=='b' ){. 
21720 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b         c = '\b';
21730 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
21740 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20   c=='t' ){.     
21750 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20     c = '\t';.   
21760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
21770 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  'n' ){.        c
21780 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 7d   = '\n';.      }
21790 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27 20  else if( c=='v' 
217a0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
217b0 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \v';.      }else
217c0 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20   if( c=='f' ){. 
217d0 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b         c = '\f';
217e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
217f0 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20   c=='r' ){.     
21800 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20     c = '\r';.   
21810 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
21820 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '"' ){.        c
21830 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d 65   = '"';.      }e
21840 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
21850 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
21860 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \'';.      }else
21870 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
21880 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c 27          c = '\\'
21890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
218a0 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
218b0 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  7' ){.        c 
218c0 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20  -= '0';.        
218d0 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
218e0 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
218f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b  {.          i++;
21900 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 28  .          c = (
21910 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27  c<<3) + z[i] - '
21920 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0';.          if
21930 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26  ( z[i+1]>='0' &&
21940 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a   z[i+1]<='7' ){.
21950 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
21960 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
21970 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
21980 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
21990 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
219a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
219b0 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  j] = c;.  }.  if
219c0 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20 30  ( j<i ) z[j] = 0
219d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ;.}../*.** Inter
219e0 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69 74  pret zArg as eit
219f0 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  her an integer o
21a00 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  r a boolean valu
21a10 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20  e.  Return 1 or 
21a20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e  0.** for TRUE an
21a30 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e  d FALSE.  Return
21a40 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
21a50 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61 74  ue if appropriat
21a60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21a70 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f   booleanValue(co
21a80 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
21a90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21aa0 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20  zArg[0]=='0' && 
21ab0 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a  zArg[1]=='x' ){.
21ac0 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78      for(i=2; hex
21ad0 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b  DigitValue(zArg[
21ae0 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  i])>=0; i++){}. 
21af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
21b00 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30  i=0; zArg[i]>='0
21b10 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39  ' && zArg[i]<='9
21b20 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20  '; i++){}.  }.  
21b30 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b  if( i>0 && zArg[
21b40 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  i]==0 ) return (
21b50 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75  int)(integerValu
21b60 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66 66  e(zArg) & 0xffff
21b70 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c  ffff);.  if( sql
21b80 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21b90 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73  g, "on")==0 || s
21ba0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
21bb0 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b  Arg,"yes")==0 ){
21bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
21bd0 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
21be0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
21bf0 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  off")==0 || sqli
21c00 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
21c10 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ,"no")==0 ){.   
21c20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
21c30 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
21c40 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74  err, "ERROR: Not
21c50 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
21c60 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69  : \"%s\". Assumi
21c70 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20  ng \"no\".\n",. 
21c80 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a           zArg);.
21c90 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21ca0 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61  *.** Set or clea
21cb0 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61  r a shell flag a
21cc0 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f  ccording to a bo
21cd0 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a  olean value..*/.
21ce0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f  static void setO
21cf0 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c  rClearFlag(Shell
21d00 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e  State *p, unsign
21d10 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20  ed mFlag, const 
21d20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69  char *zArg){.  i
21d30 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
21d40 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65  zArg) ){.    She
21d50 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c  llSetFlag(p, mFl
21d60 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ag);.  }else{.  
21d70 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
21d80 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a  (p, mFlag);.  }.
21d90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
21da0 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61  n output file, a
21db0 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f  ssuming it is no
21dc0 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f  t stderr or stdo
21dd0 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
21de0 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c  d output_file_cl
21df0 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  ose(FILE *f){.  
21e00 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f  if( f && f!=stdo
21e10 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72 20  ut && f!=stderr 
21e20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a  ) fclose(f);.}..
21e30 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65  /*.** Try to ope
21e40 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  n an output file
21e50 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73  .   The names "s
21e60 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65  tdout" and "stde
21e70 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67  rr" are.** recog
21e80 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65  nized and do the
21e90 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e   right thing.  N
21ea0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
21eb0 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  if the output.**
21ec0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66   filename is "of
21ed0 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49  f"..*/.static FI
21ee0 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f  LE *output_file_
21ef0 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
21f00 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65 78  *zFile, int bTex
21f10 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20 2a  tMode){.  FILE *
21f20 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  f;.  if( strcmp(
21f30 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d  zFile,"stdout")=
21f40 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
21f50 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  dout;.  }else if
21f60 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
21f70 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
21f80 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a      f = stderr;.
21f90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
21fa0 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29  mp(zFile, "off")
21fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30  ==0 ){.    f = 0
21fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
21fd0 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
21fe0 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22 20  bTextMode ? "w" 
21ff0 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28  : "wb");.    if(
22000 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75   f==0 ){.      u
22010 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
22020 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
22030 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22  t open \"%s\"\n"
22040 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
22050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a    }.  return f;.
22060 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
22070 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
22080 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
22090 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
220a0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
220b0 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
220c0 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63   int sql_trace_c
220d0 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67  allback(.  unsig
220e0 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20 20  ned mType,      
220f0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65 20     /* The trace 
22100 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  type */.  void *
22110 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
22120 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53 74    /* The ShellSt
22130 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ate pointer */. 
22140 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20 20   void *pP,      
22150 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75 61           /* Usua
22160 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
22170 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f 0a   sqlite_stmt */.
22180 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20 20    void *pX      
22190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 78            /* Aux
221a0 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a 2f  iliary output */
221b0 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  .){.  ShellState
221c0 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
221d0 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69 74  e*)pArg;.  sqlit
221e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
221f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
22200 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0a  ql;.  int nSql;.
22210 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f 75    if( p->traceOu
22220 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
22230 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53 51  .  if( mType==SQ
22240 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45  LITE_TRACE_CLOSE
22250 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
22260 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c  ntf(p->traceOut,
22270 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61 74   "-- closing dat
22280 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22290 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
222a0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 54   0;.  }.  if( mT
222b0 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41 43  ype!=SQLITE_TRAC
222c0 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73 74  E_ROW && ((const
222d0 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d 27   char*)pX)[0]=='
222e0 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20 3d  -' ){.    zSql =
222f0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58   (const char*)pX
22300 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22310 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f  Stmt = (sqlite3_
22320 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73 77  stmt*)pP;.    sw
22330 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65 54  itch( p->eTraceT
22340 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
22350 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45 58  e SHELL_TRACE_EX
22360 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20 20  PANDED: {.      
22370 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
22380 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53  _expanded_sql(pS
22390 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  tmt);.        br
223a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
223b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
223c0 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20 20  E_NORMALIZE.    
223d0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41    case SHELL_TRA
223e0 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20 7b  CE_NORMALIZED: {
223f0 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
22400 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a  sqlite3_normaliz
22410 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  ed_sql(pStmt);. 
22420 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
22430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22440 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
22450 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c        zSql = sql
22460 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
22470 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22490 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  }.  if( zSql==0 
224a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 53  ) return 0;.  nS
224b0 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53  ql = strlen30(zS
224c0 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53  ql);.  while( nS
224d0 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53 71  ql>0 && zSql[nSq
224e0 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53 71  l-1]==';' ){ nSq
224f0 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68 28  l--; }.  switch(
22500 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61   mType ){.    ca
22510 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f  se SQLITE_TRACE_
22520 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ROW:.    case SQ
22530 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 3a  LITE_TRACE_STMT:
22540 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   {.      utf8_pr
22550 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
22560 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53 71  , "%.*s;\n", nSq
22570 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  l, zSql);.      
22580 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22590 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
225a0 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20 20  CE_PROFILE: {.  
225b0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
225c0 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28 73  4 nNanosec = *(s
225d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 58  qlite3_int64*)pX
225e0 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
225f0 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74 2c  ntf(p->traceOut,
22600 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64 20   "%.*s; -- %lld 
22610 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71  ns\n", nSql, zSq
22620 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20 20  l, nNanosec);.  
22630 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22650 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22660 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65   A no-op routine
22670 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68 20   that runs with 
22680 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74  the ".breakpoint
22690 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20  " doc-command.  
226a0 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65  This is.** a use
226b0 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20  ful spot to set 
226c0 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61 6b  a debugger break
226d0 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
226e0 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b   void test_break
226f0 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73  point(void){.  s
22700 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20  tatic int nCall 
22710 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a  = 0;.  nCall++;.
22720 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65  }../*.** An obje
22730 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  ct used to read 
22740 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20  a CSV and other 
22750 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74  files for import
22760 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
22770 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d  uct ImportCtx Im
22780 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20  portCtx;.struct 
22790 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f  ImportCtx {.  co
227a0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
227b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
227c0 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
227d0 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20   FILE *in;      
227e0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
227f0 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74   CSV text from t
22800 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d  his input stream
22810 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
22820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
22830 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f  umulated text fo
22840 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  r a field */.  i
22850 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
22860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22870 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20  bytes in z */.  
22880 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
22890 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
228a0 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a  ocated for z[] *
228b0 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20  /.  int nLine;  
228c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
228d0 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  nt line number *
228e0 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73  /.  int bNotFirs
228f0 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
22900 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62  if one or more b
22910 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65 61  ytes already rea
22920 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d  d */.  int cTerm
22930 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;          /* Ch
22940 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72  aracter that ter
22950 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74  minated the most
22960 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f   recent field */
22970 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20  .  int cColSep; 
22980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
22990 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63  lumn separator c
229a0 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
229b0 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e  lly ",") */.  in
229c0 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20  t cRowSep;      
229d0 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70    /* The row sep
229e0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
229f0 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22  .  (Usually "\n"
22a00 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65  ) */.};../* Appe
22a10 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  nd a single byte
22a20 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69   to z[] */.stati
22a30 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70  c void import_ap
22a40 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74  pend_char(Import
22a50 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a  Ctx *p, int c){.
22a60 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d    if( p->n+1>=p-
22a70 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  >nAlloc ){.    p
22a80 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e  ->nAlloc += p->n
22a90 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20  Alloc + 100;.   
22aa0 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f   p->z = sqlite3_
22ab0 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20  realloc64(p->z, 
22ac0 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
22ad0 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 68  if( p->z==0 ) sh
22ae0 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
22af0 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 5b  y();.  }.  p->z[
22b00 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72 29  p->n++] = (char)
22b10 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  c;.}../* Read a 
22b20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
22b30 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70 61  CSV text.  Compa
22b40 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34 31  tible with rfc41
22b50 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64 0a  80 and extended.
22b60 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74 69  ** with the opti
22b70 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20 73  on of having a s
22b80 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20 74  eparator other t
22b90 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20 20  han ","..**.**  
22ba0 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
22bb0 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
22bc0 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
22bd0 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
22be0 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
22bf0 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
22c00 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
22c10 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
22c20 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
22c30 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
22c40 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
22c50 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
22c60 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  s ","..**   +  U
22c70 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
22c80 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
22c90 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
22ca0 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20 4b   "\n"..**   +  K
22cb0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
22cc0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e 20   line number in 
22cd0 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
22ce0 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
22cf0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
22d00 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
22d10 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
22d20 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
22d30 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
22d40 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
22d50 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
22d60 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
22d70 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
22d80 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  ECL csv_read_one
22d90 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74 78  _field(ImportCtx
22da0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20   *p){.  int c;. 
22db0 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e 63   int cSep = p->c
22dc0 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72 53  ColSep;.  int rS
22dd0 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70 3b  ep = p->cRowSep;
22de0 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63  .  p->n = 0;.  c
22df0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
22e00 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c 7c  .  if( c==EOF ||
22e10 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 29   seenInterrupt )
22e20 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  {.    p->cTerm =
22e30 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72 6e   EOF;.    return
22e40 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d   0;.  }.  if( c=
22e50 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='"' ){.    int 
22e60 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e 74  pc, ppc;.    int
22e70 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d 3e   startLine = p->
22e80 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20 63  nLine;.    int c
22e90 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20 70  Quote = c;.    p
22ea0 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20 20  c = ppc = 0;.   
22eb0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
22ec0 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
22ed0 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  in);.      if( c
22ee0 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69 6e  ==rSep ) p->nLin
22ef0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  e++;.      if( c
22f00 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
22f10 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
22f20 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
22f30 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
22f40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22f60 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65 70      if( (c==cSep
22f70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29 0a   && pc==cQuote).
22f80 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72 53         || (c==rS
22f90 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  ep && pc==cQuote
22fa0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
22fb0 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72 27  rSep && pc=='\r'
22fc0 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65 29   && ppc==cQuote)
22fd0 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 45  .       || (c==E
22fe0 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65  OF && pc==cQuote
22ff0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
23000 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20 7d     do{ p->n--; }
23010 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e 6e  while( p->z[p->n
23020 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20 20  ]!=cQuote );.   
23030 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
23040 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
23050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23060 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 26  if( pc==cQuote &
23070 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20 20  & c!='\r' ){.   
23080 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
23090 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
230a0 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63 68   unescaped %c ch
230b0 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20 20  aracter\n",.    
230c0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
230d0 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c 20  File, p->nLine, 
230e0 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 7d  cQuote);.      }
230f0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45 4f  .      if( c==EO
23100 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  F ){.        utf
23110 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
23120 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d 69   "%s:%d: untermi
23130 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64 20  nated %c-quoted 
23140 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  field\n",.      
23150 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 69            p->zFi
23160 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 63  le, startLine, c
23170 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
23180 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
23190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
231a0 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f 72     }.      impor
231b0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
231c0 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20 3d   c);.      ppc =
231d0 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d 20   pc;.      pc = 
231e0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
231f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
23200 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
23210 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65 64  eld being parsed
23220 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20 77   and it begins w
23230 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 55  ith the.    ** U
23240 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46 20  TF-8 BOM  (0xEF 
23250 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69 70  BB BF) then skip
23260 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20 20   the BOM */.    
23270 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
23280 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69 72  ef && p->bNotFir
23290 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st==0 ){.      i
232a0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
232b0 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
232c0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
232d0 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78  .      if( (c&0x
232e0 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20 20  ff)==0xbb ){.   
232f0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
23300 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
23310 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63         c = fgetc
23320 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 20  (p->in);.       
23330 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
23340 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xbf ){.         
23350 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
23360 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
23370 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
23380 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61 64   return csv_read
23390 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a 20  _one_field(p);. 
233a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
233b0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
233c0 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d 63  ( c!=EOF && c!=c
233d0 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20 29  Sep && c!=rSep )
233e0 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
233f0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
23400 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
23410 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d 0a  c(p->in);.    }.
23420 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
23430 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69 6e  ){.      p->nLin
23440 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
23450 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70 2d  ->n>0 && p->z[p-
23460 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70 2d  >n-1]=='\r' ) p-
23470 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >n--;.    }.    
23480 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20  p->cTerm = c;.  
23490 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70  }.  if( p->z ) p
234a0 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  ->z[p->n] = 0;. 
234b0 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d 20   p->bNotFirst = 
234c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  1;.  return p->z
234d0 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20 73  ;.}../* Read a s
234e0 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20 41  ingle field of A
234f0 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20 74  SCII delimited t
23500 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20  ext..**.**   +  
23510 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d  Input comes from
23520 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20   p->in..**   +  
23530 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
23540 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20   p->z of length 
23550 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  p->n.  Space to 
23560 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a  hold p->z comes.
23570 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c  **      from sql
23580 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e  ite3_malloc64().
23590 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
235a0 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75  cSep as the colu
235b0 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54  mn separator.  T
235c0 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22 5c  he default is "\
235d0 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  x1F"..**   +  Us
235e0 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68 65  e p->rSep as the
235f0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e 20   row separator. 
23600 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
23610 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20 20  "\x1E"..**   +  
23620 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
23630 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e 20  e row number in 
23640 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20 2b  p->nLine..**   +
23650 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61 72    Store the char
23660 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
23670 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64 20  nates the field 
23680 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53 74  in p->cTerm.  St
23690 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46 20  ore.**      EOF 
236a0 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e 0a  on end-of-file..
236b0 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20 73  **   +  Report s
236c0 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e 20  yntax errors on 
236d0 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69 63  stderr.*/.static
236e0 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43 44   char *SQLITE_CD
236f0 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f 6f  ECL ascii_read_o
23700 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43  ne_field(ImportC
23710 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b  tx *p){.  int c;
23720 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d  .  int cSep = p-
23730 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20  >cColSep;.  int 
23740 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65  rSep = p->cRowSe
23750 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20  p;.  p->n = 0;. 
23760 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
23770 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20  );.  if( c==EOF 
23780 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  || seenInterrupt
23790 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d   ){.    p->cTerm
237a0 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75   = EOF;.    retu
237b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rn 0;.  }.  whil
237c0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
237d0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
237e0 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  ){.    import_ap
237f0 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
23800 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70  .    c = fgetc(p
23810 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->in);.  }.  if(
23820 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
23830 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d 0a  p->nLine++;.  }.
23840 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a    p->cTerm = c;.
23850 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d 3e    if( p->z ) p->
23860 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 72  z[p->n] = 0;.  r
23870 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
23880 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e  *.** Try to tran
23890 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74 61  sfer data for ta
238a0 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66 20  ble zTable.  If 
238b0 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
238c0 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e 67   while.** moving
238d0 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74 6f   forward, try to
238e0 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20 20   go backwards.  
238f0 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d 6f  The backwards mo
23900 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a 20  vement won't.** 
23910 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55 54  work for WITHOUT
23920 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a 2a   ROWID tables..*
23930 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
23940 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20 20  yToCloneData(.  
23950 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
23960 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
23970 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23980 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69 74  Table.){.  sqlit
23990 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20  e3_stmt *pQuery 
239a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
239b0 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20 30  tmt *pInsert = 0
239c0 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79  ;.  char *zQuery
239d0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 49   = 0;.  char *zI
239e0 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
239f0 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c   rc;.  int i, j,
23a00 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c 65   n;.  int nTable
23a10 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61 62   = strlen30(zTab
23a20 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20 30  le);.  int k = 0
23a30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
23a40 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70 69  .  const int spi
23a50 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a 0a  nRate = 10000;..
23a60 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
23a70 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
23a80 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
23a90 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72 63  ", zTable);.  rc
23aa0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
23ab0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
23ac0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
23ad0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
23ae0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
23af0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
23b00 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
23b10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23b20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
23b30 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
23b40 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
23b50 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
23b60 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
23b70 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
23b80 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73  fer;.  }.  n = s
23b90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
23ba0 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20 7a  unt(pQuery);.  z
23bb0 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Insert = sqlite3
23bc0 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b 20  _malloc64(200 + 
23bd0 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a 20  nTable + n*3);. 
23be0 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30 20   if( zInsert==0 
23bf0 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
23c00 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69 74  emory();.  sqlit
23c10 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30 2b  e3_snprintf(200+
23c20 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c 0a  nTable,zInsert,.
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
23c50 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c 22  NORE INTO \"%s\"
23c60 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62   VALUES(?", zTab
23c70 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  le);.  i = strle
23c80 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20 20  n30(zInsert);.  
23c90 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b  for(j=1; j<n; j+
23ca0 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  +){.    memcpy(z
23cb0 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c 20  Insert+i, ",?", 
23cc0 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b 0a  2);.    i += 2;.
23cd0 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49 6e    }.  memcpy(zIn
23ce0 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33 29  sert+i, ");", 3)
23cf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23d00 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77 44  _prepare_v2(newD
23d10 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c 20  b, zInsert, -1, 
23d20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20 20  &pInsert, 0);.  
23d30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
23d40 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
23d50 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
23d60 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
23d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23d80 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
23d90 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65 33  (newDb), sqlite3
23da0 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c 0a  _errmsg(newDb),.
23db0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
23dc0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
23dd0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
23de0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b  .  for(k=0; k<2;
23df0 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c 65   k++){.    while
23e00 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
23e10 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
23e20 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
23e30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
23e40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
23e50 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f 63  witch( sqlite3_c
23e60 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65 72  olumn_type(pQuer
23e70 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  y, i) ){.       
23e80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
23e90 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ULL: {.         
23ea0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
23eb0 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69 2b  null(pInsert, i+
23ec0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
23ed0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
23ef0 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
23f00 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
23f10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
23f20 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  64(pInsert, i+1,
23f30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23f40 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29 29  int64(pQuery,i))
23f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23f70 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
23f80 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a  SQLITE_FLOAT: {.
23f90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23fa0 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
23fb0 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71  pInsert, i+1, sq
23fc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
23fd0 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b 0a  ble(pQuery,i));.
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23ff0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
24000 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
24010 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20 20  LITE_TEXT: {.   
24020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24030 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73 65  _bind_text(pInse
24040 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20 20  rt, i+1,.       
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
24070 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
24080 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69 29  n_text(pQuery,i)
24090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
240b0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
240c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
240d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
240e0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
240f0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a   SQLITE_BLOB: {.
24100 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24110 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
24120 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
24130 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
24140 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
24180 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75 65  olumn_bytes(pQue
24190 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43     SQLITE_STATIC
241d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
241e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
241f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24200 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20 2a    } /* End for *
24210 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
24220 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65 72  ite3_step(pInser
24230 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
24240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
24250 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26  c!=SQLITE_ROW &&
24260 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
24270 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
24280 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24290 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e 22  "Error %d: %s\n"
242a0 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  , sqlite3_extend
242b0 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
242c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
242d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
242e0 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29  e3_errmsg(newDb)
242f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24300 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
24310 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 63  Insert);.      c
24320 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
24330 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d 3d  (cnt%spinRate)==
24340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
24350 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f 2d  ntf("%c\b", "|/-
24360 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61 74  \\"[(cnt/spinRat
24370 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  e)%4]);.        
24380 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
24390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a        }.    } /*
243a0 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20 20   End while */.  
243b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
243c0 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20  _DONE ) break;. 
243d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
243e0 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
243f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
24400 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
24410 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
24420 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
24430 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52 20  OM \"%w\" ORDER 
24440 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22 2c  BY rowid DESC;",
24450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
24470 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  able);.    rc = 
24480 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
24490 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
244a0 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
244b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
244c0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
244d0 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e  tf(stderr, "Warn
244e0 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65 70  ing: cannot step
244f0 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72 64   \"%s\" backward
24500 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  s", zTable);.   
24510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
24520 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28 6b    } /* End for(k
24530 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64  =0...) */..end_d
24540 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69  ata_xfer:.  sqli
24550 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
24560 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
24570 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72 74  finalize(pInsert
24580 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
24590 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(zQuery);.  sql
245a0 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65 72  ite3_free(zInser
245b0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  t);.}.../*.** Tr
245c0 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61 6c  y to transfer al
245d0 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73 63  l rows of the sc
245e0 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68 20  hema that match 
245f0 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a 20  zWhere.  For.** 
24600 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b 65  each row, invoke
24610 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20 74   xForEach() on t
24620 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e 65  he object define
24630 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a 2a  d by that row..*
24640 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
24650 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
24660 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  le moving forwar
24670 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a 2a  d through the.**
24680 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
24690 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e 20  able, try again 
246a0 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64 73  moving backwards
246b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
246c0 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
246d0 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  a(.  ShellState 
246e0 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e  *p,.  sqlite3 *n
246f0 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  ewDb,.  const ch
24700 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76 6f  ar *zWhere,.  vo
24710 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28 53  id (*xForEach)(S
24720 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69 74  hellState*,sqlit
24730 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  e3*,const char*)
24740 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
24750 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a  mt *pQuery = 0;.
24760 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20 3d    char *zQuery =
24770 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
24780 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
24790 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f  har *zName;.  co
247a0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
247b0 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
247c0 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  *zErrMsg = 0;.. 
247d0 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
247e0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
247f0 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d  T name, sql FROM
24800 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
24830 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29 3b  RE %s", zWhere);
24840 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
24850 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
24860 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
24870 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28  Query, 0);.  if(
24880 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
24890 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
248a0 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
248b0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
248d0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
248e0 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
248f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
24900 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
24910 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
24920 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
24930 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20  _schema_xfer;.  
24940 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  }.  while( (rc =
24950 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
24960 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
24970 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  OW ){.    zName 
24980 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
24990 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30 29  _text(pQuery, 0)
249a0 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
249b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
249c0 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20  (pQuery, 1);.   
249d0 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
249e0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
249f0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73 71  (stdout);.    sq
24a00 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
24a10 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
24a20 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
24a30 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Msg);.    if( zE
24a40 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
24a50 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
24a60 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53  r, "Error: %s\nS
24a70 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72  QL: [%s]\n", zEr
24a80 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  rMsg, zSql);.   
24a90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24aa0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
24ab0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
24ac0 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72 45   }.    if( xForE
24ad0 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46 6f  ach ){.      xFo
24ae0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
24af0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
24b00 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
24b10 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b  rintf("done\n");
24b20 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
24b30 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
24b40 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
24b50 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20 20  ze(pQuery);.    
24b60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
24b70 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72 79  ery);.    zQuery
24b80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24b90 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
24ba0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
24bb0 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
24be0 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
24bf0 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b 0a  DESC", zWhere);.
24c00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24c10 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
24c20 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
24c30 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
24c40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
24c50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24c60 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29  rr, "Error: (%d)
24c70 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a   %s on [%s]\n",.
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
24ca0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70  tended_errcode(p
24cb0 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ->db), sqlite3_e
24cc0 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20  rrmsg(p->db),.  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
24cf0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
24d00 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a 20  ma_xfer;.    }. 
24d10 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
24d20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
24d30 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
24d40 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  W ){.      zName
24d50 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24d60 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
24d70 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
24d80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24d90 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a  ext(pQuery, 1);.
24da0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
24db0 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66  ... ", zName); f
24dc0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
24dd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
24de0 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  c(newDb, (const 
24df0 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30  char*)zSql, 0, 0
24e00 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
24e10 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
24e20 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
24e30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
24e40 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
24e50 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
24e60 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
24e70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
24e80 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7a  rMsg);.        z
24e90 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
24ea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78 46    }.      if( xF
24eb0 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20  orEach ){.      
24ec0 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65    xForEach(p, ne
24ed0 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
24ee0 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  *)zName);.      
24ef0 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  }.      printf("
24f00 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  done\n");.    }.
24f10 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f 78    }.end_schema_x
24f20 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
24f30 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
24f40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24f50 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zQuery);.}../*.*
24f60 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
24f70 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 64  abase file named
24f80 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79 20   "zNewDb".  Try 
24f90 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d 75  to recover as mu
24fa0 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ch information.*
24fb0 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f 75  * as possible ou
24fc0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61  t of the main da
24fd0 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d 69  tabase (which mi
24fe0 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29 20  ght be corrupt) 
24ff0 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  and write it.** 
25000 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a  into zNewDb..*/.
25010 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
25020 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61 74  oClone(ShellStat
25030 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
25040 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e 74   *zNewDb){.  int
25050 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
25060 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66 28  newDb = 0;.  if(
25070 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c 30   access(zNewDb,0
25080 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  )==0 ){.    utf8
25090 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
250a0 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c 72  "File \"%s\" alr
250b0 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22 2c  eady exists.\n",
250c0 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72 65   zNewDb);.    re
250d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
250e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 4e   sqlite3_open(zN
250f0 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a 20  ewDb, &newDb);. 
25100 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
25110 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
25120 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61 74  r, "Cannot creat
25130 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61 73  e output databas
25140 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  e: %s\n",.      
25150 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
25160 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
25170 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
25180 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
25190 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
251a0 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20  schema=ON;", 0, 
251b0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
251c0 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22  e3_exec(newDb, "
251d0 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b  BEGIN EXCLUSIVE;
251e0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
251f0 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
25200 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
25210 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79 54  e='table'", tryT
25220 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20 20  oCloneData);.   
25230 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65 6d   tryToCloneSchem
25240 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79 70  a(p, newDb, "typ
25250 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29 3b  e!='table'", 0);
25260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
25270 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49 54  c(newDb, "COMMIT
25280 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
25290 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
252a0 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72  ->db, "PRAGMA wr
252b0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46  itable_schema=OF
252c0 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
252d0 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e 65   }.  close_db(ne
252e0 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
252f0 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
25300 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
25310 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  dout..**.** If t
25320 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  he p->doXdgOpen 
25330 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 61  flag is set, tha
25340 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70  t means the outp
25350 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20  ut was being.** 
25360 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61 20  redirected to a 
25370 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
25380 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70  amed by p->zTemp
25390 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  File.  In that c
253a0 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73  ase,.** launch s
253b0 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70  tart/open/xdg-op
253c0 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  en on that tempo
253d0 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  rary file..*/.st
253e0 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
253f0 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74  _reset(ShellStat
25400 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
25410 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  outfile[0]=='|' 
25420 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
25430 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20  E_OMIT_POPEN.   
25440 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b   pclose(p->out);
25450 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
25460 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65  .    output_file
25470 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a  _close(p->out);.
25480 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
25490 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20  OHAVE_SYSTEM.   
254a0 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65   if( p->doXdgOpe
254b0 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  n ){.      const
254c0 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43   char *zXdgOpenC
254d0 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64  md =.#if defined
254e0 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22  (_WIN32).      "
254f0 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65  start";.#elif de
25500 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
25510 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23  .      "open";.#
25520 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d  else.      "xdg-
25530 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20  open";.#endif.  
25540 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a      char *zCmd;.
25550 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c        zCmd = sql
25560 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
25570 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d   %s", zXdgOpenCm
25580 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  d, p->zTempFile)
25590 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73 74  ;.      if( syst
255a0 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20  em(zCmd) ){.    
255b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
255c0 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a  stderr, "Failed:
255d0 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b   [%s]\n", zCmd);
255e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
255f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
25600 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d  );.      outputM
25610 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20  odePop(p);.     
25620 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20   p->doXdgOpen = 
25630 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
25640 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
25650 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
25660 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48  fined(SQLITE_NOH
25670 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20  AVE_SYSTEM) */. 
25680 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b   }.  p->outfile[
25690 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74  0] = 0;.  p->out
256a0 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a   = stdout;.}../*
256b0 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63  .** Run an SQL c
256c0 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72  ommand and retur
256d0 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74  n the single int
256e0 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  eger result..*/.
256f0 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e  static int db_in
25700 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  t(ShellState *p,
25710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
25720 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l){.  sqlite3_st
25730 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
25740 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69   res = 0;.  sqli
25750 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
25760 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
25770 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
25780 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74  ( pStmt && sqlit
25790 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
257a0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
257b0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
257c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
257d0 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ,0);.  }.  sqlit
257e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
257f0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  t);.  return res
25800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
25810 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34  rt a 2-byte or 4
25820 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
25830 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
25840 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
25850 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
25860 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49 6e  d int get2byteIn
25870 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t(unsigned char 
25880 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  *a){.  return (a
25890 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a  [0]<<8) + a[1];.
258a0 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  }.static unsigne
258b0 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e  d int get4byteIn
258c0 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t(unsigned char 
258d0 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  *a){.  return (a
258e0 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d  [0]<<24) + (a[1]
258f0 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38  <<16) + (a[2]<<8
25900 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a  ) + a[3];.}../*.
25910 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
25920 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22  n of the ".info"
25930 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
25940 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f  Return 1 on erro
25950 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e  r, 2 to exit, an
25960 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  d 0 otherwise..*
25970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
25980 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e  ll_dbinfo_comman
25990 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  d(ShellState *p,
259a0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
259b0 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74  **azArg){.  stat
259c0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
259d0 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
259e0 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d  ame; int ofst; }
259f0 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20   aField[] = {.  
25a00 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67     { "file chang
25a10 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34  e counter:",  24
25a20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74    },.     { "dat
25a30 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
25a40 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20  :",  28  },.    
25a50 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61 67   { "freelist pag
25a60 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20  e count:",  36  
25a70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
25a80 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20  a cookie:",     
25a90 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b     40  },.     {
25aa0 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a   "schema format:
25ab0 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c  ",        44  },
25ac0 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74  .     { "default
25ad0 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20   cache size:",  
25ae0 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   48  },.     { "
25af0 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72  autovacuum top r
25b00 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20  oot:",  52  },. 
25b10 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74      { "increment
25b20 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36  al vacuum:",   6
25b30 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65  4  },.     { "te
25b40 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20  xt encoding:",  
25b50 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20        56  },.   
25b60 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f    { "user versio
25b70 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30 20  n:",         60 
25b80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c   },.     { "appl
25b90 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20  ication id:",   
25ba0 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20      68  },.     
25bb0 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72 73  { "software vers
25bc0 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d  ion:",     96  }
25bd0 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
25be0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
25bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
25c00 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  ; const char *zS
25c10 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d  ql; } aQuery[] =
25c20 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65   {.     { "numbe
25c30 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20  r of tables:",. 
25c40 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
25c50 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
25c60 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
25c70 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
25c80 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a  mber of indexes:
25c90 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
25ca0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
25cb0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  %s WHERE type='i
25cc0 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b  ndex'" },.     {
25cd0 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67   "number of trig
25ce0 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  gers:",.       "
25cf0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
25d00 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
25d10 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c  pe='trigger'" },
25d20 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
25d30 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20  of views:",.    
25d40 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
25d50 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
25d60 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d  E type='view'" }
25d70 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
25d80 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20   size:",.       
25d90 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65  "SELECT total(le
25da0 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20  ngth(sql)) FROM 
25db0 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  %s" },.  };.  in
25dc0 74 20 69 2c 20 72 63 3b 0a 20 20 75 6e 73 69 67  t i, rc;.  unsig
25dd0 6e 65 64 20 69 44 61 74 61 56 65 72 73 69 6f 6e  ned iDataVersion
25de0 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  ;.  char *zSchem
25df0 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44  aTab;.  char *zD
25e00 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  b = nArg>=2 ? az
25e10 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b  Arg[1] : "main";
25e20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
25e30 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  *pStmt = 0;.  un
25e40 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64 72  signed char aHdr
25e50 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62  [100];.  open_db
25e60 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d  (p, 0);.  if( p-
25e70 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
25e80 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
25e90 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
25ea0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
25eb0 20 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52   "SELECT data FR
25ec0 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
25ed0 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f 3d  (?1) WHERE pgno=
25ee0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
25ef0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
25f00 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
25f10 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 63 6f   if( !sqlite3_co
25f20 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
25f30 28 22 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  ("ENABLE_DBPAGE_
25f40 56 54 41 42 22 29 20 29 7b 0a 20 20 20 20 20 20  VTAB") ){.      
25f50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25f60 72 72 2c 20 22 74 68 65 20 5c 22 2e 64 62 69 6e  rr, "the \".dbin
25f70 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64 20 72 65 71  fo\" command req
25f80 75 69 72 65 73 20 74 68 65 20 22 0a 20 20 20 20  uires the ".    
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 20 22 2d 44 53 51 4c 49 54 45 5f        "-DSQLITE_
25fb0 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
25fc0 41 42 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  AB compile-time 
25fd0 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b 0a 20 20 20  options\n");.   
25fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
25ff0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
26000 2c 20 22 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "error: %s\n",
26010 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26020 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  p->db));.    }. 
26030 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
26040 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
26050 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
26060 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
26070 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c  t(pStmt, 1, zDb,
26080 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
26090 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  IC);.  if( sqlit
260a0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
260b0 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26  SQLITE_ROW.   &&
260c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
260d0 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31  bytes(pStmt,0)>1
260e0 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  00.  ){.    memc
260f0 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33  py(aHdr, sqlite3
26100 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
26110 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20  mt,0), 100);.   
26120 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
26130 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
26140 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
26150 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c  f(stderr, "unabl
26160 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  e to read databa
26170 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20  se header\n");. 
26180 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
26190 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
261a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
261b0 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28  i = get2byteInt(
261c0 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20  aHdr+16);.  if( 
261d0 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36  i==1 ) i = 65536
261e0 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
261f0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26200 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20  d\n", "database 
26210 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b  page size:", i);
26220 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
26230 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
26240 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d  \n", "write form
26250 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b  at:", aHdr[18]);
26260 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
26270 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
26280 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61  \n", "read forma
26290 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a  t:", aHdr[19]);.
262a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
262b0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
262c0 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79  n", "reserved by
262d0 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29  tes:", aHdr[20])
262e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
262f0 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29  rraySize(aField)
26300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
26310 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d  ofst = aField[i]
26320 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67  .ofst;.    unsig
26330 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65  ned int val = ge
26340 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b  t4byteInt(aHdr +
26350 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38   ofst);.    utf8
26360 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26370 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65  "%-20s %u", aFie
26380 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ld[i].zName, val
26390 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
263a0 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  fst ){.      cas
263b0 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20  e 56: {.        
263c0 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77  if( val==1 ) raw
263d0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
263e0 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20  " (utf8)");.    
263f0 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29      if( val==2 )
26400 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
26410 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22  ut, " (utf16le)"
26420 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
26430 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e  al==3 ) raw_prin
26440 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
26450 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20  f16be)");.      
26460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  }.    }.    raw_
26470 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26480 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
26490 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  zDb==0 ){.    zS
264a0 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
264b0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e  e3_mprintf("main
264c0 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  .sqlite_master")
264d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
264e0 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29  rcmp(zDb,"temp")
264f0 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
26500 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
26510 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73  mprintf("%s", "s
26520 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
26530 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r");.  }else{.  
26540 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
26550 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26560 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  \"%w\".sqlite_ma
26570 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  ster", zDb);.  }
26580 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
26590 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b  raySize(aQuery);
265a0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
265b0 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
265c0 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69  mprintf(aQuery[i
265d0 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54  ].zSql, zSchemaT
265e0 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  ab);.    int val
265f0 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71   = db_int(p, zSq
26600 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
26610 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
26620 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26630 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
26640 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d  , aQuery[i].zNam
26650 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e, val);.  }.  s
26660 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68  qlite3_free(zSch
26670 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  emaTab);.  sqlit
26680 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
26690 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  p->db, zDb, SQLI
266a0 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45  TE_FCNTL_DATA_VE
266b0 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56 65 72  RSION, &iDataVer
266c0 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70 72  sion);.  utf8_pr
266d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
266e0 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61 74 61  20s %u\n", "data
266f0 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61 74 61   version", iData
26700 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74 75  Version);.  retu
26710 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
26720 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74  rint the current
26730 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26740 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72  ) value to stder
26750 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
26760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
26770 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
26780 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
26790 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
267a0 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
267b0 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70  sg(db);.  utf8_p
267c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
267d0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
267e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  r);.  return 1;.
267f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
26800 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20   the pattern in 
26810 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20  zGlob[] against 
26820 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e  the text in z[].
26830 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a    Return TRUE.**
26840 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61   if they match a
26850 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20  nd FALSE (0) if 
26860 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
26870 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  h..**.** Globbin
26880 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
26890 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
268a0 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
268b0 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
268c0 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
268d0 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
268e0 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
268f0 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
26900 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
26910 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
26920 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
26930 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
26940 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
26950 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
26960 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
26970 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
26980 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
26990 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
269a0 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
269b0 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20        '#'       
269c0 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
269d0 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
269e0 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20  ore digits with 
269f0 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
26a00 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20       optional + 
26a10 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f  or - sign in fro
26a20 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20  nt.**.**      ' 
26a30 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e  '       Any span
26a40 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d   of whitespace m
26a50 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72  atches any other
26a60 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20   span of.**     
26a70 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65             white
26a80 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  space..**.** Ext
26a90 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74  ra whitespace at
26aa0 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20   the end of z[] 
26ab0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73  is ignored..*/.s
26ac0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61  tatic int testca
26ad0 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68  se_glob(const ch
26ae0 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74  ar *zGlob, const
26af0 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
26b00 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
26b10 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
26b20 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
26b30 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d   (*(zGlob++)))!=
26b40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53  0 ){.    if( IsS
26b50 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
26b60 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a   if( !IsSpace(*z
26b70 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
26b80 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
26b90 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c  ce(*zGlob) ) zGl
26ba0 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  ob++;.      whil
26bb0 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
26bc0 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
26bd0 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20  if( c=='*' ){.  
26be0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
26bf0 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27  (zGlob++))) == '
26c00 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a  *' || c=='?' ){.
26c10 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
26c20 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d  ?' && (*(z++))==
26c30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26c40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26c50 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
26c60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
26c70 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
26c80 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
26c90 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73  e( *z && testcas
26ca0 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a  e_glob(zGlob-1,z
26cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26cc0 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    z++;.        }
26cd0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26ce0 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  (*z)!=0;.      }
26cf0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
26d00 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30  2 = (*(z++)))!=0
26d10 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
26d20 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20  e( c2!=c ){.    
26d30 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b        c2 = *(z++
26d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26d50 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
26d60 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
26d70 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73       if( testcas
26d80 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  e_glob(zGlob,z) 
26d90 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
26da0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
26db0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
26dc0 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
26dd0 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
26de0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
26df0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
26e00 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
26e10 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
26e20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
26e30 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
26e40 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
26e50 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
26e60 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
26e70 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
26e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
26e90 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
26ea0 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
26eb0 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
26ec0 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
26ed0 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
26ee0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
26ef0 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
26f00 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
26f10 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
26f20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
26f30 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
26f40 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
26f50 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
26f60 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
26f70 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
26f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
26f90 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
26fa0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
26fb0 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
26fc0 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
26fd0 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
26fe0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
26ff0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
27000 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
27010 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
27020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27030 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
27040 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
27050 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
27060 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
27070 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
27080 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
27090 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
270a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
270b0 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
270c0 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
270d0 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49   z[0]=='+') && I
270e0 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sDigit(z[1]) ) z
270f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
27100 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sDigit(z[0]) ) r
27110 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
27120 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
27130 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29   IsDigit(z[0]) )
27140 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
27150 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
27160 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
27170 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
27180 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
27190 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
271a0 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
271b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
271c0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61   the string as a
271d0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
271e0 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72  tion with either
271f0 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69   one or two.** i
27200 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61  nitial "-" chara
27210 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
27220 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68   int optionMatch
27230 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
27240 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
27250 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72  Opt){.  if( zStr
27260 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  [0]!='-' ) retur
27270 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20  n 0;.  zStr++;. 
27280 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d   if( zStr[0]=='-
27290 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65  ' ) zStr++;.  re
272a0 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72  turn strcmp(zStr
272b0 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f  , zOpt)==0;.}../
272c0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69  *.** Delete a fi
272d0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c  le..*/.int shell
272e0 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74  DeleteFile(const
272f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
27300 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  ){.  int rc;.#if
27310 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68  def _WIN32.  wch
27320 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
27330 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
27340 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
27350 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c  e);.  rc = _wunl
27360 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ink(z);.  sqlite
27370 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
27380 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a  .  rc = unlink(z
27390 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
273a0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
273b0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
273c0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
273d0 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65  ary file (if the
273e0 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66  re is one) and f
273f0 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72  ree the.** memor
27400 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  y used to hold t
27410 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
27420 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  emp file..*/.sta
27430 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65  tic void clearTe
27440 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
27450 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
27460 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  zTempFile==0 ) r
27470 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
27480 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75  doXdgOpen ) retu
27490 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44  rn;.  if( shellD
274a0 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65  eleteFile(p->zTe
274b0 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e  mpFile) ) return
274c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
274d0 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
274e0 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
274f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
27500 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66  ate a new temp f
27510 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68  ile name with th
27520 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a  e given suffix..
27530 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
27540 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  ewTempFile(Shell
27550 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
27560 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a  char *zSuffix){.
27570 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28    clearTempFile(
27580 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
27590 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  ee(p->zTempFile)
275a0 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ;.  p->zTempFile
275b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64   = 0;.  if( p->d
275c0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
275d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
275e0 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  >db, 0, SQLITE_F
275f0 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
27600 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  E, &p->zTempFile
27610 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
27620 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
27630 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
27640 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
27650 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
27660 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
27670 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
27680 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27690 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72  "temp%llx.%s", r
276a0 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  , zSuffix);.  }e
276b0 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d  lse{.    p->zTem
276c0 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
276d0 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c  mprintf("%z.%s",
276e0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a   p->zTempFile, z
276f0 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69  Suffix);.  }.  i
27700 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
27710 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
27720 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
27730 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
27740 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
27750 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
27760 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
27770 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
27780 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
27790 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
277a0 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
277b0 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
277c0 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
277d0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
277e0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
277f0 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
27800 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
27810 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
27820 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
27830 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
27840 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
27850 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
27860 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
27870 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
27880 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
27890 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
278a0 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
278b0 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
278c0 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
278d0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
278e0 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
278f0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
27900 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
27910 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
27920 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
27930 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
27940 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
27950 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
27960 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
27970 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
27980 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
27990 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
279a0 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
279b0 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
279c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
279d0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
279e0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
279f0 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
27a00 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
27a10 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
27a20 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
27a30 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
27a40 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
27a50 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
27a60 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
27a70 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
27a80 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
27a90 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
27aa0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
27ab0 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
27ac0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
27ad0 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
27ae0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
27af0 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
27b00 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
27b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
27b20 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
27b30 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
27b40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27b50 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
27b60 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
27b70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
27b80 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
27b90 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
27ba0 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
27bb0 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
27bc0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
27bd0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
27be0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
27bf0 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
27c00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27c10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
27c20 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
27c30 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
27c40 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
27c50 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
27c60 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
27c70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27c80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
27c90 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
27ca0 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
27cb0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
27cc0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
27cd0 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
27ce0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
27cf0 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
27d00 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
27d10 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
27d20 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
27d30 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
27d40 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
27d50 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
27d60 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
27d70 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
27d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
27da0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
27db0 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
27dc0 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
27dd0 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
27de0 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
27df0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
27e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27e10 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
27e20 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
27e30 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
27e40 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
27e50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
27e60 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
27e70 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
27e80 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
27e90 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
27ea0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
27eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27ec0 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
27ed0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
27ee0 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
27ef0 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
27f00 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
27f10 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
27f20 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
27f30 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
27f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
27f50 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
27f60 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
27f70 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f90 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
27fa0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
27fb0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
27fc0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fe0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
27ff0 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
28000 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
28010 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
28020 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
28030 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
28040 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
28050 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
28060 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
28070 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
28080 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
28090 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
280a0 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
280b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
280c0 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
280d0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
280e0 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
280f0 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
28100 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
28110 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
28120 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
28150 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
28160 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
28170 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
28180 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
28190 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
281a0 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
281b0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
281e0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
281f0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
28200 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
28210 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
28220 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
28230 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
28240 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
28250 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
28260 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
28270 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
28280 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
28290 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
282a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
282b0 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
282c0 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
282d0 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
282e0 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
282f0 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
28300 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
28310 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
28320 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
28330 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
28340 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
28350 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
28360 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
28370 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
28380 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
28390 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
283a0 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
283b0 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
283c0 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
283d0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
283e0 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
283f0 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
28400 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
28410 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
28420 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
28430 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
28440 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
28450 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
28460 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
28470 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
28480 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
28490 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
284a0 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
284b0 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
284c0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
284d0 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
284e0 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
284f0 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
28500 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
28510 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
28520 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
28530 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
28540 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
28550 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
28560 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
28570 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
28580 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
28590 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
285a0 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
285b0 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
285c0 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
285d0 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
285e0 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
285f0 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
28600 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
28610 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
28620 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
28630 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
28640 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
28650 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
28660 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
28670 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
28680 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
28690 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
286a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
286b0 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
286c0 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
286d0 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
286e0 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
286f0 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
28700 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
28710 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
28720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28730 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
28740 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
28750 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
28760 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
28770 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
28780 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
28790 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
287a0 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
287b0 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
287c0 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
287d0 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
287e0 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
287f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28800 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
28810 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
28820 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
28830 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
28840 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
28850 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
28860 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
28870 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
28880 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
28890 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
288a0 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
288b0 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
288c0 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
288d0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
288e0 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
288f0 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
28900 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
28910 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
28920 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
28930 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
28940 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
28950 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
28960 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
28970 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
28980 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
28990 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
289a0 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
289b0 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
289c0 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
289d0 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
289e0 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
289f0 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
28a00 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28a10 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
28a20 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
28a30 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
28a40 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
28a50 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
28a60 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
28a70 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
28a80 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
28a90 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
28aa0 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
28ab0 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
28ac0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
28ad0 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
28ae0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
28af0 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
28b00 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
28b10 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
28b20 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
28b30 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
28b40 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
28b50 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
28b60 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
28b70 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
28b80 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
28b90 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
28ba0 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
28bb0 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
28bc0 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
28bd0 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
28be0 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
28bf0 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
28c00 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
28c10 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
28c20 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
28c30 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
28c40 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
28c50 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
28c60 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
28c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
28c80 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
28c90 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
28ca0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
28cb0 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
28cc0 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
28cd0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
28ce0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
28cf0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
28d00 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
28d10 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
28d20 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
28d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
28d40 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
28d50 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
28d60 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
28d70 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
28d80 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
28d90 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
28da0 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
28db0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
28dc0 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
28dd0 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
28de0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
28df0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
28e00 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
28e10 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
28e20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
28e30 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
28e40 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
28e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28e60 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
28e70 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
28e80 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
28e90 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
28ea0 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
28eb0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
28ec0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
28ed0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
28ee0 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
28ef0 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
28f00 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
28f10 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
28f20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28f30 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
28f40 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
28f50 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
28f60 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
28f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
28f90 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
28fa0 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
28fb0 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
28fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28fd0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
28fe0 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
28ff0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
29000 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
29010 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
29020 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
29030 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
29040 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
29050 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
29060 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
29070 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
29080 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
29090 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
290a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
290b0 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
290c0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
290d0 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
290e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
290f0 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
29100 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
29110 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
29120 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
29130 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
29140 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
29150 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
29160 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
29170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
29180 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
29190 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
291a0 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
291b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
291c0 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
291d0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
291e0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
291f0 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
29200 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
29210 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
29220 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
29230 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29240 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
29250 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
29260 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
29270 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
29280 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
29290 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
292a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
292b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
292c0 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
292d0 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
292e0 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
292f0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
29300 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
29310 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
29320 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
29330 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
29340 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
29350 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
29360 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
29370 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
29380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29390 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
293a0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
293b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
293c0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
293d0 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
293e0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
293f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29400 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
29410 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
29420 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
29430 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
29440 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
29450 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
29460 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
29470 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
29480 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
29490 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
294a0 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
294b0 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
294c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
294d0 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
294e0 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
294f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
29500 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
29510 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
29520 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
29530 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29540 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
29550 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
29560 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
29570 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
29580 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
29590 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
295a0 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
295b0 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
295c0 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
295d0 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
295e0 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
295f0 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
29600 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
29610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29620 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29630 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
29640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29660 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29670 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
29680 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
29690 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
296a0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
296b0 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
296c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
296d0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
296e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
296f0 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
29700 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
29710 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
29720 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
29730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
29740 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29750 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
29760 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
29770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29780 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
29790 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
297a0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
297b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
297c0 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
297d0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
297e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
297f0 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
29800 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
29810 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29830 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
29840 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
29850 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
29860 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
29890 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
298a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
298b0 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
298c0 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
298d0 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
298e0 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
298f0 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
29900 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
29910 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
29920 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
29930 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
29940 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
29950 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
29960 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29970 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
29980 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
29990 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
299a0 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
299b0 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
299c0 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
299d0 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
299e0 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
299f0 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
29a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29a10 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21  _ERROR;.}..#if !
29a20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
29a30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
29a40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
29a50 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c  llPrepare(.  sql
29a60 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
29a70 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20   *pRc, .  const 
29a80 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73  char *zSql, .  s
29a90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
29aa0 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
29ab0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
29ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29ad0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
29ae0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
29af0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
29b00 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
29b10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29b20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
29b30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
29b40 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c   error: %s (%d)\
29b50 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  n", .          s
29b60 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
29b70 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  ), sqlite3_errco
29b80 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a  de(db).      );.
29b90 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
29ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
29bb0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 70 72 65  .** Create a pre
29bc0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
29bd0 75 73 69 6e 67 20 70 72 69 6e 74 66 2d 73 74 79  using printf-sty
29be0 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  le arguments for
29bf0 20 74 68 65 20 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20   the SQL..**.** 
29c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
29c10 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20  could be marked 
29c20 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20 69  "static".  But i
29c30 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  t is not always 
29c40 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  used,.** dependi
29c50 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69  ng on compile-ti
29c60 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20  me options.  By 
29c70 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73 74  omitting the "st
29c80 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a  atic", we avoid.
29c90 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70  ** nuisance comp
29ca0 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
29cb0 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75 74  out "defined but
29cc0 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76   not used"..*/.v
29cd0 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
29ce0 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  Printf(.  sqlite
29cf0 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
29d00 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
29d10 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
29d20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
29d30 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70  , .  ....){.  *p
29d40 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
29d50 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
29d60 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
29d70 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ap;.    char *z;
29d80 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
29d90 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d  , zFmt);.    z =
29da0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
29db0 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  f(zFmt, ap);.   
29dc0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20   va_end(ap);.   
29dd0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
29de0 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
29df0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
29e00 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72  e{.      shellPr
29e10 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a  epare(db, pRc, z
29e20 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  , ppStmt);.     
29e30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
29e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
29e50 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 70  * Finalize the p
29e60 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
29e70 74 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  t created using 
29e80 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
29e90 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tf()..**.** This
29ea0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75 6c   routine is coul
29eb0 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74 61  d be marked "sta
29ec0 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69 73  tic".  But it is
29ed0 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65 64   not always used
29ee0 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f  ,.** depending o
29ef0 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  n compile-time o
29f00 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69 74  ptions.  By omit
29f10 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69 63  ting the "static
29f20 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20 6e  ", we avoid.** n
29f30 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65 72  uisance compiler
29f40 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
29f50 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f 74  "defined but not
29f60 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64 20   used"..*/.void 
29f70 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20  shellFinalize(. 
29f80 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
29f90 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
29fa0 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74  t.){.  if( pStmt
29fb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
29fc0 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
29fd0 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
29fe0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
29ff0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2a000 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  tmt);.    if( *p
2a010 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
2a020 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a040 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a050 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
2a060 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2a070 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
2a080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
2a090 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
2a0a0 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 74 68  }.}../* Reset th
2a0b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
2a0c0 6d 65 6e 74 20 63 72 65 61 74 65 64 20 75 73 69  ment created usi
2a0d0 6e 67 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  ng shellPrepareP
2a0e0 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  rintf()..**.** T
2a0f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2a100 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22  ould be marked "
2a110 73 74 61 74 69 63 22 2e 20 20 42 75 74 20 69 74  static".  But it
2a120 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75   is not always u
2a130 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e  sed,.** dependin
2a140 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  g on compile-tim
2a150 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f  e options.  By o
2a160 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73 74 61  mitting the "sta
2a170 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a  tic", we avoid.*
2a180 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69  * nuisance compi
2a190 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ler warnings abo
2a1a0 75 74 20 22 64 65 66 69 6e 65 64 20 62 75 74 20  ut "defined but 
2a1b0 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f  not used"..*/.vo
2a1c0 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20  id shellReset(. 
2a1d0 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
2a1e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2a1f0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
2a200 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
2a210 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63  tmt);.  if( *pRc
2a220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a230 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2a250 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
2a260 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
2a270 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  tmt);.      raw_
2a280 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a290 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
2a2a0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2a2b0 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (db));.    }.   
2a2c0 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a   *pRc = rc;.  }.
2a2d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2a2e0 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
2a2f0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2a300 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2a310 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2a320 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
2a330 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
2a340 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ZLIB)./*********
2a350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a390 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
2a3a0 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
2a3b0 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
2a3c0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
2a3d0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20 73  representing a s
2a3e0 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d  ingle ".ar" comm
2a3f0 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  and..*/.typedef 
2a400 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64  struct ArCommand
2a410 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75   ArCommand;.stru
2a420 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20  ct ArCommand {. 
2a430 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20 20   u8 eCmd;       
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20   /* An AR_CMD_* 
2a460 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62 56  value */.  u8 bV
2a470 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20  erbose;         
2a480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a490 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20  ue if --verbose 
2a4a0 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20 20  */.  u8 bZip;   
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a4d0 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20 61  the archive is a
2a4e0 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44 72   ZIP */.  u8 bDr
2a4f0 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20  yRun;           
2a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a510 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a  e if --dry-run *
2a520 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b 20  /.  u8 bAppend; 
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
2a550 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20  -append */.  u8 
2a560 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20  fromCmdLine;    
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a580 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74  Run from -A inst
2a590 65 61 64 20 6f 66 20 2e 61 72 63 68 69 76 65 20  ead of .archive 
2a5a0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a5d0 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  f command argume
2a5e0 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  nts */.  char *z
2a5f0 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20  SrcTable;       
2a600 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c           /* "sql
2a610 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66  ar", "zipfile($f
2a620 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a  ile)" or "zip" *
2a630 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2a640 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
2a650 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72      /* --file ar
2a660 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20  gument, or NULL 
2a670 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2a680 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20  *zDir;          
2a690 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74       /* --direct
2a6a0 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72  ory argument, or
2a6b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
2a6c0 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20  **azArg;        
2a6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
2a6e0 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61  ray of command a
2a6f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68  rguments */.  Sh
2a700 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20  ellState *p;    
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a720 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a   Shell state */.
2a730 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
2a760 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63  ntaining the arc
2a770 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  hive */.};../*.*
2a780 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20  * Print a usage 
2a790 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
2a7a0 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  .ar command to s
2a7b0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
2a7c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
2a7d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55  /.static int arU
2a7e0 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  sage(FILE *f){. 
2a7f0 20 73 68 6f 77 48 65 6c 70 28 66 2c 22 61 72 63   showHelp(f,"arc
2a800 68 69 76 65 22 29 3b 0a 20 20 72 65 74 75 72 6e  hive");.  return
2a810 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
2a820 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  ../*.** Print an
2a830 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
2a840 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61  or the .ar comma
2a850 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  nd to stderr and
2a860 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
2a870 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61  TE_ERROR..*/.sta
2a880 74 69 63 20 69 6e 74 20 61 72 45 72 72 6f 72 4d  tic int arErrorM
2a890 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  sg(ArCommand *pA
2a8a0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
2a8b0 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Fmt, ...){.  va_
2a8c0 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2a8d0 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  *z;.  va_start(a
2a8e0 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20  p, zFmt);.  z = 
2a8f0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2a900 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61  (zFmt, ap);.  va
2a910 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38  _end(ap);.  utf8
2a920 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a930 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a  "Error: %s\n", z
2a940 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 66 72  );.  if( pAr->fr
2a950 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20  omCmdLine ){.   
2a960 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a970 65 72 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22  err, "Use \"-A\"
2a980 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e   for more help\n
2a990 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
2a9a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a9b0 65 72 72 2c 20 22 55 73 65 20 5c 22 2e 61 72 63  err, "Use \".arc
2a9c0 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f  hive --help\" fo
2a9d0 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b  r more help\n");
2a9e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2a9f0 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
2aa00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
2aa10 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66  ../*.** Values f
2aa20 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d  or ArCommand.eCm
2aa30 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52  d..*/.#define AR
2aa40 5f 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20 20  _CMD_CREATE     
2aa50 20 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    1.#define AR_C
2aa60 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20 20  MD_UPDATE       
2aa70 32 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  2.#define AR_CMD
2aa80 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 33 0a  _INSERT       3.
2aa90 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45  #define AR_CMD_E
2aaa0 58 54 52 41 43 54 20 20 20 20 20 20 34 0a 23 64  XTRACT      4.#d
2aab0 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53  efine AR_CMD_LIS
2aac0 54 20 20 20 20 20 20 20 20 20 35 0a 23 64 65 66  T         5.#def
2aad0 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20  ine AR_CMD_HELP 
2aae0 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a          6../*.**
2aaf0 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d   Other (non-comm
2ab00 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a  and) switches..*
2ab10 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  /.#define AR_SWI
2ab20 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20  TCH_VERBOSE     
2ab30 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  7.#define AR_SWI
2ab40 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20  TCH_FILE        
2ab50 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  8.#define AR_SWI
2ab60 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20  TCH_DIRECTORY   
2ab70 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  9.#define AR_SWI
2ab80 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 31  TCH_APPEND     1
2ab90 30 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49  0.#define AR_SWI
2aba0 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31  TCH_DRYRUN     1
2abb0 31 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  1..static int ar
2abc0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72  ProcessSwitch(Ar
2abd0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e  Command *pAr, in
2abe0 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74  t eSwitch, const
2abf0 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
2ac00 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20  switch( eSwitch 
2ac10 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  ){.    case AR_C
2ac20 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63  MD_CREATE:.    c
2ac30 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
2ac40 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  CT:.    case AR_
2ac50 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61  CMD_LIST:.    ca
2ac60 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  se AR_CMD_UPDATE
2ac70 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
2ac80 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 63 61  D_INSERT:.    ca
2ac90 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
2aca0 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
2acb0 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
2acc0 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2acd0 28 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65 20  (pAr, "multiple 
2ace0 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73 22  command options"
2acf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ad00 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53 77   pAr->eCmd = eSw
2ad10 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65 61  itch;.      brea
2ad20 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  k;..    case AR_
2ad30 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a 20  SWITCH_DRYRUN:. 
2ad40 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52 75       pAr->bDryRu
2ad50 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  n = 1;.      bre
2ad60 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
2ad70 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a 0a  SWITCH_VERBOSE:.
2ad80 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62        pAr->bVerb
2ad90 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ose = 1;.      b
2ada0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
2adb0 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 3a  R_SWITCH_APPEND:
2adc0 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70 70  .      pAr->bApp
2add0 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  end = 1;.      /
2ade0 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
2adf0 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20 63   --file */.    c
2ae00 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ase AR_SWITCH_FI
2ae10 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a  LE:.      pAr->z
2ae20 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20  File = zArg;.   
2ae30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2ae40 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  se AR_SWITCH_DIR
2ae50 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41  ECTORY:.      pA
2ae60 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a  r->zDir = zArg;.
2ae70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
2ae80 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2ae90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  E_OK;.}../*.** P
2aea0 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
2aeb0 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61   line for an ".a
2aec0 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20  r" command. The 
2aed0 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74  results are writ
2aee0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75  ten into.** stru
2aef0 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51  cture (*pAr). SQ
2af00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2af10 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61  ned if the comma
2af20 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65  nd line is parse
2af30 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c  d.** successfull
2af40 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  y, otherwise an 
2af50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2af60 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65   written to stde
2af70 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  rr and .** SQLIT
2af80 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64  E_ERROR returned
2af90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2afa0 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a  arParseCommand(.
2afb0 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
2afe0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
2aff0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
2b000 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b030 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
2b040 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e  [] */.  ArComman
2b050 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20 20  d *pAr          
2b060 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
2b070 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
2b080 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41  */.){.  struct A
2b090 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63 6f  rSwitch {.    co
2b0a0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b  nst char *zLong;
2b0b0 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72 74  .    char cShort
2b0c0 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63 68  ;.    u8 eSwitch
2b0d0 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a 20  ;.    u8 bArg;. 
2b0e0 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20 7b   } aSwitch[] = {
2b0f0 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22 2c  .    { "create",
2b100 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44 5f      'c', AR_CMD_
2b110 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30 20  CREATE,       0 
2b120 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61 63  },.    { "extrac
2b130 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43 4d  t",   'x', AR_CM
2b140 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20 20  D_EXTRACT,      
2b150 30 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73 65  0 },.    { "inse
2b160 72 74 22 2c 20 20 20 20 27 69 27 2c 20 41 52 5f  rt",    'i', AR_
2b170 43 4d 44 5f 49 4e 53 45 52 54 2c 20 20 20 20 20  CMD_INSERT,     
2b180 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 69    0 },.    { "li
2b190 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20 41  st",      't', A
2b1a0 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20 20  R_CMD_LIST,     
2b1b0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2b1c0 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27 2c  update",    'u',
2b1d0 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20   AR_CMD_UPDATE, 
2b1e0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2b1f0 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27 68   "help",      'h
2b200 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c 20  ', AR_CMD_HELP, 
2b210 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
2b220 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20   { "verbose",   
2b230 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 56  'v', AR_SWITCH_V
2b240 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a 20  ERBOSE,   0 },. 
2b250 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20 20     { "file",    
2b260 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43 48    'f', AR_SWITCH
2b270 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d 2c  _FILE,      1 },
2b280 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22 2c  .    { "append",
2b290 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49 54      'a', AR_SWIT
2b2a0 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31 20  CH_APPEND,    1 
2b2b0 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63 74  },.    { "direct
2b2c0 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53 57  ory", 'C', AR_SW
2b2d0 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20  ITCH_DIRECTORY, 
2b2e0 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79 72  1 },.    { "dryr
2b2f0 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52 5f  un",    'n', AR_
2b300 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20 20  SWITCH_DRYRUN,  
2b310 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e    0 },.  };.  in
2b320 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65  t nSwitch = size
2b330 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69  of(aSwitch) / si
2b340 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77  zeof(struct ArSw
2b350 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20  itch);.  struct 
2b360 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d  ArSwitch *pEnd =
2b370 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63   &aSwitch[nSwitc
2b380 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c  h];..  if( nArg<
2b390 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =1 ){.    utf8_p
2b3a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
2b3b0 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
2b3c0 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67 65  rguments.  Usage
2b3d0 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  :\n");.    retur
2b3e0 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72 72  n arUsage(stderr
2b3f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b400 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
2b410 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  1];.    if( z[0]
2b420 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
2b430 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
2b440 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
2b450 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
2b460 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
2b470 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
2b480 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
2b490 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
2b4a0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
2b4b0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
2b4c0 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
2b4d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
2b4e0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
2b4f0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
2b500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b510 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
2b520 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
2b530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b540 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
2b550 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2b560 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2b570 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
2b580 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
2b590 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2b5a0 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
2b5b0 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
2b5c0 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67    if( iArg>=nArg
2b5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b5e0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2b5f0 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
2b600 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
2b610 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a  ent: %c",z[i]);.
2b620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b630 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
2b640 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20 20  rg[iArg++];.    
2b650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b660 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63  ( arProcessSwitc
2b670 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77  h(pAr, pOpt->eSw
2b680 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65  itch, zArg) ) re
2b690 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2b6a0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2b6b0 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
2b6c0 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69 66  g-iArg;.      if
2b6d0 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29 7b  ( pAr->nArg>0 ){
2b6e0 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
2b6f0 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
2b700 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g];.      }.    
2b710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2b720 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c 20  Non-traditional 
2b730 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
2b740 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20 20      int iArg;.  
2b750 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b 20      for(iArg=1; 
2b760 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67 2b  iArg<nArg; iArg+
2b770 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2b780 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 61  n;.        z = a
2b790 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
2b7a0 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d      if( z[0]!='-
2b7b0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ' ){.          /
2b7c0 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  * All remaining 
2b7d0 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
2b7e0 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61  ds are command a
2b7f0 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20  rguments. */.   
2b800 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72         pAr->azAr
2b810 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d  g = &azArg[iArg]
2b820 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
2b830 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
2b840 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  g;.          bre
2b850 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2b860 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
2b870 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20 20  30(z);..        
2b880 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b  if( z[1]!='-' ){
2b890 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2b8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;.          /* O
2b8b0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72 74  ne or more short
2b8c0 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20   options */.    
2b8d0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2b8e0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
2b8f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2b900 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20   *zArg = 0;.    
2b910 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
2b920 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a 20  rSwitch *pOpt;. 
2b930 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
2b940 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
2b950 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
2b960 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2b970 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
2b980 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
2b990 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
2b9a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b9b0 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a 20   pOpt==pEnd ){. 
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2b9d0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2b9e0 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Ar, "unrecognize
2b9f0 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
2ba00 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
2ba10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ba20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29  if( pOpt->bArg )
2ba30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ba40 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a 20  if( i<(n-1) ){. 
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2ba60 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a 20  Arg = &z[i+1];. 
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2ba80 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
2ba90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2baa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2bab0 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b  Arg>=(nArg-1) ){
2bac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bad0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2bae0 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f  rMsg(pAr, "optio
2baf0 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
2bb00 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d  gument: %c",z[i]
2bb10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2bb20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2bb30 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
2bb40 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
2bb50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bb60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb70 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
2bb80 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
2bb90 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
2bba0 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
2bbb0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2bbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2bbd0 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c  lse if( z[2]=='\
2bbe0 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0' ){.          
2bbf0 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20  /* A -- option, 
2bc00 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2bc10 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  all remaining co
2bc20 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
2bc30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
2bc40 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
2bc50 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  nts.  */.       
2bc60 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
2bc70 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a  &azArg[iArg+1];.
2bc80 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
2bc90 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d  Arg = nArg-iArg-
2bca0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2bcb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
2bcc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2bcd0 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  A long option */
2bce0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2bcf0 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd10 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  Argument for opt
2bd20 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ion, if any */. 
2bd30 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2bd40 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68  ArSwitch *pMatch
2bd50 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61   = 0;      /* Ma
2bd60 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  tching option */
2bd70 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2bd80 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
2bd90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2bda0 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Iterator */.    
2bdb0 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
2bdc0 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
2bdd0 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
2bdf0 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20  t char *zLong = 
2be00 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20  pOpt->zLong;.   
2be10 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d           if( (n-
2be20 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f  2)<=strlen30(zLo
2be30 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  ng) && 0==memcmp
2be40 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e  (&z[2], zLong, n
2be50 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
2be60 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20       if( pMatch 
2be70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2be80 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2be90 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69 67  rMsg(pAr, "ambig
2bea0 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22  uous option: %s"
2beb0 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,z);.           
2bec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bed0 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
2bee0 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20   = pOpt;.       
2bef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bf00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bf10 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66   }..          if
2bf20 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20  ( pMatch==0 ){. 
2bf30 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2bf40 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2bf50 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  , "unrecognized 
2bf60 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b  option: %s", z);
2bf70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bf80 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
2bf90 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  h->bArg ){.     
2bfa0 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
2bfb0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
2bfc0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2bfd0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2bfe0 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
2bff0 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
2c000 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
2c010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c020 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
2c030 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
2c040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2c050 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
2c060 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d 3e  ch(pAr, pMatch->
2c070 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29  eSwitch, zArg) )
2c080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c090 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
2c0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c0b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2c0c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c0d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2c0e0 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20 61  sumes that all a
2c0f0 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  rguments within 
2c100 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61 7a  the ArCommand.az
2c110 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 72  Arg[].** array r
2c120 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65 20  efer to archive 
2c130 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72 20  members, as for 
2c140 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f 72  the --extract or
2c150 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64 73   --list commands
2c160 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73 20  . .** It checks 
2c170 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
2c180 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20 49  m are present. I
2c190 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64 20  f any specified 
2c1a0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 70  file is not.** p
2c1b0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61 72  resent in the ar
2c1c0 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72 20  chive, an error 
2c1d0 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73 74  is printed to st
2c1e0 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72 6f  derr and an erro
2c1f0 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72 6e  r.** code return
2c200 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
2c210 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64 20  f all specified 
2c220 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70 72  arguments are pr
2c230 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2c240 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45 5f  archive, SQLITE_
2c250 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2c260 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2c270 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20 74  ion strips any t
2c280 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61 72  railing '/' char
2c290 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63 68  acters from each
2c2a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68   argument..** Th
2c2b0 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74  is is consistent
2c2c0 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74 68   with the way th
2c2d0 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64 20  e [tar] command 
2c2e0 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f 6e  seems to work on
2c2f0 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73 74  .** Linux..*/.st
2c300 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63 6b  atic int arCheck
2c310 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61 6e  Entries(ArComman
2c320 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72  d *pAr){.  int r
2c330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c340 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29   if( pAr->nArg )
2c350 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
2c360 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2c370 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20   *pTest = 0;..  
2c380 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2c390 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2c3a0 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20 20  c, &pTest,.     
2c3b0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20     "SELECT name 
2c3c0 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61  FROM %s WHERE na
2c3d0 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20 20  me=$name", .    
2c3e0 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62      pAr->zSrcTab
2c3f0 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a 20  le.    );.    j 
2c400 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
2c410 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
2c420 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b 0a  Test, "$name");.
2c430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2c440 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
2c450 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
2c460 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
2c470 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a   pAr->azArg[i];.
2c480 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
2c490 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
2c4a0 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
2c4b0 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
2c4c0 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20  & z[n-1]=='/' ) 
2c4d0 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20  n--;.      z[n] 
2c4e0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71  = '\0';.      sq
2c4f0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
2c500 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31 2c  pTest, j, z, -1,
2c510 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
2c520 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
2c530 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2c540 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
2c550 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
2c560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
2c570 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65  llReset(&rc, pTe
2c580 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
2c590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c5a0 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  bOk==0 ){.      
2c5b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2c5c0 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64  derr, "not found
2c5d0 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c   in archive: %s\
2c5e0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
2c5f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2c600 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
2c610 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
2c620 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  ze(&rc, pTest);.
2c630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74  .}../*.** Format
2c650 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
2c660 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
2c670 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71   against the "sq
2c680 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a  lar" table to.**
2c690 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72   identify all ar
2c6a0 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
2c6b0 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d  at match the com
2c6c0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68  mand arguments h
2c6d0 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29  eld.** in (*pAr)
2c6e0 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45  . Leave this WHE
2c6f0 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70  RE clause in (*p
2c700 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72  zWhere) before r
2c710 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
2c720 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2c730 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
2c740 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71  ually calling sq
2c750 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a  lite3_free() on.
2c760 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  ** any non-NULL 
2c770 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65  (*pzWhere) value
2c780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c790 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a   arWhereClause(.
2c7a0 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41    int *pRc, .  A
2c7b0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a  rCommand *pAr, .
2c7c0 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7e0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48    /* OUT: New WH
2c7f0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
2c800 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
2c810 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
2c820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c830 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d    if( pAr->nArg=
2c840 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65  =0 ){.      zWhe
2c850 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
2c860 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d  intf("1");.    }
2c870 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2c880 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
2c890 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
2c8a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2c8b0 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29  <pAr->nArg; i++)
2c8c0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2c8d0 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
2c8e0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
2c8f0 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
2c900 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2c910 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65 20       "%z%s name 
2c920 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74 72  = '%q' OR substr
2c930 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27 25  (name,1,%d) = '%
2c940 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20  q/'", .         
2c950 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20 7a   zWhere, zSep, z
2c960 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31 2c  , strlen30(z)+1,
2c970 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   z.        );.  
2c980 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
2c990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c9a0 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2c9b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
2c9c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2c9d0 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
2c9e0 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a  " OR ";.      }.
2c9f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57      }.  }.  *pzW
2ca00 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d  here = zWhere;.}
2ca10 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2ca20 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c  tation of .ar "l
2ca30 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  isT" command. .*
2ca40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 4c  /.static int arL
2ca50 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f 6d  istCommand(ArCom
2ca60 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f  mand *pAr){.  co
2ca70 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
2ca80 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   "SELECT %s FROM
2ca90 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20 0a   %s WHERE %s"; .
2caa0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
2cab0 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Cols[] = {.    "
2cac0 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d 6f  name",.    "lsmo
2cad0 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64 61  de(mode), sz, da
2cae0 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27 75  tetime(mtime, 'u
2caf0 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d 65  nixepoch'), name
2cb00 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20 2a  ".  };..  char *
2cb10 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73 71  zWhere = 0;.  sq
2cb20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
2cb30 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2cb40 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b 45  .  rc = arCheckE
2cb50 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20 61  ntries(pAr);.  a
2cb60 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
2cb70 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
2cb80 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
2cb90 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
2cba0 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c  &rc, &pSql, zSql
2cbb0 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62 56  , azCols[pAr->bV
2cbc0 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20 20  erbose],.       
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41                pA
2cbe0 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
2cbf0 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41 72  here);.  if( pAr
2cc00 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  ->bDryRun ){.   
2cc10 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2cc20 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2cc30 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
2cc40 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ql));.  }else{. 
2cc50 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2cc60 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2cc70 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2cc80 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20 20  tep(pSql) ){.   
2cc90 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72     if( pAr->bVer
2cca0 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
2ccb0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2ccc0 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31  >p->out, "%s % 1
2ccd0 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a 20  0d  %s  %s\n",. 
2cce0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2ccf0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2cd00 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  Sql, 0),.       
2cd10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2cd20 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29  umn_int(pSql, 1)
2cd30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
2cd40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2cd50 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20  xt(pSql, 2),.   
2cd60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cd70 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
2cd80 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29 3b  l, 3).        );
2cd90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cda0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cdb0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2cdc0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
2cdd0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2cde0 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   0));.      }.  
2cdf0 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46    }.  }.  shellF
2ce00 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
2ce10 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
2ce20 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65  ee(zWhere);.  re
2ce30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2ce40 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2ce50 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61 63  n of .ar "eXtrac
2ce60 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  t" command. .*/.
2ce70 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 74  static int arExt
2ce80 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ractCommand(ArCo
2ce90 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
2cea0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31  onst char *zSql1
2ceb0 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20   = .    "SELECT 
2cec0 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c 7c  ".    " ($dir ||
2ced0 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20 77   name),".    " w
2cee0 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20 7c  ritefile(($dir |
2cef0 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f 64  | name), %s, mod
2cf00 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20 20  e, mtime) ".    
2cf10 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 28  "FROM %s WHERE (
2cf20 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49 53  %s) AND (data IS
2cf30 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e 6c   NULL OR $dirOnl
2cf40 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41 4e  y = 0)".    " AN
2cf50 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20  D name NOT GLOB 
2cf60 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a 20  '*..[/\\]*'";.. 
2cf70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
2cf80 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20  xtraArg[] = { . 
2cf90 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70     "sqlar_uncomp
2cfa0 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c  ress(data, sz)",
2cfb0 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b  .    "data".  };
2cfc0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ..  sqlite3_stmt
2cfd0 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pSql = 0;.  in
2cfe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cff0 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  ;.  char *zDir =
2d000 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65   0;.  char *zWhe
2d010 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  re = 0;.  int i,
2d020 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   j;..  /* If arg
2d030 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69  uments are speci
2d040 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61 74  fied, check that
2d050 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20 65   they actually e
2d060 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a 2a  xist within.  **
2d070 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65 66   the archive bef
2d080 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
2d090 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61 20  And formulate a 
2d0a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 0a  WHERE clause to.
2d0b0 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d 2e    ** match them.
2d0c0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43 68    */.  rc = arCh
2d0d0 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b  eckEntries(pAr);
2d0e0 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  .  arWhereClause
2d0f0 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65  (&rc, pAr, &zWhe
2d100 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  re);..  if( rc==
2d110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d120 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20 29   if( pAr->zDir )
2d130 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
2d140 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2d150 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29  %s/", pAr->zDir)
2d160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d170 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
2d180 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20  3_mprintf("");. 
2d190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
2d1a0 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  r==0 ) rc = SQLI
2d1b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2d1c0 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2d1d0 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72 63  ntf(pAr->db, &rc
2d1e0 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c 20  , &pSql, zSql1, 
2d1f0 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41 72  .      azExtraAr
2d200 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70 41  g[pAr->bZip], pA
2d210 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a 57  r->zSrcTable, zW
2d220 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28  here.  );..  if(
2d230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d240 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  {.    j = sqlite
2d250 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2d260 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64  _index(pSql, "$d
2d270 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ir");.    sqlite
2d280 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
2d290 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20 53  , j, zDir, -1, S
2d2a0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a  QLITE_STATIC);..
2d2b0 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
2d2c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2d2d0 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73 74  twice. The first
2d2e0 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65   time, writefile
2d2f0 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  () is called.   
2d300 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68   ** for all arch
2d310 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ive members that
2d320 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61   should be extra
2d330 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  cted. The second
2d340 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e   time,.    ** on
2d350 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  ly for the direc
2d360 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73 20  tories. This is 
2d370 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d 65  because the time
2d380 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a  stamps for.    *
2d390 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72 65  * extracted dire
2d3a0 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20  ctories must be 
2d3b0 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65 79  reset after they
2d3c0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28   are populated (
2d3d0 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  as.    ** popula
2d3e0 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65  ting them change
2d3f0 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29  s the timestamp)
2d400 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  .  */.    for(i=
2d410 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
2d420 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f      j = sqlite3_
2d430 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
2d440 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69 72  ndex(pSql, "$dir
2d450 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73 71  Only");.      sq
2d460 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
2d470 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20 20  Sql, j, i);.    
2d480 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
2d490 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
2d4a0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2d4b0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2d4c0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29  qlite3_sql(pSql)
2d4d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2d4e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72          while( r
2d4f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d500 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2d510 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
2d520 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d530 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56 65  i==0 && pAr->bVe
2d540 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
2d550 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d560 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2d570 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  s\n", sqlite3_co
2d580 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
2d590 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  0));.          }
2d5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d5b0 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65   }.      shellRe
2d5c0 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a  set(&rc, pSql);.
2d5d0 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
2d5e0 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71  inalize(&rc, pSq
2d5f0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  l);.  }..  sqlit
2d600 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20  e3_free(zDir);. 
2d610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
2d620 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  here);.  return 
2d630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
2d640 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2d650 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72 20  nt in zSql.  Or 
2d660 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72 79  if doing a --dry
2d670 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69 6e  run, merely prin
2d680 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74 61  t it out..*/.sta
2d690 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53 71  tic int arExecSq
2d6a0 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72  l(ArCommand *pAr
2d6b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
2d6c0 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ql){.  int rc;. 
2d6d0 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
2d6e0 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  n ){.    utf8_pr
2d6f0 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2d700 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
2d710 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d720 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2d730 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2d740 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d750 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c  e3_exec(pAr->db,
2d760 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45   zSql, 0, 0, &zE
2d770 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  rr);.    if( zEr
2d780 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  r ){.      utf8_
2d790 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
2d7a0 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a 45  ERROR: %s\n", zE
2d7b0 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
2d7c0 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2d7d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2d7e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2d7f0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2d800 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c 20  f .ar "create", 
2d810 22 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22 75  "insert", and "u
2d820 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73 2e  pdate" commands.
2d830 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61 74  .**.**     creat
2d840 65 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65 61  e    ->     Crea
2d850 74 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72 63  te a new SQL arc
2d860 68 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73 65  hive.**     inse
2d870 72 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e 73  rt    ->     Ins
2d880 65 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74 20  ert or reinsert 
2d890 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65 64  all files listed
2d8a0 0a 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20 20  .**     update  
2d8b0 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74 20    ->     Insert 
2d8c0 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
2d8d0 63 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74 20  changed or that 
2d8e0 77 65 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  were not.**     
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20 74   previously in t
2d910 68 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a 2a  he archive.**.**
2d920 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c   Create the "sql
2d930 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ar" table in the
2d940 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20   database if it 
2d950 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2d960 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20   exist..** Then 
2d970 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e  add each file in
2d980 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72   the azFile[] ar
2d990 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69  ray to the archi
2d9a0 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a  ve. Directories.
2d9b0 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63  ** are added rec
2d9c0 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67  ursively. If arg
2d9d0 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69  ument bVerbose i
2d9e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65  s non-zero, a me
2d9f0 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e  ssage is.** prin
2da00 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f  ted on stdout fo
2da10 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68  r each file arch
2da20 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ived..**.** The 
2da30 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69  create command i
2da40 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70  s the same as up
2da50 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61  date, except tha
2da60 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e  t it drops.** an
2da70 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61  y existing "sqla
2da80 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  r" table before 
2da90 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65 20  beginning.  The 
2daa0 22 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e 64  "insert" command
2dab0 0a 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72 77  .** always overw
2dac0 72 69 74 65 73 20 65 76 65 72 79 20 66 69 6c 65  rites every file
2dad0 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f   named on the co
2dae0 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65 72  mmand-line, wher
2daf0 65 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65 22  e as.** "update"
2db00 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2db10 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72 20   if the size or 
2db20 6d 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68 61  mtime or mode ha
2db30 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  s changed..*/.st
2db40 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74  atic int arCreat
2db50 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2db60 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  (.  ArCommand *p
2db70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar,             
2db80 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61      /* Command a
2db90 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74  rguments and opt
2dba0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55  ions */.  int bU
2dbb0 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  pdate,          
2dbc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75            /* tru
2dbd0 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65  e for a --create
2dbe0 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c 79  . */.  int bOnly
2dbf0 49 66 43 68 61 6e 67 65 64 20 20 20 20 20 20 20  IfChanged       
2dc00 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 75         /* Only u
2dc10 70 64 61 74 65 20 69 66 20 66 69 6c 65 20 68 61  pdate if file ha
2dc20 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b 0a  s changed */.){.
2dc30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
2dc40 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20 22  reate = .      "
2dc50 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
2dc60 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61 72  NOT EXISTS sqlar
2dc70 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61  (\n".      "  na
2dc80 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  me TEXT PRIMARY 
2dc90 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f 66  KEY,  -- name of
2dca0 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20 20   the file\n".   
2dcb0 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c 20     "  mode INT, 
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2dcd0 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
2dce0 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ons\n".      "  
2dcf0 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20 20  mtime INT,      
2dd00 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74 20          -- last 
2dd10 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69 6d  modification tim
2dd20 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73 7a  e\n".      "  sz
2dd30 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
2dd40 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e 61        -- origina
2dd50 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a 20  l file size\n". 
2dd60 20 20 20 20 20 22 20 20 64 61 74 61 20 42 4c 4f       "  data BLO
2dd70 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
2dd80 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63 6f  -- compressed co
2dd90 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20 22  ntent\n".      "
2dda0 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  )";.  const char
2ddb0 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50 20   *zDrop = "DROP 
2ddc0 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
2ddd0 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74 20  sqlar";.  const 
2dde0 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d 74  char *zInsertFmt
2ddf0 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52 45  [2] = {.     "RE
2de00 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61  PLACE INTO %s(na
2de10 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a  me,mode,mtime,sz
2de20 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
2de30 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
2de40 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
2de50 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
2de60 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
2de70 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43 41  \n".     "    CA
2de80 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64 65  SE substr(lsmode
2de90 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a 20  (mode),1,1)\n". 
2dea0 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e 20      "      WHEN 
2deb0 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68 28  '-' THEN length(
2dec0 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20  data)\n".     " 
2ded0 20 20 20 20 20 57 48 45 4e 20 27 64 27 20 54 48       WHEN 'd' TH
2dee0 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20 20  EN 0\n".     "  
2def0 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44 2c      ELSE -1 END,
2df00 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73 71  \n".     "    sq
2df10 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61 74  lar_compress(dat
2df20 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  a)\n".     "  FR
2df30 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 20  OM fsdir(%Q,%Q) 
2df40 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20  AS disk\n".     
2df50 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65 28  "  WHERE lsmode(
2df60 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27  mode) NOT LIKE '
2df70 3f 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c 0a  ?%%'%s;".     ,.
2df80 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
2df90 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c  TO %s(name,mode,
2dfa0 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a 20  mtime,data)\n". 
2dfb0 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e 22      "  SELECT\n"
2dfc0 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c 6e  .     "    %s,\n
2dfd0 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64 65  ".     "    mode
2dfe0 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
2dff0 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  time,\n".     " 
2e000 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20 20     data\n".     
2e010 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25 51  "  FROM fsdir(%Q
2e020 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22 0a  ,%Q) AS disk\n".
2e030 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73       "  WHERE ls
2e040 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c  mode(mode) NOT L
2e050 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20 20  IKE '?%%'%s;".  
2e060 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  };.  int i;     
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
2e090 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a  ating through az
2e0a0 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  File[] */.  int 
2e0b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2e0d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2e0e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2e0f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e100 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74  /* SQL table int
2e110 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72  o which to inser
2e120 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  t */.  char *zSq
2e130 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  l;.  char zTemp[
2e140 35 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78  50];.  char *zEx
2e150 69 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72 45  ists = 0;..  arE
2e160 78 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52 41  xecSql(pAr, "PRA
2e170 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35 31  GMA page_size=51
2e180 32 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45 78  2");.  rc = arEx
2e190 65 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56 45  ecSql(pAr, "SAVE
2e1a0 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69  POINT ar;");.  i
2e1b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e1c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e1d0 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20  zTemp[0] = 0; . 
2e1e0 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20 29   if( pAr->bZip )
2e1f0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
2e200 69 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20  ize the zipfile 
2e210 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 69  virtual table, i
2e220 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
2e230 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c     if( pAr->zFil
2e240 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2e250 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20 20  e3_uint64 r;.   
2e260 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
2e270 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
2e280 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  &r);.      sqlit
2e290 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2e2a0 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c  of(zTemp),zTemp,
2e2b0 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b  "zip%016llx",r);
2e2c0 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a 54  .      zTab = zT
2e2d0 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  emp;.      zSql 
2e2e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e2f0 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  f(.         "CRE
2e300 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
2e310 45 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47 20  E temp.%s USING 
2e320 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20 20  zipfile(%Q)",.  
2e330 20 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41 72         zTab, pAr
2e340 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29 3b  ->zFile.      );
2e350 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78  .      rc = arEx
2e360 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29  ecSql(pAr, zSql)
2e370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2e380 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2e390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 61  }else{.      zTa
2e3a0 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d  b = "zip";.    }
2e3b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e3c0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2e3d0 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c  table for an SQL
2e3e0 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d  AR */.    zTab =
2e3f0 20 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69 66   "sqlar";.    if
2e400 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a  ( bUpdate==0 ){.
2e410 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 65        rc = arExe
2e420 63 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29  cSql(pAr, zDrop)
2e430 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2e440 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2e450 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74   end_ar_transact
2e460 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ion;.    }.    r
2e470 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2e480 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d  r, zCreate);.  }
2e490 0a 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43 68  .  if( bOnlyIfCh
2e4a0 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45 78  anged ){.    zEx
2e4b0 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ists = sqlite3_m
2e4c0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 20  printf(.      " 
2e4d0 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 22  AND NOT EXISTS("
2e4e0 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  .          "SELE
2e4f0 43 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53 20  CT 1 FROM %s AS 
2e500 6d 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20 22  mem".          "
2e510 20 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65 3d   WHERE mem.name=
2e520 64 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20 20  disk.name".     
2e530 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d       " AND mem.m
2e540 74 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65 22  time=disk.mtime"
2e550 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44  .          " AND
2e560 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e 6d   mem.mode=disk.m
2e570 6f 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20 20  ode)", zTab);.  
2e580 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69 73  }else{.    zExis
2e590 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ts = sqlite3_mpr
2e5a0 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20 20  intf("");.  }.  
2e5b0 69 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20 29  if( zExists==0 )
2e5c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e5d0 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  EM;.  for(i=0; i
2e5e0 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
2e5f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2e600 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
2e610 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  l2 = sqlite3_mpr
2e620 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74 5b  intf(zInsertFmt[
2e630 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61 62  pAr->bZip], zTab
2e640 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 62  ,.        pAr->b
2e650 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c 6c  Verbose ? "shell
2e660 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20 3a  _putsnl(name)" :
2e670 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20   "name",.       
2e680 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20   pAr->azArg[i], 
2e690 70 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69 73  pAr->zDir, zExis
2e6a0 74 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72  ts);.    rc = ar
2e6b0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2e6c0 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l2);.    sqlite3
2e6d0 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20  _free(zSql2);.  
2e6e0 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  }.end_ar_transac
2e6f0 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d  tion:.  if( rc!=
2e700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e710 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41   sqlite3_exec(pA
2e720 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b  r->db, "ROLLBACK
2e730 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20   TO ar; RELEASE 
2e740 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ar;", 0, 0, 0);.
2e750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2e760 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c  = arExecSql(pAr,
2e770 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b   "RELEASE ar;");
2e780 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a  .    if( pAr->bZ
2e790 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65  ip && pAr->zFile
2e7a0 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   ){.      zSql =
2e7b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2e7c0 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22  ("DROP TABLE %s"
2e7d0 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  , zTemp);.      
2e7e0 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
2e7f0 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
2e800 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2e810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2e820 74 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74 73  te3_free(zExists
2e830 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2e840 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2e850 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22  ntation of ".ar"
2e860 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
2e870 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f  .static int arDo
2e880 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
2e890 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2e8b0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
2e8c0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  l state */.  int
2e8d0 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20 20   fromCmdLine,   
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e8f0 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d 61  True if -A comma
2e900 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c 20  nd-line option, 
2e910 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a 20  not .ar cmd */. 
2e920 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
2e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e940 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
2e950 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
2e960 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
2e970 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
2e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e990 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2e9a0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
2e9b0 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d  ] */.){.  ArComm
2e9c0 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72  and cmd;.  int r
2e9d0 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64  c;.  memset(&cmd
2e9e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  , 0, sizeof(cmd)
2e9f0 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d 64  );.  cmd.fromCmd
2ea00 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c 69  Line = fromCmdLi
2ea10 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72  ne;.  rc = arPar
2ea20 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c  seCommand(azArg,
2ea30 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20   nArg, &cmd);.  
2ea40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ea50 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62  K ){.    int eDb
2ea60 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Type = SHELL_OPE
2ea70 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d  N_UNSPEC;.    cm
2ea80 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20  d.p = pState;.  
2ea90 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74    cmd.db = pStat
2eaa0 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63  e->db;.    if( c
2eab0 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  md.zFile ){.    
2eac0 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75    eDbType = dedu
2ead0 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63  ceDatabaseType(c
2eae0 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20  md.zFile, 1);.  
2eaf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
2eb00 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d  DbType = pState-
2eb10 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d  >openMode;.    }
2eb20 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65  .    if( eDbType
2eb30 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
2eb40 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66  FILE ){.      if
2eb50 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2eb60 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d  MD_EXTRACT || cm
2eb70 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c  d.eCmd==AR_CMD_L
2eb80 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IST ){.        i
2eb90 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20  f( cmd.zFile==0 
2eba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  ){.          cmd
2ebb0 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
2ebc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
2ebd0 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p");.        }el
2ebe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d  se{.          cm
2ebf0 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2ec00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2ec10 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64  ipfile(%Q)", cmd
2ec20 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  .zFile);.       
2ec30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2ec40 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20   cmd.bZip = 1;. 
2ec50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64     }else if( cmd
2ec60 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
2ec70 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  int flags;.     
2ec80 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64   if( cmd.bAppend
2ec90 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45   ) eDbType = SHE
2eca0 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2ecb0 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  S;.      if( cmd
2ecc0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52  .eCmd==AR_CMD_CR
2ecd0 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64  EATE || cmd.eCmd
2ece0 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20  ==AR_CMD_INSERT 
2ecf0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 63  .           || c
2ed00 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2ed10 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
2ed20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
2ed30 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
2ed40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2ed50 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
2ed60 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
2ed70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2ed80 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  DONLY;.      }. 
2ed90 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b       cmd.db = 0;
2eda0 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62  .      if( cmd.b
2edb0 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
2edc0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53    utf8_printf(pS
2edd0 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f  tate->out, "-- o
2ede0 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25 73  pen database '%s
2edf0 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c  '%s\n", cmd.zFil
2ee00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2ee10 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f  eDbType==SHELL_O
2ee20 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20  PEN_APPENDVFS ? 
2ee30 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73  " using 'apndvfs
2ee40 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  '" : "");.      
2ee50 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2ee60 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64  ite3_open_v2(cmd
2ee70 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c  .zFile, &cmd.db,
2ee80 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20   flags, .       
2ee90 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53        eDbType==S
2eea0 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
2eeb0 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20  VFS ? "apndvfs" 
2eec0 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  : 0);.      if( 
2eed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2eee0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2eef0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61  intf(stderr, "ca
2ef00 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20  nnot open file: 
2ef10 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20  %s (%s)\n", .   
2ef20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69           cmd.zFi
2ef30 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  le, sqlite3_errm
2ef40 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20  sg(cmd.db).     
2ef50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f     );.        go
2ef60 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2ef70 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2ef80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2ef90 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2efa0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2efb0 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64  3_sqlar_init(cmd
2efc0 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2efd0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
2efe0 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62  _function(cmd.db
2eff0 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
2f000 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
2f010 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20  , cmd.p,.       
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f030 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73         shellPuts
2f040 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Func, 0, 0);..  
2f050 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e    }.    if( cmd.
2f060 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20  zSrcTable==0 && 
2f070 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63  cmd.bZip==0 && c
2f080 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f  md.eCmd!=AR_CMD_
2f090 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66  HELP ){.      if
2f0a0 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43  ( cmd.eCmd!=AR_C
2f0b0 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20  MD_CREATE.      
2f0c0 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c   && sqlite3_tabl
2f0d0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2f0e0 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61  a(cmd.db,0,"sqla
2f0f0 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c  r","name",0,0,0,
2f100 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  0,0).      ){.  
2f110 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2f120 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61 62  f(stderr, "datab
2f130 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ase does not con
2f140 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20  tain an 'sqlar' 
2f150 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20  table\n");.     
2f160 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2f170 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
2f180 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e  to end_ar_comman
2f190 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
2f1a0 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
2f1b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2f1c0 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d  ("sqlar");.    }
2f1d0 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d  ..    switch( cm
2f1e0 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  d.eCmd ){.      
2f1f0 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
2f200 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  TE:.        rc =
2f210 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2f220 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30  eCommand(&cmd, 0
2f230 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
2f240 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2f250 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a   AR_CMD_EXTRACT:
2f260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2f270 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26  ExtractCommand(&
2f280 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
2f290 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2f2a0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
2f2b0 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73        rc = arLis
2f2c0 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a  tCommand(&cmd);.
2f2d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
2f2e0 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
2f2f0 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20  D_HELP:.        
2f300 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e  arUsage(pState->
2f310 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  out);.        br
2f320 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
2f330 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a 0a   AR_CMD_INSERT:.
2f340 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
2f350 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
2f360 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30 29  mand(&cmd, 1, 0)
2f370 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2f380 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
2f390 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f3a0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
2f3b0 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20  D_UPDATE );.    
2f3c0 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2f3d0 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2f3e0 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20 20  (&cmd, 1, 1);.  
2f3f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f400 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f   }.  }.end_ar_co
2f410 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64  mmand:.  if( cmd
2f420 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20  .db!=pState->db 
2f430 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  ){.    close_db(
2f440 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73  cmd.db);.  }.  s
2f450 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e  qlite3_free(cmd.
2f460 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72  zSrcTable);..  r
2f470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45  eturn rc;.}./* E
2f480 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68  nd of the ".arch
2f490 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f  ive" or ".ar" co
2f4a0 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  mmand logic.****
2f4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
2f500 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
2f510 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2f520 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2f530 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
2f540 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 23 69  AVE_ZLIB) */..#i
2f550 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2f560 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2f570 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
2f580 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
2f590 50 41 47 45 5f 56 54 41 42 29 0a 2f 2a 0a 2a 2a  PAGE_VTAB)./*.**
2f5a0 20 49 66 20 28 2a 70 52 63 29 20 69 73 20 6e 6f   If (*pRc) is no
2f5b0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
2f5c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f5d0 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
2f5e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
2f5f0 72 77 69 73 65 2c 20 74 68 65 20 53 51 4c 20 73  rwise, the SQL s
2f600 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61 74  tatement or stat
2f610 65 6d 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20 61  ements in zSql a
2f620 72 65 20 65 78 65 63 75 74 65 64 20 75 73 69 6e  re executed usin
2f630 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  g.** database co
2f640 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 6e 64 20  nnection db and 
2f650 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 77  the error code w
2f660 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 63 20 62  ritten to *pRc b
2f670 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66 75  efore.** this fu
2f680 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
2f690 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2f6a0 68 65 6c 6c 45 78 65 63 28 73 71 6c 69 74 65 33  hellExec(sqlite3
2f6b0 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20   *db, int *pRc, 
2f6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2f6d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70  ){.  int rc = *p
2f6e0 52 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  Rc;.  if( rc==SQ
2f6f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
2f700 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
2f710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2f720 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30  exec(db, zSql, 0
2f730 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20  , 0, &zErr);.   
2f740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
2f760 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f770 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
2f780 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  , zErr);.    }. 
2f790 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
2f7a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  }.}../*.** Like 
2f7b0 73 68 65 6c 6c 45 78 65 63 28 29 2c 20 65 78 63  shellExec(), exc
2f7c0 65 70 74 20 74 68 61 74 20 7a 46 6d 74 20 69 73  ept that zFmt is
2f7d0 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c   a printf() styl
2f7e0 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  e format string.
2f7f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f800 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28  shellExecPrintf(
2f810 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
2f820 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
2f830 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
2f840 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
2f850 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2f860 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
2f870 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74  st ap;.    va_st
2f880 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
2f890 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
2f8a0 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
2f8b0 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
2f8c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
2f8d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
2f8e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2f900 68 65 6c 6c 45 78 65 63 28 64 62 2c 20 70 52 63  hellExec(db, pRc
2f910 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , z);.    }.    
2f920 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
2f930 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
2f940 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2f950 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2f960 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f970 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2f980 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
2f990 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  , an attempt is 
2f9a0 6d 61 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  made to allocate
2f9b0 2c 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  , zero and retur
2f9c0 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
2f9d0 6f 20 61 20 62 75 66 66 65 72 20 6e 42 79 74 65  o a buffer nByte
2f9e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
2f9f0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
2fa00 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
2fa10 73 65 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54 45  set.** to SQLITE
2fa20 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c 20  _NOMEM and NULL 
2fa30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2fa40 74 69 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c 4d  tic void *shellM
2fa50 61 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20  alloc(int *pRc, 
2fa60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
2fa70 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  yte){.  void *pR
2fa80 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  et = 0;.  if( *p
2fa90 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
2faa0 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
2fab0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
2fac0 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  te);.    if( pRe
2fad0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  t==0 ){.      *p
2fae0 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
2faf0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
2fb00 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
2fb10 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
2fb20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
2fb30 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Ret;.}../*.** If
2fb40 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2fb50 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2fb60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2fb70 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2fb80 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
2fb90 2c 20 7a 46 6d 74 20 69 73 20 74 72 65 61 74 65  , zFmt is treate
2fba0 64 20 61 73 20 61 20 70 72 69 6e 74 66 28 29 20  d as a printf() 
2fbb0 73 74 79 6c 65 20 73 74 72 69 6e 67 2e 20 54 68  style string. Th
2fbc0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 66  e result of.** f
2fbd0 6f 72 6d 61 74 74 69 6e 67 20 69 74 20 61 6c 6f  ormatting it alo
2fbe0 6e 67 20 77 69 74 68 20 61 6e 79 20 74 72 61 69  ng with any trai
2fbf0 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 69  ling arguments i
2fc00 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  s written into a
2fc10 20 0a 2a 2a 20 62 75 66 66 65 72 20 6f 62 74 61   .** buffer obta
2fc20 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
2fc30 33 5f 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64 20  3_malloc(), and 
2fc40 70 6f 69 6e 74 65 72 20 74 6f 20 77 68 69 63 68  pointer to which
2fc50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2fc60 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
2fc70 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2fc80 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
2fc90 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
2fca0 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20  buffer.** using 
2fcb0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2fcc0 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a 2a  3_free()..** .**
2fcd0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
2fce0 20 6f 63 63 75 72 73 2c 20 28 2a 70 52 63 29 20   occurs, (*pRc) 
2fcf0 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
2fd00 5f 4e 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55 4c  _NOMEM and a NUL
2fd10 4c 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72 65  L .** pointer re
2fd20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2fd30 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50 72  c char *shellMPr
2fd40 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20 63  intf(int *pRc, c
2fd50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
2fd60 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
2fd70 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2fd80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fd90 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
2fda0 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
2fdb0 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
2fdc0 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
2fdd0 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  zFmt, ap);.    v
2fde0 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
2fdf0 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
2fe00 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2fe10 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
2fe20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
2fe30 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  *.** When runnin
2fe40 67 20 74 68 65 20 22 2e 72 65 63 6f 76 65 72 22  g the ".recover"
2fe50 20 63 6f 6d 6d 61 6e 64 2c 20 65 61 63 68 20 6f   command, each o
2fe60 75 74 70 75 74 20 74 61 62 6c 65 2c 20 61 6e 64  utput table, and
2fe70 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20   the special.** 
2fe80 6f 72 70 68 61 6e 65 64 20 72 6f 77 20 74 61 62  orphaned row tab
2fe90 6c 65 20 69 66 20 69 74 20 69 73 20 72 65 71 75  le if it is requ
2fea0 69 72 65 64 2c 20 69 73 20 72 65 70 72 65 73 65  ired, is represe
2feb0 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74 61  nted by an insta
2fec0 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  nce.** of the fo
2fed0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 2e 0a  llowing struct..
2fee0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2fef0 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 52  t RecoverTable R
2ff00 65 63 6f 76 65 72 54 61 62 6c 65 3b 0a 73 74 72  ecoverTable;.str
2ff10 75 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65  uct RecoverTable
2ff20 20 7b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f 74   {.  char *zQuot
2ff30 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
2ff40 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 64 20 76       /* Quoted v
2ff50 65 72 73 69 6f 6e 20 6f 66 20 74 61 62 6c 65 20  ersion of table 
2ff60 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  name */.  int nC
2ff70 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
2ff80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ff90 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2ffa0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  n table */.  cha
2ffb0 72 20 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20 20 20  r **azlCol;     
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ffd0 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20  Array of column 
2ffe0 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  lists */.  int i
2fff0 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pk;             
30000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30010 64 65 78 20 6f 66 20 49 50 4b 20 63 6f 6c 75 6d  dex of IPK colum
30020 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  n */.};../*.** F
30030 72 65 65 20 61 20 52 65 63 6f 76 65 72 54 61 62  ree a RecoverTab
30040 6c 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  le object alloca
30050 74 65 64 20 62 79 20 72 65 63 6f 76 65 72 46 69  ted by recoverFi
30060 6e 64 54 61 62 6c 65 28 29 20 6f 72 0a 2a 2a 20  ndTable() or.** 
30070 72 65 63 6f 76 65 72 4f 72 70 68 61 6e 54 61 62  recoverOrphanTab
30080 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  le()..*/.static 
30090 76 6f 69 64 20 72 65 63 6f 76 65 72 46 72 65 65  void recoverFree
300a0 54 61 62 6c 65 28 52 65 63 6f 76 65 72 54 61 62  Table(RecoverTab
300b0 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 66 28  le *pTab){.  if(
300c0 20 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c   pTab ){.    sql
300d0 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e  ite3_free(pTab->
300e0 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 69 66  zQuoted);.    if
300f0 28 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 29  ( pTab->azlCol )
30100 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
30110 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30120 3d 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  =pTab->nCol; i++
30130 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30140 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a  e3_free(pTab->az
30150 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lCol[i]);.      
30160 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
30170 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43 6f  free(pTab->azlCo
30180 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
30190 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 29  lite3_free(pTab)
301a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
301b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
301c0 61 20 6e 6f 2d 6f 70 20 69 66 20 28 2a 70 52 63  a no-op if (*pRc
301d0 29 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  ) is not SQLITE_
301e0 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63 61  OK when it is ca
301f0 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  lled..** Otherwi
30200 73 65 2c 20 69 74 20 61 6c 6c 6f 63 61 74 65 73  se, it allocates
30210 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 52   and returns a R
30220 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65  ecoverTable obje
30230 63 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  ct based on the.
30240 2a 2a 20 66 69 6e 61 6c 20 66 6f 75 72 20 61 72  ** final four ar
30250 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
30260 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
30270 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
30280 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20  nsibility.** of 
30290 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
302a0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
302b0 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
302c0 74 20 75 73 69 6e 67 0a 2a 2a 20 72 65 63 6f 76  t using.** recov
302d0 65 72 46 72 65 65 54 61 62 6c 65 28 29 2e 0a 2a  erFreeTable()..*
302e0 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72  /.static Recover
302f0 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4e 65  Table *recoverNe
30300 77 54 61 62 6c 65 28 0a 20 20 69 6e 74 20 2a 70  wTable(.  int *p
30310 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
30320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
30330 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
30340 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
30350 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
30360 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
30370 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
30380 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
30390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 52             /* CR
303a0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
303b0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 49  ment */.  int bI
303c0 6e 74 6b 65 79 2c 20 0a 20 20 69 6e 74 20 6e 43  ntkey, .  int nC
303d0 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ol.){.  sqlite3 
303e0 2a 64 62 74 6d 70 20 3d 20 30 3b 20 20 20 20 20  *dbtmp = 0;     
303f0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
30400 65 33 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 65  e3 handle for te
30410 73 74 69 6e 67 20 43 52 45 41 54 45 20 54 41 42  sting CREATE TAB
30420 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LE */.  int rc =
30430 20 2a 70 52 63 3b 0a 20 20 52 65 63 6f 76 65 72   *pRc;.  Recover
30440 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
30450 0a 0a 20 20 70 54 61 62 20 3d 20 28 52 65 63 6f  ..  pTab = (Reco
30460 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c 4d  verTable*)shellM
30470 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f  alloc(&rc, sizeo
30480 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65 29 29  f(RecoverTable))
30490 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
304a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
304b0 20 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a 20 20   nSqlCol = 0;.  
304c0 20 20 69 6e 74 20 62 53 71 6c 49 6e 74 6b 65 79    int bSqlIntkey
304d0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
304e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
304f0 30 3b 0a 20 20 20 20 0a 20 20 20 20 72 63 20 3d  0;.    .    rc =
30500 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 22   sqlite3_open(""
30510 2c 20 26 64 62 74 6d 70 29 3b 0a 20 20 20 20 69  , &dbtmp);.    i
30520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30530 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30540 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
30550 6e 28 64 62 74 6d 70 2c 20 22 73 68 65 6c 6c 5f  n(dbtmp, "shell_
30560 69 64 71 75 6f 74 65 22 2c 20 31 2c 20 53 51 4c  idquote", 1, SQL
30570 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c             shell
305a0 49 64 51 75 6f 74 65 2c 20 30 2c 20 30 29 3b 0a  IdQuote, 0, 0);.
305b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
305c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
305d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
305e0 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20 22 50  3_exec(dbtmp, "P
305f0 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
30600 63 68 65 6d 61 20 3d 20 6f 6e 22 2c 20 30 2c 20  chema = on", 0, 
30610 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
30620 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30630 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
30640 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
30650 74 6d 70 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  tmp, zSql, 0, 0,
30660 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
30670 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
30680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
306a0 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65 64     goto finished
306b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
306c0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
306d0 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72  Printf(dbtmp, &r
306e0 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20  c, &pStmt, .    
306f0 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
30700 74 28 2a 29 20 46 52 4f 4d 20 70 72 61 67 6d 61  t(*) FROM pragma
30710 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22  _table_info(%Q)"
30720 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
30730 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30740 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
30750 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
30760 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
30770 20 6e 53 71 6c 43 6f 6c 20 3d 20 73 71 6c 69 74   nSqlCol = sqlit
30780 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30790 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
307a0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
307b0 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
307c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
307d0 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c 43 6f 6c 3c  E_OK || nSqlCol<
307e0 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 67 6f  nCol ){.      go
307f0 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  to finished;.   
30800 20 7d 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65   }..    shellPre
30810 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70  parePrintf(dbtmp
30820 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
30830 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28 22        "SELECT ("
30840 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  .      "  SELECT
30850 20 73 75 62 73 74 72 28 64 61 74 61 2c 31 2c 31   substr(data,1,1
30860 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73 71  )==X'0D' FROM sq
30870 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45 52  lite_dbpage WHER
30880 45 20 70 67 6e 6f 3d 72 6f 6f 74 70 61 67 65 22  E pgno=rootpage"
30890 0a 20 20 20 20 20 20 22 29 20 46 52 4f 4d 20 73  .      ") FROM s
308a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
308b0 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a  RE name = %Q", z
308c0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
308d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
308e0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
308f0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
30900 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 62 53  tmt) ){.      bS
30910 71 6c 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69 74  qlIntkey = sqlit
30920 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30930 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  tmt, 0);.    }. 
30940 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
30950 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
30960 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d     if( bIntkey==
30970 62 53 71 6c 49 6e 74 6b 65 79 20 29 7b 0a 20 20  bSqlIntkey ){.  
30980 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
30990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b   const char *zPk
309a0 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20   = "_rowid_";.  
309b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
309c0 20 2a 70 50 6b 46 69 6e 64 65 72 20 3d 20 30 3b   *pPkFinder = 0;
309d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
309e0 69 73 20 69 73 20 61 6e 20 69 6e 74 6b 65 79 20  is is an intkey 
309f0 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72 65 20  table and there 
30a00 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
30a10 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
30a20 20 2a 2a 20 73 65 74 20 7a 50 6b 20 74 6f 20 74   ** set zPk to t
30a30 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 50  he name of the P
30a40 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20 70 54  K column, and pT
30a50 61 62 2d 3e 69 50 6b 20 74 6f 20 74 68 65 20 69  ab->iPk to the i
30a60 6e 64 65 78 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ndex.      ** of
30a70 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 77 68 65   the column, whe
30a80 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 30  re columns are 0
30a90 2d 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c  -numbered from l
30aa0 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 20 20  eft to right..  
30ab0 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68      ** Or, if th
30ac0 69 73 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  is is a WITHOUT 
30ad0 52 4f 57 49 44 20 74 61 62 6c 65 20 6f 72 20 69  ROWID table or i
30ae0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49 50  f there is no IP
30af0 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  K column,.      
30b00 2a 2a 20 6c 65 61 76 65 20 7a 50 6b 20 61 73 20  ** leave zPk as 
30b10 22 5f 72 6f 77 69 64 5f 22 20 61 6e 64 20 70 54  "_rowid_" and pT
30b20 61 62 2d 3e 69 50 6b 20 61 74 20 2d 32 2e 20 20  ab->iPk at -2.  
30b30 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
30b40 50 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20 20 69  Pk = -2;.      i
30b50 66 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20 20  f( bIntkey ){.  
30b60 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
30b70 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
30b80 26 72 63 2c 20 26 70 50 6b 46 69 6e 64 65 72 2c  &rc, &pPkFinder,
30b90 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c   .          "SEL
30ba0 45 43 54 20 63 69 64 2c 20 6e 61 6d 65 20 46 52  ECT cid, name FR
30bb0 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
30bc0 69 6e 66 6f 28 25 51 29 20 22 0a 20 20 20 20 20  info(%Q) ".     
30bd0 20 20 20 20 20 22 20 20 57 48 45 52 45 20 70 6b       "  WHERE pk
30be0 3d 31 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 74  =1 AND type='int
30bf0 65 67 65 72 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  eger' COLLATE no
30c00 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
30c10 22 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54  "  AND NOT EXIST
30c20 53 20 28 53 45 4c 45 43 54 20 63 69 64 20 46 52  S (SELECT cid FR
30c30 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
30c40 69 6e 66 6f 28 25 51 29 20 57 48 45 52 45 20 70  info(%Q) WHERE p
30c50 6b 3d 32 29 22 0a 20 20 20 20 20 20 20 20 20 20  k=2)".          
30c60 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20  , zName, zName. 
30c70 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
30c80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30c90 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
30ca0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
30cb0 70 50 6b 46 69 6e 64 65 72 29 20 29 7b 0a 20 20  pPkFinder) ){.  
30cc0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50          pTab->iP
30cd0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
30ce0 6d 6e 5f 69 6e 74 28 70 50 6b 46 69 6e 64 65 72  mn_int(pPkFinder
30cf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30d00 7a 50 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zPk = (const cha
30d10 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
30d20 6e 5f 74 65 78 74 28 70 50 6b 46 69 6e 64 65 72  n_text(pPkFinder
30d30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
30d40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
30d50 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73  Tab->zQuoted = s
30d60 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c  hellMPrintf(&rc,
30d70 20 22 5c 22 25 77 5c 22 22 2c 20 7a 4e 61 6d 65   "\"%w\"", zName
30d80 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
30d90 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zlCol = (char**)
30da0 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c  shellMalloc(&rc,
30db0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
30dc0 20 28 6e 53 71 6c 43 6f 6c 2b 31 29 29 3b 0a 20   (nSqlCol+1));. 
30dd0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
30de0 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a 20 20 20 20  = nSqlCol;..    
30df0 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29 7b    if( bIntkey ){
30e00 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
30e10 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c  zlCol[0] = shell
30e20 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 5c 22  MPrintf(&rc, "\"
30e30 25 77 5c 22 22 2c 20 7a 50 6b 29 3b 0a 20 20 20  %w\"", zPk);.   
30e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e50 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30    pTab->azlCol[0
30e60 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
30e70 28 26 72 63 2c 20 22 22 29 3b 0a 20 20 20 20 20  (&rc, "");.     
30e80 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 31 3b 0a   }.      i = 1;.
30e90 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
30ea0 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
30eb0 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
30ec0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
30ed0 25 51 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  %Q || group_conc
30ee0 61 74 28 73 68 65 6c 6c 5f 69 64 71 75 6f 74 65  at(shell_idquote
30ef0 28 6e 61 6d 65 29 2c 20 27 2c 20 27 29 20 22 0a  (name), ', ') ".
30f00 20 20 20 20 20 20 20 20 20 20 22 20 20 46 49 4c            "  FIL
30f10 54 45 52 20 28 57 48 45 52 45 20 63 69 64 21 3d  TER (WHERE cid!=
30f20 25 64 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20  %d) OVER (ORDER 
30f30 42 59 20 25 73 20 63 69 64 29 20 22 0a 20 20 20  BY %s cid) ".   
30f40 20 20 20 20 20 20 20 22 46 52 4f 4d 20 70 72 61         "FROM pra
30f50 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25  gma_table_info(%
30f60 51 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Q)", .          
30f70 62 49 6e 74 6b 65 79 20 3f 20 22 2c 20 22 20 3a  bIntkey ? ", " :
30f80 20 22 22 2c 20 70 54 61 62 2d 3e 69 50 6b 2c 20   "", pTab->iPk, 
30f90 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e 74 6b  .          bIntk
30fa0 65 79 20 3f 20 22 22 20 3a 20 22 28 43 41 53 45  ey ? "" : "(CASE
30fb0 20 57 48 45 4e 20 70 6b 3d 30 20 54 48 45 4e 20   WHEN pk=0 THEN 
30fc0 31 30 30 30 30 30 30 20 45 4c 53 45 20 70 6b 20  1000000 ELSE pk 
30fd0 45 4e 44 29 2c 20 22 2c 0a 20 20 20 20 20 20 20  END), ",.       
30fe0 20 20 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29     zName.      )
30ff0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72  ;.      while( r
31000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31010 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
31020 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
31030 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
31040 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20 28   char *zText = (
31050 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
31060 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
31070 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
31080 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b     pTab->azlCol[
31090 69 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  i] = shellMPrint
310a0 66 28 26 72 63 2c 20 22 25 73 25 73 22 2c 20 70  f(&rc, "%s%s", p
310b0 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 2c 20  Tab->azlCol[0], 
310c0 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zText);.        
310d0 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
310e0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
310f0 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20  (&rc, pStmt);.. 
31100 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69       shellFinali
31110 7a 65 28 26 72 63 2c 20 70 50 6b 46 69 6e 64 65  ze(&rc, pPkFinde
31120 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
31130 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71 6c 69  finished:.  sqli
31140 74 65 33 5f 63 6c 6f 73 65 28 64 62 74 6d 70 29  te3_close(dbtmp)
31150 3b 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20  ;.  *pRc = rc;. 
31160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31170 4f 4b 20 7c 7c 20 28 70 54 61 62 20 26 26 20 70  OK || (pTab && p
31180 54 61 62 2d 3e 7a 51 75 6f 74 65 64 3d 3d 30 29  Tab->zQuoted==0)
31190 20 29 7b 0a 20 20 20 20 72 65 63 6f 76 65 72 46   ){.    recoverF
311a0 72 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a  reeTable(pTab);.
311b0 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
311c0 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
311d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
311e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
311f0 64 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  d to search the 
31200 73 63 68 65 6d 61 20 72 65 63 6f 76 65 72 65 64  schema recovered
31210 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 71 6c   from the.** sql
31220 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
31230 20 6f 66 20 74 68 65 20 28 70 6f 73 73 69 62 6c   of the (possibl
31240 79 29 20 63 6f 72 72 75 70 74 20 64 61 74 61 62  y) corrupt datab
31250 61 73 65 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f  ase as part.** o
31260 66 20 61 20 22 2e 72 65 63 6f 76 65 72 22 20 63  f a ".recover" c
31270 6f 6d 6d 61 6e 64 2e 20 53 70 65 63 69 66 69 63  ommand. Specific
31280 61 6c 6c 79 2c 20 66 6f 72 20 61 20 74 61 62 6c  ally, for a tabl
31290 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  e with root page
312a0 0a 2a 2a 20 69 52 6f 6f 74 20 61 6e 64 20 61 74  .** iRoot and at
312b0 20 6c 65 61 73 74 20 6e 43 6f 6c 20 63 6f 6c 75   least nCol colu
312c0 6d 6e 73 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  mns. Additionall
312d0 79 2c 20 69 66 20 62 49 6e 74 6b 65 79 20 69 73  y, if bIntkey is
312e0 20 30 2c 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   0, the.** table
312f0 20 6d 75 73 74 20 62 65 20 61 20 57 49 54 48 4f   must be a WITHO
31300 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c 20  UT ROWID table, 
31310 6f 72 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  or if non-zero, 
31320 6e 6f 74 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68  not one of.** th
31330 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
31340 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20  table is found, 
31350 61 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65 2a  a (RecoverTable*
31360 29 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75  ) object is retu
31370 72 6e 65 64 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20  rned. Or, if.** 
31380 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 69 73  no such table is
31390 20 66 6f 75 6e 64 2c 20 62 75 74 20 62 49 6e 74   found, but bInt
313a0 6b 65 79 20 69 73 20 66 61 6c 73 65 20 61 6e 64  key is false and
313b0 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a   iRoot is the .*
313c0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
313d0 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 72  n index in the r
313e0 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c  ecovered schema,
313f0 20 74 68 65 6e 20 28 2a 70 62 4e 6f 6f 70 29 20   then (*pbNoop) 
31400 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 72 75  is.** set to tru
31410 65 20 61 6e 64 20 4e 55 4c 4c 20 72 65 74 75 72  e and NULL retur
31420 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  ned. Or, if ther
31430 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 61 62  e is no such tab
31440 6c 65 20 6f 72 0a 2a 2a 20 69 6e 64 65 78 2c 20  le or.** index, 
31450 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
31460 20 61 6e 64 20 28 2a 70 62 4e 6f 6f 70 29 20 73   and (*pbNoop) s
31470 65 74 20 74 6f 20 30 2c 20 69 6e 64 69 63 61 74  et to 0, indicat
31480 69 6e 67 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ing that.** the 
31490 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 77 72  caller should wr
314a0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
314b0 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a  orphans table..*
314c0 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72  /.static Recover
314d0 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 46 69  Table *recoverFi
314e0 6e 64 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c  ndTable(.  Shell
314f0 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
31500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
31510 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74  ell state object
31520 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20   */.  int *pRc, 
31530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31540 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
31550 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
31560 20 69 6e 74 20 69 52 6f 6f 74 2c 20 20 20 20 20   int iRoot,     
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
31590 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
315a0 62 49 6e 74 6b 65 79 2c 20 20 20 20 20 20 20 20  bIntkey,        
315b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
315c0 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 74 6b 65  rue for an intke
315d0 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  y table */.  int
315e0 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31600 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
31610 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  s in table */.  
31620 69 6e 74 20 2a 70 62 4e 6f 6f 70 20 20 20 20 20  int *pbNoop     
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31640 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
31650 69 52 6f 6f 74 20 69 73 20 72 6f 6f 74 20 6f 66  iRoot is root of
31660 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 73   index */.){.  s
31670 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
31680 6d 74 20 3d 20 30 3b 0a 20 20 52 65 63 6f 76 65  mt = 0;.  Recove
31690 72 54 61 62 6c 65 20 2a 70 52 65 74 20 3d 20 30  rTable *pRet = 0
316a0 3b 0a 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20  ;.  int bNoop = 
316b0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
316c0 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e  *zSql = 0;.  con
316d0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
316e0 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   0;..  /* Search
316f0 20 74 68 65 20 72 65 63 6f 76 65 72 65 64 20 73   the recovered s
31700 63 68 65 6d 61 20 66 6f 72 20 61 6e 20 6f 62 6a  chema for an obj
31710 65 63 74 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ect with root pa
31720 67 65 20 69 52 6f 6f 74 2e 20 2a 2f 0a 20 20 73  ge iRoot. */.  s
31730 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
31740 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 70 52  f(pState->db, pR
31750 63 2c 20 26 70 53 74 6d 74 2c 0a 20 20 20 20 20  c, &pStmt,.     
31760 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e   "SELECT type, n
31770 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 72 65  ame, sql FROM re
31780 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57 48  covery.schema WH
31790 45 52 45 20 72 6f 6f 74 70 61 67 65 3d 25 64 22  ERE rootpage=%d"
317a0 2c 20 69 52 6f 6f 74 0a 20 20 29 3b 0a 20 20 77  , iRoot.  );.  w
317b0 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49  hile( *pRc==SQLI
317c0 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
317d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
317e0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
317f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
31800 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
31810 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
31820 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
31830 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d      if( bIntkey=
31840 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  =0 && sqlite3_st
31850 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22 69 6e  ricmp(zType, "in
31860 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  dex")==0 ){.    
31870 20 20 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20 20    bNoop = 1;.   
31880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
31890 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
318a0 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22  stricmp(zType, "
318b0 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
318c0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e      zName = (con
318d0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
318e0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
318f0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 53  mt, 1);.      zS
31900 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
31910 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
31920 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b  _text(pStmt, 2);
31930 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 72 65  .      pRet = re
31940 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 70 52  coverNewTable(pR
31950 63 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 2c 20  c, zName, zSql, 
31960 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 29 3b 0a  bIntkey, nCol);.
31970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31980 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 46   }.  }..  shellF
31990 69 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 53 74  inalize(pRc, pSt
319a0 6d 74 29 3b 0a 20 20 2a 70 62 4e 6f 6f 70 20 3d  mt);.  *pbNoop =
319b0 20 62 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e   bNoop;.  return
319c0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
319d0 52 65 74 75 72 6e 20 61 20 52 65 63 6f 76 65 72  Return a Recover
319e0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
319f0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6f 72  resenting the or
31a00 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a  phans table..*/.
31a10 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54 61  static RecoverTa
31a20 62 6c 65 20 2a 72 65 63 6f 76 65 72 4f 72 70 68  ble *recoverOrph
31a30 61 6e 54 61 62 6c 65 28 0a 20 20 53 68 65 6c 6c  anTable(.  Shell
31a40 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
31a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
31a60 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63 74  ell state object
31a70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20   */.  int *pRc, 
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
31aa0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
31ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
31ac0 73 74 41 6e 64 46 6f 75 6e 64 2c 20 20 20 20 20  stAndFound,     
31ad0 20 2f 2a 20 42 61 73 65 20 6e 61 6d 65 20 66 6f   /* Base name fo
31ae0 72 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 20  r orphans table 
31af0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 20 20  */.  int nCol   
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31b20 66 20 75 73 65 72 20 64 61 74 61 20 63 6f 6c 75  f user data colu
31b30 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 52 65 63 6f  mns */.){.  Reco
31b40 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  verTable *pTab =
31b50 20 30 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e 3d   0;.  if( nCol>=
31b60 30 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54  0 && *pRc==SQLIT
31b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
31b80 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  i;..    /* This 
31b90 62 6c 6f 63 6b 20 64 65 74 65 72 6d 69 6e 65 73  block determines
31ba0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
31bb0 20 6f 72 70 68 61 6e 20 74 61 62 6c 65 2e 20 54   orphan table. T
31bc0 68 65 20 70 72 65 66 65 72 65 64 0a 20 20 20 20  he prefered.    
31bd0 2a 2a 20 6e 61 6d 65 20 69 73 20 7a 4c 6f 73 74  ** name is zLost
31be0 41 6e 64 46 6f 75 6e 64 2e 20 42 75 74 20 69 66  AndFound. But if
31bf0 20 74 68 61 74 20 63 6c 61 73 68 65 73 20 77 69   that clashes wi
31c00 74 68 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65 0a  th another name.
31c10 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
31c20 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c 20  covered schema, 
31c30 74 72 79 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e  try zLostAndFoun
31c40 64 5f 30 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f 75  d_0, zLostAndFou
31c50 6e 64 5f 31 0a 20 20 20 20 2a 2a 20 61 6e 64 20  nd_1.    ** and 
31c60 73 6f 20 6f 6e 20 75 6e 74 69 6c 20 61 20 6e 6f  so on until a no
31c70 6e 2d 63 6c 61 73 68 69 6e 67 20 6e 61 6d 65 20  n-clashing name 
31c80 69 73 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20  is found.  */.  
31c90 20 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b 0a    int iTab = 0;.
31ca0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d      char *zTab =
31cb0 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52   shellMPrintf(pR
31cc0 63 2c 20 22 25 73 22 2c 20 7a 4c 6f 73 74 41 6e  c, "%s", zLostAn
31cd0 64 46 6f 75 6e 64 29 3b 0a 20 20 20 20 73 71 6c  dFound);.    sql
31ce0 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74  ite3_stmt *pTest
31cf0 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c 6c 50   = 0;.    shellP
31d00 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64  repare(pState->d
31d10 62 2c 20 70 52 63 2c 0a 20 20 20 20 20 20 20 20  b, pRc,.        
31d20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 72  "SELECT 1 FROM r
31d30 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57  ecovery.schema W
31d40 48 45 52 45 20 6e 61 6d 65 3d 3f 22 2c 20 26 70  HERE name=?", &p
31d50 54 65 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Test.    );.    
31d60 69 66 28 20 70 54 65 73 74 20 29 20 73 71 6c 69  if( pTest ) sqli
31d70 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
31d80 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d 31  est, 1, zTab, -1
31d90 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
31da0 4e 54 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  NT);.    while( 
31db0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
31dc0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
31dd0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65 73  qlite3_step(pTes
31de0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 68 65 6c  t) ){.      shel
31df0 6c 52 65 73 65 74 28 70 52 63 2c 20 70 54 65 73  lReset(pRc, pTes
31e00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
31e10 33 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  3_free(zTab);.  
31e20 20 20 20 20 7a 54 61 62 20 3d 20 73 68 65 6c 6c      zTab = shell
31e30 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73  MPrintf(pRc, "%s
31e40 5f 25 64 22 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f  _%d", zLostAndFo
31e50 75 6e 64 2c 20 69 54 61 62 2b 2b 29 3b 0a 20 20  und, iTab++);.  
31e60 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
31e70 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c 20  _text(pTest, 1, 
31e80 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zTab, -1, SQLITE
31e90 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
31ea0 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
31eb0 6c 69 7a 65 28 70 52 63 2c 20 70 54 65 73 74 29  lize(pRc, pTest)
31ec0 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 28 52  ;..    pTab = (R
31ed0 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65  ecoverTable*)she
31ee0 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69  llMalloc(pRc, si
31ef0 7a 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c  zeof(RecoverTabl
31f00 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  e));.    if( pTa
31f10 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
31f20 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65 6c 6c  >zQuoted = shell
31f30 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 5c 22  MPrintf(pRc, "\"
31f40 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a 20 20  %w\"", zTab);.  
31f50 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
31f60 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61   nCol;.      pTa
31f70 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20  b->iPk = -2;.   
31f80 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b     if( nCol>0 ){
31f90 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
31fa0 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a 29  zlCol = (char**)
31fb0 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c  shellMalloc(pRc,
31fc0 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2a   sizeof(char*) *
31fd0 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20   (nCol+1));.    
31fe0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 7a      if( pTab->az
31ff0 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  lCol ){.        
32000 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e    pTab->azlCol[n
32010 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69  Col] = shellMPri
32020 6e 74 66 28 70 52 63 2c 20 22 22 29 3b 0a 20 20  ntf(pRc, "");.  
32030 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 43          for(i=nC
32040 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ol-1; i>=0; i--)
32050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  {.            pT
32060 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d 20  ab->azlCol[i] = 
32070 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52 63  shellMPrintf(pRc
32080 2c 20 22 25 73 2c 20 4e 55 4c 4c 22 2c 20 70 54  , "%s, NULL", pT
32090 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 2b 31 5d 29  ab->azlCol[i+1])
320a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
320b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
320c0 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 63 21  .      if( *pRc!
320d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
320e0 20 20 20 20 20 20 72 65 63 6f 76 65 72 46 72 65        recoverFre
320f0 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
32100 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
32110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32120 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32130 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
32140 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
32150 45 20 54 41 42 4c 45 20 25 73 28 72 6f 6f 74 70  E TABLE %s(rootp
32160 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 22 0a 20  gno INTEGER, ". 
32170 20 20 20 20 20 20 20 20 20 20 20 22 70 67 6e 6f             "pgno
32180 20 49 4e 54 45 47 45 52 2c 20 6e 66 69 65 6c 64   INTEGER, nfield
32190 20 49 4e 54 45 47 45 52 2c 20 69 64 20 49 4e 54   INTEGER, id INT
321a0 45 47 45 52 22 2c 20 70 54 61 62 2d 3e 7a 51 75  EGER", pTab->zQu
321b0 6f 74 65 64 0a 20 20 20 20 20 20 20 20 29 3b 0a  oted.        );.
321c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
321d0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
321e0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
321f0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
32200 20 22 2c 20 63 25 64 22 2c 20 69 29 3b 0a 20 20   ", c%d", i);.  
32210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32220 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
32230 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c 6e 22 29 3b  e->out, ");\n");
32240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32250 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32260 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zTab);.  }.  ret
32270 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
32280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32290 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
322a0 63 6f 76 65 72 20 64 61 74 61 20 66 72 6f 6d 20  cover data from 
322b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 20  the database. A 
322c0 73 63 72 69 70 74 0a 2a 2a 20 74 6f 20 63 6f 6e  script.** to con
322d0 73 74 72 75 63 74 20 61 20 6e 65 77 20 64 61 74  struct a new dat
322e0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
322f0 20 61 6c 6c 20 72 65 63 6f 76 65 72 65 64 20 64   all recovered d
32300 61 74 61 20 69 73 20 6f 75 74 70 75 74 0a 2a 2a  ata is output.**
32310 20 6f 6e 20 73 74 72 65 61 6d 20 70 53 74 61 74   on stream pStat
32320 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  e->out..*/.stati
32330 63 20 69 6e 74 20 72 65 63 6f 76 65 72 44 61 74  c int recoverDat
32340 61 62 61 73 65 43 6d 64 28 53 68 65 6c 6c 53 74  abaseCmd(ShellSt
32350 61 74 65 20 2a 70 53 74 61 74 65 2c 20 69 6e 74  ate *pState, int
32360 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
32370 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
32380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
32390 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 6f 6f  lite3_stmt *pLoo
323a0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  p = 0;        /*
323b0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
323c0 6c 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a  l root pages */.
323d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
323e0 70 50 61 67 65 73 20 3d 20 30 3b 20 20 20 20 20  pPages = 0;     
323f0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
32400 68 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 61  h all pages in a
32410 20 67 72 6f 75 70 20 2a 2f 0a 20 20 73 71 6c 69   group */.  sqli
32420 74 65 33 5f 73 74 6d 74 20 2a 70 43 65 6c 6c 73  te3_stmt *pCells
32430 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4c   = 0;       /* L
32440 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
32450 63 65 6c 6c 73 20 69 6e 20 61 20 70 61 67 65 20  cells in a page 
32460 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
32470 2a 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20 22  *zRecoveryDb = "
32480 22 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ";   /* Name of 
32490 22 72 65 63 6f 76 65 72 79 22 20 64 61 74 61 62  "recovery" datab
324a0 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
324b0 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75  har *zLostAndFou
324c0 6e 64 20 3d 20 22 6c 6f 73 74 5f 61 6e 64 5f 66  nd = "lost_and_f
324d0 6f 75 6e 64 22 3b 0a 20 20 69 6e 74 20 69 3b 0a  ound";.  int i;.
324e0 20 20 69 6e 74 20 6e 4f 72 70 68 61 6e 20 3d 20    int nOrphan = 
324f0 2d 31 3b 0a 20 20 52 65 63 6f 76 65 72 54 61 62  -1;.  RecoverTab
32500 6c 65 20 2a 70 4f 72 70 68 61 6e 20 3d 20 30 3b  le *pOrphan = 0;
32510 0a 0a 20 20 69 6e 74 20 62 46 72 65 65 6c 69 73  ..  int bFreelis
32520 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  t = 1;          
32530 20 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d 66 72      /* 0 if --fr
32540 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 20 69  eelist-corrupt i
32550 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20  s specified */. 
32560 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
32570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
32580 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a   *z = azArg[i];.
32590 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
325a0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
325b0 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
325c0 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  .    n = strlen3
325d0 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  0(z);.    if( n<
325e0 3d 31 37 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d  =17 && memcmp("-
325f0 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74  freelist-corrupt
32600 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ", z, n)==0 ){. 
32610 20 20 20 20 20 62 46 72 65 65 6c 69 73 74 20 3d       bFreelist =
32620 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   0;.    }else.  
32630 20 20 69 66 28 20 6e 3c 3d 31 32 20 26 26 20 6d    if( n<=12 && m
32640 65 6d 63 6d 70 28 22 2d 72 65 63 6f 76 65 72 79  emcmp("-recovery
32650 2d 64 62 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26  -db", z, n)==0 &
32660 26 20 69 3c 28 6e 41 72 67 2d 31 29 20 29 7b 0a  & i<(nArg-1) ){.
32670 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
32680 20 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20 61   zRecoveryDb = a
32690 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  zArg[i];.    }el
326a0 73 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 35  se.    if( n<=15
326b0 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 6c 6f 73   && memcmp("-los
326c0 74 2d 61 6e 64 2d 66 6f 75 6e 64 22 2c 20 7a 2c  t-and-found", z,
326d0 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28 6e 41 72   n)==0 && i<(nAr
326e0 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69 2b  g-1) ){.      i+
326f0 2b 3b 0a 20 20 20 20 20 20 7a 4c 6f 73 74 41 6e  +;.      zLostAn
32700 64 46 6f 75 6e 64 20 3d 20 61 7a 41 72 67 5b 69  dFound = azArg[i
32710 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ];.    }.    els
32720 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
32730 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 65  ntf(stderr, "une
32740 78 70 65 63 74 65 64 20 6f 70 74 69 6f 6e 3a 20  xpected option: 
32750 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29  %s\n", azArg[i])
32760 3b 20 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ; .      raw_pri
32770 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70 74  ntf(stderr, "opt
32780 69 6f 6e 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20  ions are:\n");. 
32790 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
327a0 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 66  stderr, "    --f
327b0 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 5c  reelist-corrupt\
327c0 6e 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  n");.      raw_p
327d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
327e0 20 20 20 2d 2d 72 65 63 6f 76 65 72 79 2d 64 62     --recovery-db
327f0 20 44 41 54 41 42 41 53 45 5c 6e 22 29 3b 0a 20   DATABASE\n");. 
32800 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
32810 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d 6c  stderr, "    --l
32820 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 20 54 41  ost-and-found TA
32830 42 4c 45 2d 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  BLE-NAME\n");.  
32840 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
32850 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c    }.  }..  shell
32860 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74  ExecPrintf(pStat
32870 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20  e->db, &rc,.    
32880 2f 2a 20 41 74 74 61 63 68 20 61 6e 20 69 6e 2d  /* Attach an in-
32890 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
328a0 6e 61 6d 65 64 20 27 72 65 63 6f 76 65 72 79 27  named 'recovery'
328b0 2e 20 43 72 65 61 74 65 20 61 6e 20 69 6e 64 65  . Create an inde
328c0 78 65 64 20 0a 20 20 20 20 2a 2a 20 63 61 63 68  xed .    ** cach
328d0 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  e of the sqlite_
328e0 64 62 70 74 72 20 76 69 72 74 75 61 6c 20 74 61  dbptr virtual ta
328f0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 22 50 52 41  ble. */.    "PRA
32900 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
32910 65 6d 61 20 3d 20 6f 6e 3b 22 0a 20 20 20 20 22  ema = on;".    "
32920 41 54 54 41 43 48 20 25 51 20 41 53 20 72 65 63  ATTACH %Q AS rec
32930 6f 76 65 72 79 3b 22 0a 20 20 20 20 22 44 52 4f  overy;".    "DRO
32940 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
32950 53 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  S recovery.dbptr
32960 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42  ;".    "DROP TAB
32970 4c 45 20 49 46 20 45 58 49 53 54 53 20 72 65 63  LE IF EXISTS rec
32980 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 3b 22  overy.freelist;"
32990 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
329a0 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76   IF EXISTS recov
329b0 65 72 79 2e 6d 61 70 3b 22 0a 20 20 20 20 22 44  ery.map;".    "D
329c0 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
329d0 53 54 53 20 72 65 63 6f 76 65 72 79 2e 73 63 68  STS recovery.sch
329e0 65 6d 61 3b 22 0a 20 20 20 20 22 43 52 45 41 54  ema;".    "CREAT
329f0 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
32a00 2e 66 72 65 65 6c 69 73 74 28 70 67 6e 6f 20 49  .freelist(pgno I
32a10 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
32a20 45 59 29 3b 22 2c 20 7a 52 65 63 6f 76 65 72 79  EY);", zRecovery
32a30 44 62 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 62  Db.  );..  if( b
32a40 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
32a50 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65  shellExec(pState
32a60 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20  ->db, &rc,.     
32a70 20 22 57 49 54 48 20 74 72 75 6e 6b 28 70 67 6e   "WITH trunk(pgn
32a80 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20 20 22  o) AS (".      "
32a90 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69    SELECT shell_i
32aa0 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22 20 20  nt32(".      "  
32ab0 20 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61      (SELECT data
32ac0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
32ad0 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 31  age WHERE pgno=1
32ae0 29 2c 20 38 29 20 41 53 20 78 20 22 0a 20 20 20  ), 8) AS x ".   
32af0 20 20 20 22 20 20 20 20 20 20 57 48 45 52 45 20     "      WHERE 
32b00 78 3e 30 22 0a 20 20 20 20 20 20 22 20 20 20 20  x>0".      "    
32b10 55 4e 49 4f 4e 22 0a 20 20 20 20 20 20 22 20 20  UNION".      "  
32b20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74  SELECT shell_int
32b30 33 32 28 22 0a 20 20 20 20 20 20 22 20 20 20 20  32(".      "    
32b40 20 20 28 53 45 4c 45 43 54 20 64 61 74 61 20 46    (SELECT data F
32b50 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
32b60 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 74 72 75  e WHERE pgno=tru
32b70 6e 6b 2e 70 67 6e 6f 29 2c 20 30 29 20 41 53 20  nk.pgno), 0) AS 
32b80 78 20 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  x ".      "     
32b90 20 46 52 4f 4d 20 74 72 75 6e 6b 20 57 48 45 52   FROM trunk WHER
32ba0 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22 29 2c  E x>0".      "),
32bb0 22 0a 20 20 20 20 20 20 22 66 72 65 65 6c 69 73  ".      "freelis
32bc0 74 28 64 61 74 61 2c 20 6e 2c 20 66 72 65 65 70  t(data, n, freep
32bd0 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20  gno) AS (".     
32be0 20 22 20 20 53 45 4c 45 43 54 20 64 61 74 61 2c   "  SELECT data,
32bf0 20 6d 69 6e 28 31 36 33 38 34 2c 20 73 68 65 6c   min(16384, shel
32c00 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c 20 31 29  l_int32(data, 1)
32c10 2d 31 29 2c 20 74 2e 70 67 6e 6f 20 22 0a 20 20  -1), t.pgno ".  
32c20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f 4d 20      "      FROM 
32c30 74 72 75 6e 6b 20 74 2c 20 73 71 6c 69 74 65 5f  trunk t, sqlite_
32c40 64 62 70 61 67 65 20 73 20 57 48 45 52 45 20 73  dbpage s WHERE s
32c50 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f 22 0a 20 20  .pgno=t.pgno".  
32c60 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41      "    UNION A
32c70 4c 4c 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c  LL".      "  SEL
32c80 45 43 54 20 64 61 74 61 2c 20 6e 2d 31 2c 20 73  ECT data, n-1, s
32c90 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c  hell_int32(data,
32ca0 20 32 2b 6e 29 20 22 0a 20 20 20 20 20 20 22 20   2+n) ".      " 
32cb0 20 20 20 20 20 46 52 4f 4d 20 66 72 65 65 6c 69       FROM freeli
32cc0 73 74 20 57 48 45 52 45 20 6e 3e 3d 30 22 0a 20  st WHERE n>=0". 
32cd0 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20 22       ")".      "
32ce0 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 72 65 63  REPLACE INTO rec
32cf0 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 20 53  overy.freelist S
32d00 45 4c 45 43 54 20 66 72 65 65 70 67 6e 6f 20 46  ELECT freepgno F
32d10 52 4f 4d 20 66 72 65 65 6c 69 73 74 3b 22 0a 20  ROM freelist;". 
32d20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
32d30 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
32d40 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
32d50 73 65 2c 20 61 64 64 20 61 6c 6c 20 70 6f 69 6e  se, add all poin
32d60 74 65 72 2d 6d 61 70 20 70 61 67 65 73 20 74 6f  ter-map pages to
32d70 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
32d80 73 74 20 74 61 62 6c 65 2e 20 44 6f 20 74 68 69  st table. Do thi
32d90 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  s regardless of 
32da0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 0a  whether or not .
32db0 20 20 2a 2a 20 2d 2d 66 72 65 65 6c 69 73 74 2d    ** --freelist-
32dc0 63 6f 72 72 75 70 74 20 77 61 73 20 73 70 65 63  corrupt was spec
32dd0 69 66 69 65 64 2e 20 20 2a 2f 0a 20 20 73 68 65  ified.  */.  she
32de0 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d 3e 64  llExec(pState->d
32df0 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 22 57 49  b, &rc, .    "WI
32e00 54 48 20 70 74 72 6d 61 70 28 70 67 6e 6f 29 20  TH ptrmap(pgno) 
32e10 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  AS (".    "  SEL
32e20 45 43 54 20 32 20 57 48 45 52 45 20 73 68 65 6c  ECT 2 WHERE shel
32e30 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 22 20  l_int32(".    " 
32e40 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61 20     (SELECT data 
32e50 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61  FROM sqlite_dbpa
32e60 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 29  ge WHERE pgno=1)
32e70 2c 20 31 33 22 0a 20 20 20 20 22 20 20 29 22 0a  , 13".    "  )".
32e80 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41      "    UNION A
32e90 4c 4c 20 22 0a 20 20 20 20 22 20 20 53 45 4c 45  LL ".    "  SELE
32ea0 43 54 20 70 67 6e 6f 2b 31 2b 28 53 45 4c 45 43  CT pgno+1+(SELEC
32eb0 54 20 70 61 67 65 5f 73 69 7a 65 20 46 52 4f 4d  T page_size FROM
32ec0 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 73 69 7a   pragma_page_siz
32ed0 65 29 2f 35 20 41 53 20 70 70 20 22 0a 20 20 20  e)/5 AS pp ".   
32ee0 20 22 20 20 46 52 4f 4d 20 70 74 72 6d 61 70 20   "  FROM ptrmap 
32ef0 57 48 45 52 45 20 70 70 3c 3d 28 53 45 4c 45 43  WHERE pp<=(SELEC
32f00 54 20 70 61 67 65 5f 63 6f 75 6e 74 20 46 52 4f  T page_count FRO
32f10 4d 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f  M pragma_page_co
32f20 75 6e 74 29 22 0a 20 20 20 20 22 29 22 0a 20 20  unt)".    ")".  
32f30 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
32f40 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73  recovery.freelis
32f50 74 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52  t SELECT pgno FR
32f60 4f 4d 20 70 74 72 6d 61 70 22 0a 20 20 29 3b 0a  OM ptrmap".  );.
32f70 0a 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74  .  shellExec(pSt
32f80 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20  ate->db, &rc, . 
32f90 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
32fa0 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 28   recovery.dbptr(
32fb0 22 0a 20 20 20 20 22 20 20 20 20 20 20 70 67 6e  ".    "      pgn
32fc0 6f 2c 20 63 68 69 6c 64 2c 20 50 52 49 4d 41 52  o, child, PRIMAR
32fd0 59 20 4b 45 59 28 63 68 69 6c 64 2c 20 70 67 6e  Y KEY(child, pgn
32fe0 6f 29 22 0a 20 20 20 20 22 29 20 57 49 54 48 4f  o)".    ") WITHO
32ff0 55 54 20 52 4f 57 49 44 3b 22 0a 20 20 20 20 22  UT ROWID;".    "
33000 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
33010 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 64   INTO recovery.d
33020 62 70 74 72 28 70 67 6e 6f 2c 20 63 68 69 6c 64  bptr(pgno, child
33030 29 20 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c  ) ".    "    SEL
33040 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
33050 65 5f 64 62 70 74 72 22 0a 20 20 20 20 22 20 20  e_dbptr".    "  
33060 20 20 20 20 57 48 45 52 45 20 70 67 6e 6f 20 4e      WHERE pgno N
33070 4f 54 20 49 4e 20 66 72 65 65 6c 69 73 74 20 41  OT IN freelist A
33080 4e 44 20 63 68 69 6c 64 20 4e 4f 54 20 49 4e 20  ND child NOT IN 
33090 66 72 65 65 6c 69 73 74 3b 22 0a 0a 20 20 20 20  freelist;"..    
330a0 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70 6f  /* Delete any po
330b0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 31 2e  inter to page 1.
330c0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
330d0 61 74 20 70 61 67 65 20 31 20 69 73 20 63 6f 6e  at page 1 is con
330e0 73 69 64 65 72 65 64 0a 20 20 20 20 2a 2a 20 61  sidered.    ** a
330f0 20 72 6f 6f 74 20 70 61 67 65 2c 20 72 65 67 61   root page, rega
33100 72 64 6c 65 73 73 20 6f 66 20 68 6f 77 20 63 6f  rdless of how co
33110 72 72 75 70 74 20 74 68 65 20 64 62 20 69 73 2e  rrupt the db is.
33120 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45 54 45 20   */.    "DELETE 
33130 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62  FROM recovery.db
33140 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64 20  ptr WHERE child 
33150 3d 20 31 3b 22 0a 0a 20 20 20 20 2f 2a 20 44 65  = 1;"..    /* De
33160 6c 65 74 65 20 61 6c 6c 20 70 6f 69 6e 74 65 72  lete all pointer
33170 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 20 74  s to any pages t
33180 68 61 74 20 68 61 76 65 20 6d 6f 72 65 20 74 68  hat have more th
33190 61 6e 20 6f 6e 65 20 70 6f 69 6e 74 65 72 0a 20  an one pointer. 
331a0 20 20 20 2a 2a 20 74 6f 20 74 68 65 6d 2e 20 53     ** to them. S
331b0 75 63 68 20 70 61 67 65 73 20 77 69 6c 6c 20 62  uch pages will b
331c0 65 20 74 72 65 61 74 65 64 20 61 73 20 72 6f 6f  e treated as roo
331d0 74 20 70 61 67 65 73 20 77 68 65 6e 20 72 65 63  t pages when rec
331e0 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 64  overing.    ** d
331f0 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 22 44 45  ata.  */.    "DE
33200 4c 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65  LETE FROM recove
33210 72 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63  ry.dbptr WHERE c
33220 68 69 6c 64 20 49 4e 20 28 22 0a 20 20 20 20 22  hild IN (".    "
33230 20 20 53 45 4c 45 43 54 20 63 68 69 6c 64 20 46    SELECT child F
33240 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70  ROM recovery.dbp
33250 74 72 20 47 52 4f 55 50 20 42 59 20 63 68 69 6c  tr GROUP BY chil
33260 64 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a  d HAVING count(*
33270 29 3e 31 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20  )>1".    ");".. 
33280 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
33290 20 22 6d 61 70 22 20 74 61 62 6c 65 20 74 68 61   "map" table tha
332a0 74 20 77 69 6c 6c 20 28 65 76 65 6e 74 75 61 6c  t will (eventual
332b0 6c 79 29 20 63 6f 6e 74 61 69 6e 20 69 6e 73 74  ly) contain inst
332c0 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  ructions.    ** 
332d0 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74 68  for dealing with
332e0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
332f0 65 20 64 62 20 74 68 61 74 20 63 6f 6e 74 61 69  e db that contai
33300 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 0a  ns one or more .
33310 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 2e 20      ** records. 
33320 2a 2f 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  */.    "CREATE T
33330 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 6d 61  ABLE recovery.ma
33340 70 28 22 0a 20 20 20 20 20 20 22 70 67 6e 6f 20  p(".      "pgno 
33350 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
33360 4b 45 59 2c 20 6d 61 78 6c 65 6e 20 49 4e 54 2c  KEY, maxlen INT,
33370 20 69 6e 74 6b 65 79 2c 20 72 6f 6f 74 20 49 4e   intkey, root IN
33380 54 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20 20  T".    ");"..   
33390 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 61 62   /* Populate tab
333a0 6c 65 20 5b 6d 61 70 5d 2e 20 49 66 20 74 68 65  le [map]. If the
333b0 72 65 20 61 72 65 20 63 69 72 63 75 6c 61 72 20  re are circular 
333c0 6c 6f 6f 70 73 20 6f 66 20 70 61 67 65 73 20 69  loops of pages i
333d0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
333e0 61 62 61 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  abase, the follo
333f0 77 69 6e 67 20 61 64 64 73 20 61 6c 6c 20 70 61  wing adds all pa
33400 67 65 73 20 69 6e 20 73 75 63 68 20 61 20 6c 6f  ges in such a lo
33410 6f 70 20 74 6f 20 74 68 65 20 6d 61 70 0a 20 20  op to the map.  
33420 20 20 2a 2a 20 61 73 20 69 6e 64 69 76 69 64 75    ** as individu
33430 61 6c 20 72 6f 6f 74 20 70 61 67 65 73 2e 20 54  al root pages. T
33440 68 69 73 20 63 6f 75 6c 64 20 62 65 20 68 61 6e  his could be han
33450 64 6c 65 64 20 62 65 74 74 65 72 2e 20 20 2a 2f  dled better.  */
33460 0a 20 20 20 20 22 57 49 54 48 20 70 61 67 65 73  .    "WITH pages
33470 28 69 2c 20 6d 61 78 6c 65 6e 29 20 41 53 20 28  (i, maxlen) AS (
33480 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
33490 70 61 67 65 5f 63 6f 75 6e 74 2c 20 28 22 0a 20  page_count, (". 
334a0 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6d     "    SELECT m
334b0 61 78 28 66 69 65 6c 64 2b 31 29 20 46 52 4f 4d  ax(field+1) FROM
334c0 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57   sqlite_dbdata W
334d0 48 45 52 45 20 70 67 6e 6f 3d 70 61 67 65 5f 63  HERE pgno=page_c
334e0 6f 75 6e 74 22 0a 20 20 20 20 22 20 20 29 20 46  ount".    "  ) F
334f0 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67 65 5f  ROM pragma_page_
33500 63 6f 75 6e 74 20 57 48 45 52 45 20 70 61 67 65  count WHERE page
33510 5f 63 6f 75 6e 74 3e 30 22 0a 20 20 20 20 22 20  _count>0".    " 
33520 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20     UNION ALL".  
33530 20 20 22 20 20 53 45 4c 45 43 54 20 69 2d 31 2c    "  SELECT i-1,
33540 20 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c   (".    "    SEL
33550 45 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29  ECT max(field+1)
33560 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64   FROM sqlite_dbd
33570 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 69  ata WHERE pgno=i
33580 2d 31 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f  -1".    "  ) FRO
33590 4d 20 70 61 67 65 73 20 57 48 45 52 45 20 69 3e  M pages WHERE i>
335a0 3d 32 22 0a 20 20 20 20 22 29 22 0a 20 20 20 20  =2".    ")".    
335b0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63  "INSERT INTO rec
335c0 6f 76 65 72 79 2e 6d 61 70 28 70 67 6e 6f 2c 20  overy.map(pgno, 
335d0 6d 61 78 6c 65 6e 2c 20 69 6e 74 6b 65 79 2c 20  maxlen, intkey, 
335e0 72 6f 6f 74 29 20 22 0a 20 20 20 20 22 20 20 53  root) ".    "  S
335f0 45 4c 45 43 54 20 69 2c 20 6d 61 78 6c 65 6e 2c  ELECT i, maxlen,
33600 20 4e 55 4c 4c 2c 20 28 22 0a 20 20 20 20 22 20   NULL, (".    " 
33610 20 20 20 57 49 54 48 20 70 28 6f 72 69 67 2c 20     WITH p(orig, 
33620 70 67 6e 6f 2c 20 70 61 72 65 6e 74 29 20 41 53  pgno, parent) AS
33630 20 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 53   (".    "      S
33640 45 4c 45 43 54 20 30 2c 20 69 2c 20 28 53 45 4c  ELECT 0, i, (SEL
33650 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65  ECT pgno FROM re
33660 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
33670 52 45 20 63 68 69 6c 64 3d 69 29 22 0a 20 20 20  RE child=i)".   
33680 20 22 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20   "        UNION 
33690 22 0a 20 20 20 20 22 20 20 20 20 20 20 53 45 4c  ".    "      SEL
336a0 45 43 54 20 69 2c 20 70 2e 70 61 72 65 6e 74 2c  ECT i, p.parent,
336b0 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20   ".    "        
336c0 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f  (SELECT pgno FRO
336d0 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  M recovery.dbptr
336e0 20 57 48 45 52 45 20 63 68 69 6c 64 3d 70 2e 70   WHERE child=p.p
336f0 61 72 65 6e 74 29 20 46 52 4f 4d 20 70 22 0a 20  arent) FROM p". 
33700 20 20 20 22 20 20 20 20 29 22 0a 20 20 20 20 22     "    )".    "
33710 20 20 20 20 53 45 4c 45 43 54 20 70 67 6e 6f 20      SELECT pgno 
33720 46 52 4f 4d 20 70 20 57 48 45 52 45 20 28 70 61  FROM p WHERE (pa
33730 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20  rent IS NULL OR 
33740 70 67 6e 6f 20 3d 20 6f 72 69 67 29 22 0a 20 20  pgno = orig)".  
33750 20 20 22 29 20 22 0a 20 20 20 20 22 46 52 4f 4d    ") ".    "FROM
33760 20 70 61 67 65 73 20 57 48 45 52 45 20 6d 61 78   pages WHERE max
33770 6c 65 6e 20 3e 20 30 20 41 4e 44 20 69 20 4e 4f  len > 0 AND i NO
33780 54 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a  T IN freelist;".
33790 20 20 20 20 22 55 50 44 41 54 45 20 72 65 63 6f      "UPDATE reco
337a0 76 65 72 79 2e 6d 61 70 20 41 53 20 6f 20 53 45  very.map AS o SE
337b0 54 20 69 6e 74 6b 65 79 20 3d 20 28 22 0a 20 20  T intkey = (".  
337c0 20 20 22 20 20 53 45 4c 45 43 54 20 73 75 62 73    "  SELECT subs
337d0 74 72 28 64 61 74 61 2c 20 31 2c 20 31 29 3d 3d  tr(data, 1, 1)==
337e0 58 27 30 44 27 20 46 52 4f 4d 20 73 71 6c 69 74  X'0D' FROM sqlit
337f0 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70  e_dbpage WHERE p
33800 67 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a 20 20 20 20  gno=o.pgno".    
33810 22 29 3b 22 0a 0a 20 20 20 20 2f 2a 20 45 78 74  ");"..    /* Ext
33820 72 61 63 74 20 64 61 74 61 20 66 72 6f 6d 20 70  ract data from p
33830 61 67 65 20 31 20 61 6e 64 20 61 6e 79 20 6c 69  age 1 and any li
33840 6e 6b 65 64 20 70 61 67 65 73 20 69 6e 74 6f 20  nked pages into 
33850 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 72 65 63  table.    ** rec
33860 6f 76 65 72 79 2e 73 63 68 65 6d 61 2e 20 57 69  overy.schema. Wi
33870 74 68 20 74 68 65 20 73 61 6d 65 20 73 63 68 65  th the same sche
33880 6d 61 20 61 73 20 61 6e 20 73 71 6c 69 74 65 5f  ma as an sqlite_
33890 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 2a  master table.  *
338a0 2f 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 41  /.    "CREATE TA
338b0 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 73 63 68  BLE recovery.sch
338c0 65 6d 61 28 74 79 70 65 2c 20 6e 61 6d 65 2c 20  ema(type, name, 
338d0 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  tbl_name, rootpa
338e0 67 65 2c 20 73 71 6c 29 3b 22 0a 20 20 20 20 22  ge, sql);".    "
338f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63 6f  INSERT INTO reco
33900 76 65 72 79 2e 73 63 68 65 6d 61 20 53 45 4c 45  very.schema SELE
33910 43 54 20 22 0a 20 20 20 20 22 20 20 6d 61 78 28  CT ".    "  max(
33920 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d  CASE WHEN field=
33930 30 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53  0 THEN value ELS
33940 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20  E NULL END),".  
33950 20 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48    "  max(CASE WH
33960 45 4e 20 66 69 65 6c 64 3d 31 20 54 48 45 4e 20  EN field=1 THEN 
33970 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20  value ELSE NULL 
33980 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61  END),".    "  ma
33990 78 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c  x(CASE WHEN fiel
339a0 64 3d 32 20 54 48 45 4e 20 76 61 6c 75 65 20 45  d=2 THEN value E
339b0 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a  LSE NULL END),".
339c0 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45 20      "  max(CASE 
339d0 57 48 45 4e 20 66 69 65 6c 64 3d 33 20 54 48 45  WHEN field=3 THE
339e0 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c  N value ELSE NUL
339f0 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20  L END),".    "  
33a00 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69  max(CASE WHEN fi
33a10 65 6c 64 3d 34 20 54 48 45 4e 20 76 61 6c 75 65  eld=4 THEN value
33a20 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 22   ELSE NULL END)"
33a30 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74  .    "FROM sqlit
33a40 65 5f 64 62 64 61 74 61 20 57 48 45 52 45 20 70  e_dbdata WHERE p
33a50 67 6e 6f 20 49 4e 20 28 22 0a 20 20 20 20 22 20  gno IN (".    " 
33a60 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f   SELECT pgno FRO
33a70 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57  M recovery.map W
33a80 48 45 52 45 20 72 6f 6f 74 3d 31 22 0a 20 20 20  HERE root=1".   
33a90 20 22 29 22 0a 20 20 20 20 22 47 52 4f 55 50 20   ")".    "GROUP 
33aa0 42 59 20 70 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a  BY pgno, cell;".
33ab0 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
33ac0 58 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  X recovery.schem
33ad0 61 5f 72 6f 6f 74 70 61 67 65 20 4f 4e 20 73 63  a_rootpage ON sc
33ae0 68 65 6d 61 28 72 6f 6f 74 70 61 67 65 29 3b 22  hema(rootpage);"
33af0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  .  );..  /* Open
33b00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
33b10 74 68 65 6e 20 70 72 69 6e 74 20 6f 75 74 20 61  then print out a
33b20 6c 6c 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 2c 20  ll non-virtual, 
33b30 6e 6f 6e 2d 22 73 71 6c 69 74 65 5f 25 22 20 0a  non-"sqlite_%" .
33b40 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
33b50 45 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  E statements tha
33b60 74 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  t extracted from
33b70 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73 63   the existing sc
33b80 68 65 6d 61 2e 20 20 2a 2f 0a 20 20 69 66 28 20  hema.  */.  if( 
33b90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
33bb0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
33bc0 20 20 2f 2a 20 22 2e 72 65 63 6f 76 65 72 22 20    /* ".recover" 
33bd0 6d 69 67 68 74 20 6f 75 74 70 75 74 20 63 6f 6e  might output con
33be0 74 65 6e 74 20 69 6e 20 61 6e 20 6f 72 64 65 72  tent in an order
33bf0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d   which causes im
33c00 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20 66  mediate.    ** f
33c10 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
33c20 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
33c30 6c 61 74 65 64 2e 20 53 6f 20 64 69 73 61 62 6c  lated. So disabl
33c40 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 0a 20 20  e foreign-key.  
33c50 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
33c60 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
33c70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 20  revent problems 
33c80 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 74 68 65  when running the
33c90 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
33ca0 63 72 69 70 74 2e 20 2a 2f 0a 20 20 20 20 72 61  cript. */.    ra
33cb0 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  w_printf(pState-
33cc0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f  >out, "PRAGMA fo
33cd0 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c  reign_keys=OFF;\
33ce0 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  n");.    raw_pri
33cf0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
33d00 20 22 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20 20   "BEGIN;\n");.  
33d10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
33d20 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  ate->out, "PRAGM
33d30 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
33d40 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20 20  a = on;\n");.   
33d50 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53   shellPrepare(pS
33d60 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20  tate->db, &rc,. 
33d70 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
33d80 71 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  ql FROM recovery
33d90 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20 20 20  .schema ".      
33da0 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 74    "WHERE type='t
33db0 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c 49  able' AND sql LI
33dc0 4b 45 20 27 63 72 65 61 74 65 20 74 61 62 6c 65  KE 'create table
33dd0 25 27 22 2c 20 26 70 53 74 6d 74 0a 20 20 20 20  %'", &pStmt.    
33de0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
33df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
33e00 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
33e10 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
33e20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
33e30 61 72 20 2a 7a 43 72 65 61 74 65 54 61 62 6c 65  ar *zCreateTable
33e40 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
33e50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
33e60 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ext(pStmt, 0);. 
33e70 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
33e80 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43 52  pState->out, "CR
33e90 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
33ea0 54 20 45 58 49 53 54 53 20 25 73 3b 5c 6e 22 2c  T EXISTS %s;\n",
33eb0 20 0a 20 20 20 20 20 20 20 20 20 20 26 7a 43 72   .          &zCr
33ec0 65 61 74 65 54 61 62 6c 65 5b 31 32 5d 0a 20 20  eateTable[12].  
33ed0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
33ee0 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26   shellFinalize(&
33ef0 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a  rc, pStmt);.  }.
33f00 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
33f10 20 69 66 20 61 6e 20 6f 72 70 68 61 6e 20 74 61   if an orphan ta
33f20 62 6c 65 20 77 69 6c 6c 20 62 65 20 72 65 71 75  ble will be requ
33f30 69 72 65 64 2e 20 41 6e 64 20 69 66 20 73 6f 2c  ired. And if so,
33f40 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 75   how many.  ** u
33f50 73 65 72 20 63 6f 6c 75 6d 6e 73 20 69 74 20 73  ser columns it s
33f60 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 2a 2f  hould contain */
33f70 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  .  shellPrepare(
33f80 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
33f90 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20   .      "SELECT 
33fa0 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 6d 61 78  coalesce(max(max
33fb0 6c 65 6e 29 2c 20 2d 32 29 20 46 52 4f 4d 20 72  len), -2) FROM r
33fc0 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52  ecovery.map WHER
33fd0 45 20 72 6f 6f 74 3e 31 22 0a 20 20 20 20 20 20  E root>1".      
33fe0 2c 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20  , &pLoop.  );.  
33ff0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34000 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
34010 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c  =sqlite3_step(pL
34020 6f 6f 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72 70  oop) ){.    nOrp
34030 68 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  han = sqlite3_co
34040 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20  lumn_int(pLoop, 
34050 30 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46  0);.  }.  shellF
34060 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f  inalize(&rc, pLo
34070 6f 70 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 30  op);.  pLoop = 0
34080 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
34090 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  e(pState->db, &r
340a0 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  c,.      "SELECT
340b0 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76   pgno FROM recov
340c0 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72 6f  ery.map WHERE ro
340d0 6f 74 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a 20  ot=?", &pPages. 
340e0 20 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   );.  shellPrepa
340f0 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
34100 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  rc,.      "SELEC
34110 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20 67 72  T max(field), gr
34120 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c 6c  oup_concat(shell
34130 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71 75 6f  _escape_crnl(quo
34140 74 65 28 76 61 6c 75 65 29 29 2c 20 27 2c 20 27  te(value)), ', '
34150 29 22 0a 20 20 20 20 20 20 22 2c 20 6d 69 6e 28  )".      ", min(
34160 66 69 65 6c 64 29 20 22 0a 20 20 20 20 20 20 22  field) ".      "
34170 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61  FROM sqlite_dbda
34180 74 61 20 57 48 45 52 45 20 70 67 6e 6f 20 3d 20  ta WHERE pgno = 
34190 3f 20 41 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f  ? AND field != ?
341a0 22 0a 20 20 20 20 20 20 22 47 52 4f 55 50 20 42  ".      "GROUP B
341b0 59 20 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73  Y cell", &pCells
341c0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  .  );..  /* Loop
341d0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 72 6f   through each ro
341e0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68  ot page. */.  sh
341f0 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
34200 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
34210 20 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c     "SELECT root,
34220 20 69 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78   intkey, max(max
34230 6c 65 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76 65  len) FROM recove
34240 72 79 2e 6d 61 70 22 20 0a 20 20 20 20 20 20 22  ry.map" .      "
34250 20 57 48 45 52 45 20 72 6f 6f 74 3e 31 20 47 52   WHERE root>1 GR
34260 4f 55 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74  OUP BY root, int
34270 6b 65 79 20 4f 52 44 45 52 20 42 59 20 72 6f 6f  key ORDER BY roo
34280 74 3d 28 22 0a 20 20 20 20 20 20 22 20 20 53 45  t=(".      "  SE
34290 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
342a0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  OM recovery.sche
342b0 6d 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 73  ma WHERE name='s
342c0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
342d0 0a 20 20 20 20 20 20 22 29 22 2c 20 26 70 4c 6f  .      ")", &pLo
342e0 6f 70 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  op.  );.  while(
342f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
34300 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
34310 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70  lite3_step(pLoop
34320 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f  ) ){.    int iRo
34330 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ot = sqlite3_col
34340 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30  umn_int(pLoop, 0
34350 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 74 6b  );.    int bIntk
34360 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ey = sqlite3_col
34370 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31  umn_int(pLoop, 1
34380 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20  );.    int nCol 
34390 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
343a0 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a  _int(pLoop, 2);.
343b0 20 20 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20      int bNoop = 
343c0 30 3b 0a 20 20 20 20 52 65 63 6f 76 65 72 54 61  0;.    RecoverTa
343d0 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20  ble *pTab;..    
343e0 61 73 73 65 72 74 28 20 62 49 6e 74 6b 65 79 3d  assert( bIntkey=
343f0 3d 30 20 7c 7c 20 62 49 6e 74 6b 65 79 3d 3d 31  =0 || bIntkey==1
34400 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 72   );.    pTab = r
34410 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28  ecoverFindTable(
34420 70 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f  pState, &rc, iRo
34430 6f 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f  ot, bIntkey, nCo
34440 6c 2c 20 26 62 4e 6f 6f 70 29 3b 0a 20 20 20 20  l, &bNoop);.    
34450 69 66 28 20 62 4e 6f 6f 70 20 7c 7c 20 72 63 20  if( bNoop || rc 
34460 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
34470 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
34480 20 20 20 20 20 69 66 28 20 70 4f 72 70 68 61 6e       if( pOrphan
34490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
344a0 4f 72 70 68 61 6e 20 3d 20 72 65 63 6f 76 65 72  Orphan = recover
344b0 4f 72 70 68 61 6e 54 61 62 6c 65 28 70 53 74 61  OrphanTable(pSta
344c0 74 65 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e  te, &rc, zLostAn
344d0 64 46 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29  dFound, nOrphan)
344e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
344f0 70 54 61 62 20 3d 20 70 4f 72 70 68 61 6e 3b 0a  pTab = pOrphan;.
34500 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
34510 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
34520 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ..    if( 0==sql
34530 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 54 61  ite3_stricmp(pTa
34540 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 22 5c 22 73  b->zQuoted, "\"s
34550 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 5c 22  qlite_sequence\"
34560 22 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  ") ){.      raw_
34570 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
34580 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
34590 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
345a0 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ;\n");.    }.   
345b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
345c0 74 28 70 50 61 67 65 73 2c 20 31 2c 20 69 52 6f  t(pPages, 1, iRo
345d0 6f 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ot);.    sqlite3
345e0 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c 73  _bind_int(pCells
345f0 2c 20 32 2c 20 70 54 61 62 2d 3e 69 50 6b 29 3b  , 2, pTab->iPk);
34600 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
34610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
34620 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
34630 33 5f 73 74 65 70 28 70 50 61 67 65 73 29 20 29  3_step(pPages) )
34640 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 6e  {.      int iPgn
34650 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  o = sqlite3_colu
34660 6d 6e 5f 69 6e 74 28 70 50 61 67 65 73 2c 20 30  mn_int(pPages, 0
34670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34680 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c 73  _bind_int(pCells
34690 2c 20 31 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  , 1, iPgno);.   
346a0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
346b0 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
346c0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
346d0 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a 20  tep(pCells) ){. 
346e0 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65 6c         int nFiel
346f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
34700 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20 30  mn_int(pCells, 0
34710 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
34720 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Min = sqlite3_co
34730 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c  lumn_int(pCells,
34740 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   2);.        con
34750 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  st char *zVal = 
34760 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
34770 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
34780 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20 20  (pCells, 1);..  
34790 20 20 20 20 20 20 52 65 63 6f 76 65 72 54 61 62        RecoverTab
347a0 6c 65 20 2a 70 54 61 62 32 20 3d 20 70 54 61 62  le *pTab2 = pTab
347b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
347c0 61 62 21 3d 70 4f 72 70 68 61 6e 20 26 26 20 28  ab!=pOrphan && (
347d0 69 4d 69 6e 3c 30 29 21 3d 62 49 6e 74 6b 65 79  iMin<0)!=bIntkey
347e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
347f0 28 20 70 4f 72 70 68 61 6e 3d 3d 30 20 29 7b 0a  ( pOrphan==0 ){.
34800 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 70              pOrp
34810 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72 70  han = recoverOrp
34820 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65 2c  hanTable(pState,
34830 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f   &rc, zLostAndFo
34840 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a 20  und, nOrphan);. 
34850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34860 20 20 20 20 20 70 54 61 62 32 20 3d 20 70 4f 72       pTab2 = pOr
34870 70 68 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  phan;.          
34880 69 66 28 20 70 54 61 62 32 3d 3d 30 20 29 20 62  if( pTab2==0 ) b
34890 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
348a0 0a 20 20 20 20 20 20 20 20 6e 46 69 65 6c 64 20  .        nField 
348b0 3d 20 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 20 20  = nField+1;.    
348c0 20 20 20 20 69 66 28 20 70 54 61 62 32 3d 3d 70      if( pTab2==p
348d0 4f 72 70 68 61 6e 20 29 7b 0a 20 20 20 20 20 20  Orphan ){.      
348e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
348f0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20 20  State->out, .   
34900 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
34910 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55 45  RT INTO %s VALUE
34920 53 28 25 64 2c 20 25 64 2c 20 25 64 2c 20 25 73  S(%d, %d, %d, %s
34930 25 73 25 73 29 3b 5c 6e 22 2c 0a 20 20 20 20 20  %s%s);\n",.     
34940 20 20 20 20 20 20 20 20 20 70 54 61 62 32 2d 3e           pTab2->
34950 7a 51 75 6f 74 65 64 2c 20 69 52 6f 6f 74 2c 20  zQuoted, iRoot, 
34960 69 50 67 6e 6f 2c 20 6e 46 69 65 6c 64 2c 0a 20  iPgno, nField,. 
34970 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4d 69               iMi
34980 6e 3c 30 20 3f 20 22 22 20 3a 20 22 4e 55 4c 4c  n<0 ? "" : "NULL
34990 2c 20 22 2c 20 7a 56 61 6c 2c 20 70 54 61 62 32  , ", zVal, pTab2
349a0 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64 5d  ->azlCol[nField]
349b0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
349c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
349d0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
349e0 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
349f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28 25  INSERT INTO %s(%
34a00 73 29 20 56 41 4c 55 45 53 28 20 25 73 20 29 3b  s) VALUES( %s );
34a10 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
34a20 20 20 20 20 70 54 61 62 32 2d 3e 7a 51 75 6f 74      pTab2->zQuot
34a30 65 64 2c 20 70 54 61 62 32 2d 3e 61 7a 6c 43 6f  ed, pTab2->azlCo
34a40 6c 5b 6e 46 69 65 6c 64 5d 2c 20 7a 56 61 6c 0a  l[nField], zVal.
34a50 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
34a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34a70 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
34a80 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20  &rc, pCells);.  
34a90 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 52 65 73    }.    shellRes
34aa0 65 74 28 26 72 63 2c 20 70 50 61 67 65 73 29 3b  et(&rc, pPages);
34ab0 0a 20 20 20 20 69 66 28 20 70 54 61 62 21 3d 70  .    if( pTab!=p
34ac0 4f 72 70 68 61 6e 20 29 20 72 65 63 6f 76 65 72  Orphan ) recover
34ad0 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b  FreeTable(pTab);
34ae0 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
34af0 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70 29  lize(&rc, pLoop)
34b00 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  ;.  shellFinaliz
34b10 65 28 26 72 63 2c 20 70 50 61 67 65 73 29 3b 0a  e(&rc, pPages);.
34b20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
34b30 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20 20  &rc, pCells);.  
34b40 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65  recoverFreeTable
34b50 28 70 4f 72 70 68 61 6e 29 3b 0a 0a 20 20 2f 2a  (pOrphan);..  /*
34b60 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   The rest of the
34b70 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69 66 28   schema */.  if(
34b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34b90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
34ba0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
34bb0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28     shellPrepare(
34bc0 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
34bd0 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
34be0 54 20 73 71 6c 2c 20 6e 61 6d 65 20 46 52 4f 4d  T sql, name FROM
34bf0 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
34c00 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
34c10 45 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27  E sql NOT LIKE '
34c20 63 72 65 61 74 65 20 74 61 62 6c 65 25 27 22 2c  create table%'",
34c30 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20   &pStmt.    );. 
34c40 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
34c50 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
34c60 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
34c70 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
34c80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
34c90 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
34ca0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
34cb0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
34cc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
34cd0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 53  ite3_strnicmp(zS
34ce0 71 6c 2c 20 22 63 72 65 61 74 65 20 76 69 72 74  ql, "create virt
34cf0 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 11)==0 ){.   
34d00 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34d10 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
34d20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
34d30 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
34d40 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61   1);.        cha
34d50 72 20 2a 7a 50 72 69 6e 74 20 3d 20 73 68 65 6c  r *zPrint = shel
34d60 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 0a 20  lMPrintf(&rc, . 
34d70 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
34d80 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73   INTO sqlite_mas
34d90 74 65 72 20 56 41 4c 55 45 53 28 27 74 61 62 6c  ter VALUES('tabl
34da0 65 27 2c 20 25 51 2c 20 25 51 2c 20 30 2c 20 25  e', %Q, %Q, 0, %
34db0 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  Q)",.          z
34dc0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71  Name, zName, zSq
34dd0 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  l.        );.   
34de0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34df0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73  pState->out, "%s
34e00 3b 5c 6e 22 2c 20 7a 50 72 69 6e 74 29 3b 0a 20  ;\n", zPrint);. 
34e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
34e20 72 65 65 28 7a 50 72 69 6e 74 29 3b 0a 20 20 20  ree(zPrint);.   
34e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e40 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
34e50 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e  ate->out, "%s;\n
34e60 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
34e70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  }.    }.    shel
34e80 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
34e90 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Stmt);.  }..  if
34ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34eb0 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
34ec0 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
34ed0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
34ee0 73 63 68 65 6d 61 20 3d 20 6f 66 66 3b 5c 6e 22  schema = off;\n"
34ef0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
34f00 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
34f10 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 7d  COMMIT;\n");.  }
34f20 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
34f30 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 44 45 54  pState->db, "DET
34f40 41 43 48 20 72 65 63 6f 76 65 72 79 22 2c 20 30  ACH recovery", 0
34f50 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
34f60 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
34f70 2a 20 21 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  * !(SQLITE_OMIT_
34f80 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
34f90 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
34fa0 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
34fb0 41 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49  AB) */.../*.** I
34fc0 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20  f an input line 
34fd0 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
34fe0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73  then invoke this
34ff0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70   routine to.** p
35000 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65  rocess that line
35010 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
35020 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
35030 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
35040 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
35050 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d   int do_meta_com
35060 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65  mand(char *zLine
35070 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  , ShellState *p)
35080 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20  {.  int h = 1;. 
35090 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
350a0 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74   int n, c;.  int
350b0 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20   rc = 0;.  char 
350c0 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23 69 66  *azArg[50];..#if
350d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
350e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
350f0 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70 45  if( p->expert.pE
35100 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78 70  xpert ){.    exp
35110 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c 20  ertFinish(p, 1, 
35120 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
35130 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
35140 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74  nput line into t
35150 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  okens..  */.  wh
35160 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
35170 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28   nArg<ArraySize(
35180 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68  azArg) ){.    wh
35190 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
351a0 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
351b0 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
351c0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
351d0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
351e0 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d  '\'' || zLine[h]
351f0 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
35200 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
35210 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [h++];.      azA
35220 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
35230 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
35240 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
35250 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d   zLine[h]!=delim
35260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
35270 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26  zLine[h]=='\\' &
35280 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20  & delim=='"' && 
35290 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20  zLine[h+1]!=0 ) 
352a0 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b  h++;.        h++
352b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
352c0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65  if( zLine[h]==de
352d0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  lim ){.        z
352e0 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
352f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35300 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65   delim=='"' ) re
35310 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
35320 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29  s(azArg[nArg-1])
35330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35340 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
35350 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
35360 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
35370 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65 28  [h] && !IsSpace(
35380 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
35390 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
353a0 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68  ine[h] ) zLine[h
353b0 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ++] = 0;.      r
353c0 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
353d0 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
353e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
353f0 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69  /* Process the i
35400 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  nput line..  */.
35410 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20    if( nArg==0 ) 
35420 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
35430 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72  tokens, no error
35440 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e   */.  n = strlen
35450 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  30(azArg[0]);.  
35460 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b  c = azArg[0][0];
35470 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65  .  clearTempFile
35480 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  (p);..#ifndef SQ
35490 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
354a0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63 3d  IZATION.  if( c=
354b0 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
354c0 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68 22  azArg[0], "auth"
354d0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
354e0 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
354f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35500 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
35510 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b  auth ON|OFF\n");
35520 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
35530 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
35540 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
35550 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
35560 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 6f  , 0);.    if( bo
35570 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
35580 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73 71  [1]) ){.      sq
35590 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
355a0 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65 6c  izer(p->db, shel
355b0 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20 7d  lAuth, p);.    }
355c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
355d0 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
355e0 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  er(p->db, 0, 0);
355f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
35600 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
35610 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
35620 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
35630 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
35640 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69 66 28  HAVE_ZLIB).  if(
35650 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
35660 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72  mp(azArg[0], "ar
35670 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  chive", n)==0 ){
35680 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
35690 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 44  0);.    rc = arD
356a0 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c 20  otCommand(p, 0, 
356b0 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
356c0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
356d0 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20 6e  if( (c=='b' && n
356e0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
356f0 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75 70  zArg[0], "backup
35700 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
35710 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33 20  (c=='s' && n>=3 
35720 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
35730 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29 3d  [0], "save", n)=
35740 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
35750 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46 69  st char *zDestFi
35760 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  le = 0;.    cons
35770 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b  t char *zDb = 0;
35780 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 44  .    sqlite3 *pD
35790 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  est;.    sqlite3
357a0 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
357b0 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  ;.    int j;.   
357c0 20 69 6e 74 20 62 41 73 79 6e 63 20 3d 20 30 3b   int bAsync = 0;
357d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
357e0 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20 20 66  *zVfs = 0;.    f
357f0 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b 20  or(j=1; j<nArg; 
35800 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  j++){.      cons
35810 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
35820 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[j];.      if( 
35830 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]=='-' ){.   
35840 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27       if( z[1]=='
35850 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
35860 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20    if( strcmp(z, 
35870 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20 29 7b  "-append")==0 ){
35880 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66 73 20  .          zVfs 
35890 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20 20 20  = "apndvfs";.   
358a0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
358b0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
358c0 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30 20 29 7b   "-async")==0 ){
358d0 0a 20 20 20 20 20 20 20 20 20 20 62 41 73 79 6e  .          bAsyn
358e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
358f0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
35900 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
35910 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
35920 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
35930 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a  \n", azArg[j]);.
35940 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35950 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
35960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
35970 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
35980 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
35990 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
359a0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d    }else if( zDb=
359b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
359c0 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20  b = zDestFile;. 
359d0 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
359e0 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
359f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35a00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35a10 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
35a20 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50 54 49 4f  ckup ?DB? ?OPTIO
35a30 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  NS? FILENAME\n")
35a40 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
35a50 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
35a60 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74 46  }.    if( zDestF
35a70 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
35a80 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
35a90 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c 45  r, "missing FILE
35aa0 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f 6e  NAME argument on
35ab0 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20   .backup\n");.  
35ac0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
35ad0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 3d    }.    if( zDb=
35ae0 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69 6e  =0 ) zDb = "main
35af0 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ";.    rc = sqli
35b00 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65 73  te3_open_v2(zDes
35b10 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 20 0a  tFile, &pDest, .
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
35b40 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
35b50 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56 66 73  PEN_CREATE, zVfs
35b60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35b90 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
35ba0 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
35bb0 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b  \n", zDestFile);
35bc0 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62 28  .      close_db(
35bd0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
35be0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
35bf0 20 20 69 66 28 20 62 41 73 79 6e 63 20 29 7b 0a    if( bAsync ){.
35c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
35c10 65 63 28 70 44 65 73 74 2c 20 22 50 52 41 47 4d  ec(pDest, "PRAGM
35c20 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  A synchronous=OF
35c30 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  F; PRAGMA journa
35c40 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c 0a 20 20  l_mode=OFF;",.  
35c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c60 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
35c70 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
35c80 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20  0);.    pBackup 
35c90 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  = sqlite3_backup
35ca0 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d 61  _init(pDest, "ma
35cb0 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62 29  in", p->db, zDb)
35cc0 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b 75  ;.    if( pBacku
35cd0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  p==0 ){.      ut
35ce0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
35cf0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
35d00 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
35d10 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 63  pDest));.      c
35d20 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a  lose_db(pDest);.
35d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
35d40 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
35d50 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f    (rc = sqlite3_
35d60 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
35d70 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
35d80 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71 6c  E_OK ){}.    sql
35d90 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e 69  ite3_backup_fini
35da0 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  sh(pBackup);.   
35db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35dc0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72 63  DONE ){.      rc
35dd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
35de0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
35df0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
35e00 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
35e10 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29 29  3_errmsg(pDest))
35e20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
35e30 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 5f      }.    close_
35e40 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  db(pDest);.  }el
35e50 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
35e60 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
35e70 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
35e80 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
35e90 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
35ea0 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
35eb0 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
35ec0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
35ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35ee0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35ef0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
35f00 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
35f10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35f20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
35f30 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
35f40 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
35f50 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e  [0], "binary", n
35f60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
35f70 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
35f80 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
35f90 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
35fa0 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79         setBinary
35fb0 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
35fc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35fd0 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
35fe0 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
35ff0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
36000 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36010 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
36020 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66  : .binary on|off
36030 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36040 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
36050 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
36060 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
36070 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20  0],"cd")==0 ){. 
36080 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
36090 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
360a0 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
360b0 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63  (WIN32).      wc
360c0 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
360d0 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
360e0 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31  _unicode(azArg[1
360f0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21  ]);.      rc = !
36100 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  SetCurrentDirect
36110 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73  oryW(z);.      s
36120 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
36130 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
36140 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29   chdir(azArg[1])
36150 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
36160 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36170 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
36180 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61  err, "Cannot cha
36190 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
361a0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
361b0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
361c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
361d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
361e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
361f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44  r, "Usage: .cd D
36200 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20  IRECTORY\n");.  
36210 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36220 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
36230 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
36240 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
36250 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
36260 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
36270 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
36280 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
36290 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
362a0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
362b0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
362c0 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
362d0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
362e0 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
362f0 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
36300 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
36310 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
36320 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73  Arg[0], "changes
36330 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36340 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
36350 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
36360 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75  lag(p, SHFLG_Cou
36370 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67  ntChanges, azArg
36380 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
36390 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
363a0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
363b0 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66  : .changes on|of
363c0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
363d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
363e0 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20  se..  /* Cancel 
363f0 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69  output redirecti
36400 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72  on, if it is cur
36410 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e  rently set (by .
36420 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54  testcase).  ** T
36430 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e  hen read the con
36440 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74  tent of the test
36450 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c  case-out.txt fil
36460 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67  e and compare ag
36470 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67  ainst.  ** azArg
36480 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61  [1].  If there a
36490 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  re differences, 
364a0 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  report an error 
364b0 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20  and exit..  */. 
364c0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
364d0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
364e0 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22  zArg[0], "check"
364f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
36500 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20  har *zRes = 0;. 
36510 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
36520 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
36530 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
36540 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
36550 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47  "Usage: .check G
36560 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b  LOB-PATTERN\n");
36570 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
36580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52     }else if( (zR
36590 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74  es = readFile("t
365a0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
365b0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
365c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
365d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
365e0 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61  not read 'testca
365f0 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
36600 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
36610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73     }else if( tes
36620 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67  tcase_glob(azArg
36630 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a  [1],zRes)==0 ){.
36640 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36650 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
36660 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74             "test
36670 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e  case-%s FAILED\n
36680 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
36690 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  n      Got: [%s]
366a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
366b0 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61        p->zTestca
366c0 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52  se, azArg[1], zR
366d0 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  es);.      rc = 
366e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
366f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36700 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73  stdout, "testcas
36710 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a  e-%s ok\n", p->z
36720 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20  Testcase);.     
36730 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20   p->nCheck++;.  
36740 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
36750 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65  free(zRes);.  }e
36760 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
36770 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
36780 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20  rg[0], "clone", 
36790 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
367a0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
367b0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20    tryToClone(p, 
367c0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
367d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
367e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
367f0 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49  Usage: .clone FI
36800 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
36810 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
36820 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
36830 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20  =='d' && n>1 && 
36840 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36850 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e  , "databases", n
36860 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
36870 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
36880 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
36890 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
368a0 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
368b0 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
368c0 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
368d0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
368e0 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
368f0 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
36900 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
36910 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36920 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
36930 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e  Separator),data.
36940 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20  colSeparator,": 
36950 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74  ");.    data.cnt
36960 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
36970 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
36980 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65  ELECT name, file
36990 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
369a0 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
369c0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
369d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
369e0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
369f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
36a00 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
36a10 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
36a20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
36a30 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
36a40 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
36a50 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
36a60 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='d' && n>=3 &&
36a70 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36a80 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c 20 6e  ], "dbconfig", n
36a90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )==0 ){.    stat
36aa0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
36ab0 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65 73 20  DbConfigChoices 
36ac0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
36ad0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
36ae0 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 7d 20 61   int op;.    } a
36af0 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20  DbConfig[] = {. 
36b00 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65         { "enable
36b10 5f 66 6b 65 79 22 2c 20 20 20 20 20 20 20 20 53  _fkey",        S
36b20 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
36b30 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20 20  NABLE_FKEY      
36b40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
36b50 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67 67 65  { "enable_trigge
36b60 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 44  r",     SQLITE_D
36b70 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
36b80 52 49 47 47 45 52 20 20 20 20 20 20 20 20 7d 2c  RIGGER        },
36b90 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73 33  .        { "fts3
36ba0 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20 20  _tokenizer",    
36bb0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
36bc0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
36bd0 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20 20 20  ENIZER },.      
36be0 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73    { "load_extens
36bf0 69 6f 6e 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ion",     SQLITE
36c00 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
36c10 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
36c20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f  },.        { "no
36c30 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c  _ckpt_on_close",
36c40 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
36c50 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
36c60 4f 53 45 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  OSE      },.    
36c70 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70      { "enable_qp
36c80 73 67 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  sg",        SQLI
36c90 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
36ca0 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20 20 20  LE_QPSG         
36cb0 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22    },.        { "
36cc0 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20  trigger_eqp",   
36cd0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
36ce0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
36cf0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
36d00 20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64        { "reset_d
36d10 61 74 61 62 61 73 65 22 2c 20 20 20 20 20 53 51  atabase",     SQ
36d20 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52 45  LITE_DBCONFIG_RE
36d30 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20 20  SET_DATABASE    
36d40 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
36d50 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20 20 20   "defensive",   
36d60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
36d70 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56 45  CONFIG_DEFENSIVE
36d80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
36d90 20 20 20 20 20 20 20 20 7b 20 22 77 72 69 74 61          { "writa
36da0 62 6c 65 5f 73 63 68 65 6d 61 22 2c 20 20 20 20  ble_schema",    
36db0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
36dc0 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 20  WRITABLE_SCHEMA 
36dd0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
36de0 20 7b 20 22 6c 65 67 61 63 79 5f 61 6c 74 65 72   { "legacy_alter
36df0 5f 74 61 62 6c 65 22 2c 20 53 51 4c 49 54 45 5f  _table", SQLITE_
36e00 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f  DBCONFIG_LEGACY_
36e10 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20 7d  ALTER_TABLE    }
36e20 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 71 73  ,.        { "dqs
36e30 5f 64 6d 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _dml",          
36e40 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
36e50 47 5f 44 51 53 5f 44 4d 4c 20 20 20 20 20 20 20  G_DQS_DML       
36e60 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36e70 20 20 20 7b 20 22 64 71 73 5f 64 64 6c 22 2c 20     { "dqs_ddl", 
36e80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
36e90 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44  E_DBCONFIG_DQS_D
36ea0 44 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  DL              
36eb0 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
36ec0 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f 70  nt ii, v;.    op
36ed0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
36ee0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41 72   for(ii=0; ii<Ar
36ef0 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66 69  raySize(aDbConfi
36f00 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  g); ii++){.     
36f10 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 73   if( nArg>1 && s
36f20 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  trcmp(azArg[1], 
36f30 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e  aDbConfig[ii].zN
36f40 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ame)!=0 ) contin
36f50 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  ue;.      if( nA
36f60 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg>=3 ){.       
36f70 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
36f80 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e  ig(p->db, aDbCon
36f90 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f 6c  fig[ii].op, bool
36fa0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  eanValue(azArg[2
36fb0 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ]), 0);.      }.
36fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
36fd0 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61  _config(p->db, a
36fe0 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c  DbConfig[ii].op,
36ff0 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20 20 20   -1, &v);.      
37000 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
37010 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e 22 2c  ut, "%18s %s\n",
37020 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a   aDbConfig[ii].z
37030 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20 3a  Name, v ? "on" :
37040 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20 20 69   "off");.      i
37050 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72 65 61  f( nArg>1 ) brea
37060 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
37070 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d 3d 41   nArg>1 && ii==A
37080 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66  rraySize(aDbConf
37090 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ig) ){.      utf
370a0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
370b0 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e   "Error: unknown
370c0 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c 22   dbconfig \"%s\"
370d0 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
370e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
370f0 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74 65 72  f(stderr, "Enter
37100 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20 77   \".dbconfig\" w
37110 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
37120 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29 3b   for a list\n");
37130 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c 73  .    }   .  }els
37140 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
37150 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
37160 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62  mp(azArg[0], "db
37170 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  info", n)==0 ){.
37180 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64      rc = shell_d
37190 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c  binfo_command(p,
371a0 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20   nArg, azArg);. 
371b0 20 7d 65 6c 73 65 0a 0a 23 69 66 20 21 64 65 66   }else..#if !def
371c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
371d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
371e0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
371f0 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
37200 54 41 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 72  TAB).  if( c=='r
37210 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
37220 72 67 5b 30 5d 2c 20 22 72 65 63 6f 76 65 72 22  rg[0], "recover"
37230 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
37240 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
37250 20 20 72 63 20 3d 20 72 65 63 6f 76 65 72 44 61    rc = recoverDa
37260 74 61 62 61 73 65 43 6d 64 28 70 2c 20 6e 41 72  tabaseCmd(p, nAr
37270 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c  g, azArg);.  }el
37280 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 28 53  se.#endif /* !(S
37290 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
372a0 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
372b0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
372c0 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 20 2a  E_DBPAGE_VTAB) *
372d0 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  /..  if( c=='d' 
372e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
372f0 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d  [0], "dump", n)=
37300 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
37310 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b  char *zLike = 0;
37320 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
37330 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65 61  int savedShowHea
37340 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61  der = p->showHea
37350 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61 76  der;.    int sav
37360 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70  edShellFlags = p
37370 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20  ->shellFlgs;.   
37380 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28   ShellClearFlag(
37390 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76  p, SHFLG_Preserv
373a0 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77  eRowid|SHFLG_New
373b0 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f  lines|SHFLG_Echo
373c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
373d0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
373e0 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
373f0 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
37400 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
37410 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a  z = azArg[i]+1;.
37420 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
37430 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
37440 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
37450 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69  z,"preserve-rowi
37460 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ds")==0 ){.#ifde
37470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
37480 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
37490 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
374a0 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70  stderr, "The --p
374b0 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f  reserve-rowids o
374c0 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d  ption is not com
374d0 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20  patible".       
374e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374f0 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c        " with SQL
37500 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
37510 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
37520 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
37530 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
37540 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23  _command_exit;.#
37550 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53  else.          S
37560 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
37570 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
37580 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
37590 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
375a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
375b0 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b  newlines")==0 ){
375c0 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
375d0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
375e0 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20  _Newlines);.    
375f0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
37600 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61    {.          ra
37610 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
37620 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
37630 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75   \"%s\" on \".du
37640 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  mp\"\n", azArg[i
37650 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
37660 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
37670 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
37680 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
37690 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
376a0 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
376b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
376c0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64  derr, "Usage: .d
376d0 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d  ump ?--preserve-
376e0 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20  rowids? ".      
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65       "?--newline
37710 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  s? ?LIKE-PATTERN
37720 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ?\n");.        r
37730 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
37740 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
37750 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
37760 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b  se{.        zLik
37770 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  e = azArg[i];.  
37780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
37790 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
377a0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  .    /* When pla
377b0 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d  ying back a "dum
377c0 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  p", the content 
377d0 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
377e0 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20  an order.    ** 
377f0 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d  which causes imm
37800 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
37810 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
37820 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20  o be violated.. 
37830 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65     ** So disable
37840 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e   foreign-key con
37850 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d  straint enforcem
37860 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70  ent to prevent p
37870 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20  roblems. */.    
37880 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
37890 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69  t, "PRAGMA forei
378a0 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29  gn_keys=OFF;\n")
378b0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
378c0 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20  (p->out, "BEGIN 
378d0 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29  TRANSACTION;\n")
378e0 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c  ;.    p->writabl
378f0 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
37900 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
37910 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77   0;.    /* Set w