/ Hex Artifact Content
Login

Artifact 8b51039f1eb9629595e1755ed4c6847571b97539cdf5074ef4f2be3db4e9c5f1:


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 20 30 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 20  EN_NORMAL       
7a10: 31 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20  1     /* 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: 20 32 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 20 33 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 20 34 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 20 35 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 20 36  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 23  data source */.#
7ba0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7bb0: 4e 5f 53 48 41 52 45 44 53 43 48 45 4d 41 20 37  N_SHAREDSCHEMA 7
7bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 6f 72       /* Open for
7bd0: 20 73 63 68 65 6d 61 20 72 65 75 73 65 20 2a 2f   schema reuse */
7be0: 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  ../* Allowed val
7bf0: 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61  ues for ShellSta
7c00: 74 65 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f  te.eTraceType.*/
7c10: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54  .#define SHELL_T
7c20: 52 41 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20  RACE_PLAIN      
7c30: 30 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69  0      /* Show i
7c40: 6e 70 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f  nput SQL text */
7c50: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54  .#define SHELL_T
7c60: 52 41 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20  RACE_EXPANDED   
7c70: 31 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65  1      /* Show e
7c80: 78 70 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74  xpanded SQL text
7c90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c   */.#define SHEL
7ca0: 4c 5f 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a  L_TRACE_NORMALIZ
7cb0: 45 44 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f  ED 2      /* Sho
7cc0: 77 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c  w normalized SQL
7cd0: 20 74 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74   text */../* Bit
7ce0: 73 20 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74  s in the ShellSt
7cf0: 61 74 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20  ate.flgProgress 
7d00: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66  variable */.#def
7d10: 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45  ine SHELL_PROGRE
7d20: 53 53 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f  SS_QUIET 0x01  /
7d30: 2a 20 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e  * Omit announcin
7d40: 67 20 65 76 65 72 79 20 70 72 6f 67 72 65 73 73  g every progress
7d50: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65   callback */.#de
7d60: 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52  fine SHELL_PROGR
7d70: 45 53 53 5f 52 45 53 45 54 20 30 78 30 32 20 20  ESS_RESET 0x02  
7d80: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 63 6f 75  /* Reset the cou
7d90: 6e 74 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67  nt when the prog
7da0: 72 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  res.            
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 2a 2a 20 63 61 6c 6c 62 61         ** callba
7dd0: 63 6b 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63  ck limit is reac
7de0: 68 65 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63  hed, and for eac
7df0: 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65       ** top-leve
7e20: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
7e30: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7e40: 5f 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20  _PROGRESS_ONCE  
7e50: 30 78 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20  0x04  /* Cancel 
7e60: 74 68 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65  the --limit afte
7e70: 72 20 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f  r firing once */
7e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
7e90: 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68  e the allowed sh
7ea0: 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a  ellFlgs values.*
7eb0: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7ec0: 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30  Pagecache      0
7ed0: 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65  x00000001 /* The
7ee0: 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74   --pagecache opt
7ef0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
7f00: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f  define SHFLG_Loo
7f10: 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30  kaside      0x00
7f20: 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73  000002 /* Lookas
7f30: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  ide memory is us
7f40: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7f50: 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20  FLG_Backslash   
7f60: 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a     0x00000004 /*
7f70: 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68   The --backslash
7f80: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
7f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7fa0: 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20  _PreserveRowid  
7fb0: 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64  0x00000008 /* .d
7fc0: 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f  ump preserves ro
7fd0: 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64  wid values */.#d
7fe0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c  efine SHFLG_Newl
7ff0: 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30  ines       0x000
8000: 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d  00010 /* .dump -
8010: 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f  -newline flag */
8020: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43  .#define SHFLG_C
8030: 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78  ountChanges   0x
8040: 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61  00000020 /* .cha
8050: 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a  nges setting */.
8060: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63  #define SHFLG_Ec
8070: 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30  ho           0x0
8080: 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f  0000040 /* .echo
8090: 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69   or --echo setti
80a0: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng */../*.** Mac
80b0: 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ros for testing 
80c0: 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c  and setting shel
80d0: 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  lFlgs.*/.#define
80e0: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c   ShellHasFlag(P,
80f0: 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65  X)    (((P)->she
8100: 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30  llFlgs & (X))!=0
8110: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53  ).#define ShellS
8120: 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  etFlag(P,X)    (
8130: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d  (P)->shellFlgs|=
8140: 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65  (X)).#define She
8150: 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29  llClearFlag(P,X)
8160: 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67    ((P)->shellFlg
8170: 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a  s&=(~(X)))../*.*
8180: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
8190: 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a  allowed modes..*
81a0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
81b0: 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e  ine     0  /* On
81c0: 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e  e column per lin
81d0: 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62  e.  Blank line b
81e0: 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a  etween records *
81f0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43  /.#define MODE_C
8200: 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e  olumn   1  /* On
8210: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
8220: 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e  e in neat column
8230: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
8240: 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a  E_List     2  /*
8250: 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20   One record per 
8260: 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61  line with a sepa
8270: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
8280: 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33   MODE_Semi     3
8290: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44    /* Same as MOD
82a0: 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e  E_List but appen
82b0: 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69  d ";" to each li
82c0: 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ne */.#define MO
82d0: 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f  DE_Html     4  /
82e0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48  * Generate an XH
82f0: 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  TML table */.#de
8300: 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74  fine MODE_Insert
8310: 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74     5  /* Generat
8320: 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73  e SQL "insert" s
8330: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65  tatements */.#de
8340: 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20  fine MODE_Quote 
8350: 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76     6  /* Quote v
8360: 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c  alues as for SQL
8370: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8380: 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20  _Tcl      7  /* 
8390: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
83a0: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
83b0: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
83c0: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
83d0: 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  8  /* Quote stri
83e0: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
83f0: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
8400: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
8410: 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  9  /* Like MODE_
8420: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
8430: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
8440: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8450: 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20  _Ascii   10  /* 
8460: 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61  Use ASCII unit a
8470: 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61  nd record separa
8480: 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29  tors (0x1F/0x1E)
8490: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
84a0: 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20  _Pretty  11  /* 
84b0: 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68  Pretty-print sch
84c0: 65 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  emas */.#define 
84d0: 4d 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32 20  MODE_EQP     12 
84e0: 20 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50   /* Converts EXP
84f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
8500: 6f 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72  output into a gr
8510: 61 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  aph */..static c
8520: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44  onst char *modeD
8530: 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69  escr[] = {.  "li
8540: 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c  ne",.  "column",
8550: 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65  .  "list",.  "se
8560: 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20  mi",.  "html",. 
8570: 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75   "insert",.  "qu
8580: 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20  ote",.  "tcl",. 
8590: 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61   "csv",.  "expla
85a0: 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a  in",.  "ascii",.
85b0: 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c    "prettyprint",
85c0: 0a 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a  .  "eqp".};../*.
85d0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
85e0: 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65   column/row/line
85f0: 20 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64   separators used
8600: 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a   by the various.
8610: 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74  ** import/export
8620: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
8630: 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20  ne SEP_Column   
8640: 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   "|".#define SEP
8650: 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a  _Row       "\n".
8660: 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20  #define SEP_Tab 
8670: 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69        "\t".#defi
8680: 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20  ne SEP_Space    
8690: 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50   " ".#define SEP
86a0: 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23  _Comma     ",".#
86b0: 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20  define SEP_CrLf 
86c0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66       "\r\n".#def
86d0: 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20  ine SEP_Unit    
86e0: 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65    "\x1F".#define
86f0: 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22   SEP_Record    "
8700: 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  \x1E"../*.** A c
8710: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
8720: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e  sqlite3_log() in
8730: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
8740: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67  ic void shellLog
8750: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
8760: 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74   iErrCode, const
8770: 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20   char *zMsg){.  
8780: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
8790: 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
87a0: 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67  g;.  if( p->pLog
87b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
87c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70  utf8_printf(p->p
87d0: 4c 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22  Log, "(%d) %s\n"
87e0: 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67  , iErrCode, zMsg
87f0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70  );.  fflush(p->p
8800: 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Log);.}../*.** S
8810: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
8820: 65 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a  ell_putsnl(X).**
8830: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65  .** Write the te
8840: 78 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65  xt X to the scre
8850: 65 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20  en (or whatever 
8860: 6f 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20  output is being 
8870: 64 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64  directed).** add
8880: 69 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74  ing a newline at
8890: 20 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68   the end, and th
88a0: 65 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a  en return X..*/.
88b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
88c0: 6c 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c  lPutsFunc(.  sql
88d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
88e0: 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
88f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8900: 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65  **apVal.){.  She
8910: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
8920: 65 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65  ellState*)sqlite
8930: 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
8940: 29 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b  );.  (void)nVal;
8950: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
8960: 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
8970: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8980: 74 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20  t(apVal[0]));.  
8990: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
89a0: 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c  alue(pCtx, apVal
89b0: 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  [0]);.}../*.** S
89c0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65  QL function:   e
89d0: 64 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20  dit(VALUE).**   
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
89f0: 69 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29  it(VALUE,EDITOR)
8a00: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65  .**.** These ste
8a10: 70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ps:.**.**     (1
8a20: 29 20 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e  ) Write VALUE in
8a30: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  to a temporary f
8a40: 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ile..**     (2) 
8a50: 52 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54  Run program EDIT
8a60: 4f 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  OR on that tempo
8a70: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  rary file..**   
8a80: 20 20 28 33 29 20 52 65 61 64 20 74 68 65 20 74    (3) Read the t
8a90: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61  emporary file ba
8aa0: 63 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  ck and return it
8ab0: 73 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65  s content as the
8ac0: 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20   result..**     
8ad0: 28 34 29 20 44 65 6c 65 74 65 20 74 68 65 20 74  (4) Delete the t
8ae0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a  emporary file.**
8af0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f  .** If the EDITO
8b00: 52 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d  R argument is om
8b10: 69 74 74 65 64 2c 20 75 73 65 20 74 68 65 20 76  itted, use the v
8b20: 61 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53 55  alue in the VISU
8b30: 41 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e  AL.** environmen
8b40: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20  t variable.  If 
8b50: 73 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e  still there is n
8b60: 6f 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67  o EDITOR, throug
8b70: 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  h an error..**.*
8b80: 2a 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20  * Also throw an 
8b90: 65 72 72 6f 72 20 69 66 20 74 68 65 20 45 44 49  error if the EDI
8ba0: 54 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75  TOR program retu
8bb0: 72 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65  rns a non-zero e
8bc0: 78 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66  xit code..*/.#if
8bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
8be0: 56 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63  VE_SYSTEM.static
8bf0: 20 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a   void editFunc(.
8c00: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8c10: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
8c20: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
8c30: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
8c40: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
8c50: 7a 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20  zEditor;.  char 
8c60: 2a 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  *zTempFile = 0;.
8c70: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8c80: 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b   char *zCmd = 0;
8c90: 0a 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69  .  int bBin;.  i
8ca0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73  nt rc;.  int has
8cb0: 43 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45  CRNL = 0;.  FILE
8cc0: 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   *f = 0;.  sqlit
8cd0: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73  e3_int64 sz;.  s
8ce0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a  qlite3_int64 x;.
8cf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8d00: 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61  *p = 0;..  if( a
8d10: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45  rgc==2 ){.    zE
8d20: 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63  ditor = (const c
8d30: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
8d40: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
8d50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
8d60: 45 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28  Editor = getenv(
8d70: 22 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20  "VISUAL");.  }. 
8d80: 20 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20   if( zEditor==0 
8d90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8da0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8db0: 65 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20  ext, "no editor 
8dc0: 66 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29  for edit()", -1)
8dd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8de0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
8df0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
8e00: 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
8e10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8e20: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
8e30: 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75  text, "NULL inpu
8e40: 74 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31  t to edit()", -1
8e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8e60: 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65   }.  db = sqlite
8e70: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
8e80: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
8e90: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
8ea0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
8eb0: 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c  ntrol(db, 0, SQL
8ec0: 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
8ed0: 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69  LENAME, &zTempFi
8ee0: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70  le);.  if( zTemp
8ef0: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  File==0 ){.    s
8f00: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20  qlite3_uint64 r 
8f10: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
8f20: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
8f30: 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
8f40: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
8f50: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d  te3_mprintf("tem
8f60: 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20  p%llx", r);.    
8f70: 69 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30  if( zTempFile==0
8f80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
8fa0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
8fb0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8fc0: 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20   }.  }.  bBin = 
8fd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
8fe0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
8ff0: 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57  ITE_BLOB;.  /* W
9000: 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
9010: 66 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65  file to be edite
9020: 64 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e  d, do \n to \r\n
9030: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20   conversions on 
9040: 73 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61  systems.  ** tha
9050: 74 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65  t want \r\n line
9060: 20 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20   endings */.  f 
9070: 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c  = fopen(zTempFil
9080: 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a  e, bBin ? "wb" :
9090: 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d   "w");.  if( f==
90a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
90b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
90c0: 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63  ntext, "edit() c
90d0: 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20  annot open temp 
90e0: 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  file", -1);.    
90f0: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
9100: 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73  nd;.  }.  sz = s
9110: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
9120: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  es(argv[0]);.  i
9130: 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78  f( bBin ){.    x
9140: 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65   = fwrite(sqlite
9150: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
9160: 76 5b 30 5d 29 2c 20 31 2c 20 28 73 69 7a 65 5f  v[0]), 1, (size_
9170: 74 29 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73  t)sz, f);.  }els
9180: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
9190: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
91a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
91b0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
91c0: 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72  .    /* Remember
91d0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
91e0: 74 68 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e  the value origin
91f0: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c  ally contained \
9200: 72 5c 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  r\n */.    if( z
9210: 20 26 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72   && strstr(z,"\r
9220: 5c 6e 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e  \n")!=0 ) hasCRN
9230: 4c 20 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66  L = 1;.    x = f
9240: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
9250: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
9260: 29 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a  ), 1, (size_t)sz
9270: 2c 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  , f);.  }.  fclo
9280: 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a  se(f);.  f = 0;.
9290: 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20    if( x!=sz ){. 
92a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
92b0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
92c0: 20 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e   "edit() could n
92d0: 6f 74 20 77 72 69 74 65 20 74 68 65 20 77 68 6f  ot write the who
92e0: 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20  le file", -1);. 
92f0: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
9300: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d  c_end;.  }.  zCm
9310: 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
9320: 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c  ntf("%s \"%s\"",
9330: 20 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46   zEditor, zTempF
9340: 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64  ile);.  if( zCmd
9350: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9360: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
9370: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
9380: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
9390: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63  nc_end;.  }.  rc
93a0: 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b   = system(zCmd);
93b0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
93c0: 7a 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20  zCmd);.  if( rc 
93d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
93e0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
93f0: 65 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74  ext, "EDITOR ret
9400: 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c  urned non-zero",
9410: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9420: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9430: 7d 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54  }.  f = fopen(zT
9440: 65 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a  empFile, "rb");.
9450: 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20    if( f==0 ){.  
9460: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9470: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a  _error(context,.
9480: 20 20 20 20 20 20 22 65 64 69 74 28 29 20 63 61        "edit() ca
9490: 6e 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70  nnot reopen temp
94a0: 20 66 69 6c 65 20 61 66 74 65 72 20 65 64 69 74   file after edit
94b0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
94c0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
94d0: 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30    }.  fseek(f, 0
94e0: 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73  , SEEK_END);.  s
94f0: 7a 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20  z = ftell(f);.  
9500: 72 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d  rewind(f);.  p =
9510: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
9520: 34 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20  4( sz+(bBin==0) 
9530: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
9540: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9550: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
9560: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f  context);.    go
9570: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
9580: 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61  ;.  }.  x = frea
9590: 64 28 70 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29  d(p, 1, (size_t)
95a0: 73 7a 2c 20 66 29 3b 0a 20 20 66 63 6c 6f 73 65  sz, f);.  fclose
95b0: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
95c0: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
95d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
95e0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
95f0: 63 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62  could not read b
9600: 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69  ack the whole fi
9610: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
9620: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
9630: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e  ;.  }.  if( bBin
9640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9650: 72 65 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f  result_blob64(co
9660: 6e 74 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71  ntext, p, sz, sq
9670: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
9680: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9690: 33 5f 69 6e 74 36 34 20 69 2c 20 6a 3b 0a 20 20  3_int64 i, j;.  
96a0: 20 20 69 66 28 20 68 61 73 43 52 4e 4c 20 29 7b    if( hasCRNL ){
96b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
96c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69   original contai
96d0: 6e 73 20 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20  ns \r\n then do 
96e0: 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62  no conversions b
96f0: 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20  ack to \n */.   
9700: 20 20 20 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d     j = sz;.    }
9710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9720: 66 20 74 68 65 20 66 69 6c 65 20 64 69 64 20 6e  f the file did n
9730: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  ot originally co
9740: 6e 74 61 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20  ntain \r\n then 
9750: 63 6f 6e 76 65 72 74 20 61 6e 79 20 6e 65 77 0a  convert any new.
9760: 20 20 20 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61        ** \r\n ba
9770: 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20  ck into \n */.  
9780: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69      for(i=j=0; i
9790: 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  <sz; i++){.     
97a0: 20 20 20 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72     if( p[i]=='\r
97b0: 27 20 26 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e  ' && p[i+1]=='\n
97c0: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
97d0: 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a   p[j++] = p[i];.
97e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a        }.      sz
97f0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a   = j;.      p[sz
9800: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20  ] = 0;.    } .  
9810: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9820: 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c  _text64(context,
9830: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c   (const char*)p,
9840: 20 73 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20   sz,.           
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9860: 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c  qlite3_free, SQL
9870: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20  ITE_UTF8);.  }. 
9880: 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75   p = 0;..edit_fu
9890: 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20  nc_end:.  if( f 
98a0: 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75  ) fclose(f);.  u
98b0: 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29  nlink(zTempFile)
98c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
98d0: 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  (zTempFile);.  s
98e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
98f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9900: 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
9910: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20   */../*.** Save 
9920: 6f 72 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  or restore the c
9930: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f  urrent output mo
9940: 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  de.*/.static voi
9950: 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68  d outputModePush
9960: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
9970: 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20  .  p->modePrior 
9980: 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d  = p->mode;.  mem
9990: 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69  cpy(p->colSepPri
99a0: 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  or, p->colSepara
99b0: 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  tor, sizeof(p->c
99c0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20  olSeparator));. 
99d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65   memcpy(p->rowSe
99e0: 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65  pPrior, p->rowSe
99f0: 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28  parator, sizeof(
9a00: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
9a10: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
9a20: 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53   outputModePop(S
9a30: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
9a40: 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f   p->mode = p->mo
9a50: 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70  dePrior;.  memcp
9a60: 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  y(p->colSeparato
9a70: 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f  r, p->colSepPrio
9a80: 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  r, sizeof(p->col
9a90: 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d  Separator));.  m
9aa0: 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61  emcpy(p->rowSepa
9ab0: 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70  rator, p->rowSep
9ac0: 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  Prior, sizeof(p-
9ad0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b  >rowSeparator));
9ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9af0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9b00: 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64  g as a hex-encod
9b10: 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31  ed blob (eg. X'1
9b20: 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63  234' ).*/.static
9b30: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78   void output_hex
9b40: 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c  _blob(FILE *out,
9b50: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
9b60: 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a  ob, int nBlob){.
9b70: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
9b80: 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a  *zBlob = (char *
9b90: 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72  )pBlob;.  raw_pr
9ba0: 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a  intf(out,"X'");.
9bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c    for(i=0; i<nBl
9bc0: 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72  ob; i++){ raw_pr
9bd0: 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c  intf(out,"%02x",
9be0: 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20  zBlob[i]&0xff); 
9bf0: 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f  }.  raw_printf(o
9c00: 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ut,"'");.}../*.*
9c10: 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20  * Find a string 
9c20: 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e  that is not foun
9c30: 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b  d anywhere in z[
9c40: 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ].  Return a poi
9c50: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20  nter.** to that 
9c60: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72  string..**.** Tr
9c70: 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20  y to use zA and 
9c80: 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f  zB first.  If bo
9c90: 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20  th of those are 
9ca0: 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e  already found in
9cb0: 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   z[].** then mak
9cc0: 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67  e up some string
9cd0: 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
9ce0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66   the buffer zBuf
9cf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9d00: 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73  t char *unused_s
9d10: 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63  tring(.  const c
9d20: 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
9d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9d40: 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70  sult must not ap
9d50: 70 65 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e  pear anywhere in
9d60: 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68   z */.  const ch
9d70: 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68  ar *zA, const ch
9d80: 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79  ar *zB,   /* Try
9d90: 20 74 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a   these first */.
9da0: 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20    char *zBuf    
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
9dd0: 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65  store a generate
9de0: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
9df0: 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b   unsigned i = 0;
9e00: 0a 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c  .  if( strstr(z,
9e10: 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e   zA)==0 ) return
9e20: 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74   zA;.  if( strst
9e30: 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65  r(z, zB)==0 ) re
9e40: 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20  turn zB;.  do{. 
9e50: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9e60: 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73  ntf(20,zBuf,"(%s
9e70: 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a  %u)", zA, i++);.
9e80: 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72    }while( strstr
9e90: 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20  (z,zBuf)!=0 );. 
9ea0: 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a   return zBuf;.}.
9eb0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
9ec0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
9ed0: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
9ee0: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
9ef0: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
9f00: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
9f10: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
9f20: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a  scaped_string().
9f30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
9f40: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
9f50: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
9f60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
9f70: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
9f80: 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ;.  setBinaryMod
9f90: 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72  e(out, 1);.  for
9fa0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
9fb0: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  !=0 && c!='\''; 
9fc0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
9fd0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
9fe0: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
9ff0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
a000: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a010: 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65   "'");.    while
a020: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f  ( *z ){.      fo
a030: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d  r(i=0; (c = z[i]
a040: 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b  )!=0 && c!='\'';
a050: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
a060: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
a070: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
a080: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a090: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
a0a0: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
a0b0: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
a0c0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
a0d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a0e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a0f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
a100: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a110: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
a120: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a130: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
a140: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
a150: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a160: 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f  .  }.  setTextMo
a170: 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f  de(out, 1);.}../
a180: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
a190: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
a1a0: 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  a quoted string 
a1b0: 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e  using SQL quotin
a1c0: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a  g conventions..*
a1d0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20  * Additionallly 
a1e0: 2c 20 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e  , escape the "\n
a1f0: 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61  " and "\r" chara
a200: 63 74 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  cters so that th
a210: 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74  ey do not.** get
a220: 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e   corrupted by en
a230: 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c  d-of-line transl
a240: 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73  ation facilities
a250: 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69   in some operati
a260: 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a  ng.** systems..*
a270: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b  *.** This is lik
a280: 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  e output_quoted_
a290: 73 74 72 69 6e 67 28 29 20 62 75 74 20 77 69 74  string() but wit
a2a0: 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f  h the addition o
a2b0: 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73  f the \r\n.** es
a2c0: 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a  cape mechanism..
a2d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
a2e0: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63  utput_quoted_esc
a2f0: 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  aped_string(FILE
a300: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a310: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
a320: 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42    char c;.  setB
a330: 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31  inaryMode(out, 1
a340: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
a350: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
a360: 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e  !='\'' && c!='\n
a370: 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b  ' && c!='\r'; i+
a380: 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20  +){}.  if( c==0 
a390: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
a3a0: 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29  tf(out,"'%s'",z)
a3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
a3c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d  onst char *zNL =
a3d0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a3e0: 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20  ar *zCR = 0;.   
a3f0: 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20   int nNL = 0;.  
a400: 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20    int nCR = 0;. 
a410: 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30     char zBuf1[20
a420: 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20  ], zBuf2[20];.  
a430: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
a440: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
a450: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e   z[i]=='\n' ) nN
a460: 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  L++;.      if( z
a470: 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b  [i]=='\r' ) nCR+
a480: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
a490: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
a4a0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
a4b0: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
a4c0: 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74   zNL = unused_st
a4d0: 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22  ring(z, "\\n", "
a4e0: 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a  \\012", zBuf1);.
a4f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43      }.    if( nC
a500: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
a510: 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c  rintf(out, "repl
a520: 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43  ace(");.      zC
a530: 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e  R = unused_strin
a540: 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30  g(z, "\\r", "\\0
a550: 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20  15", zBuf2);.   
a560: 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
a570: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
a580: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
a590: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
a5a0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
a5b0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
a5c0: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
a5d0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ){}.      if( c=
a5e0: 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\'' ) i++;.   
a5f0: 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20     if( i ){.    
a600: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a610: 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  out, "%.*s", i, 
a620: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d  z);.        z +=
a630: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
a640: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b    if( c=='\'' ){
a650: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
a660: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
a670: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
a680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a690: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
a6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a6b0: 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  }.      z++;.   
a6c0: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
a6d0: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
a6e0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
a6f0: 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  zNL);.        co
a700: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
a710: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a720: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29  (out, "%s", zCR)
a730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  ;.    }.    raw_
a740: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
a750: 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b  ;.    if( nCR ){
a760: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a770: 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68  f(out, ",'%s',ch
a780: 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a  ar(13))", zCR);.
a790: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e      }.    if( nN
a7a0: 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  L ){.      raw_p
a7b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
a7c0: 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e  ',char(10))", zN
a7d0: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
a7e0: 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c  setTextMode(out,
a7f0: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75   1);.}../*.** Ou
a800: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
a810: 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65  tring as a quote
a820: 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43  d according to C
a830: 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20   or TCL quoting 
a840: 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rules..*/.static
a850: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73   void output_c_s
a860: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
a870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
a880: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
a890: 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20  c;.  fputc('"', 
a8a0: 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  out);.  while( (
a8b0: 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29  c = *(z++))!=0 )
a8c0: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c  {.    if( c=='\\
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a8e0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
a8f0: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
a900: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
a910: 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  '"' ){.      fpu
a920: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
a930: 20 20 20 20 20 66 70 75 74 63 28 27 22 27 2c 20       fputc('"', 
a940: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a950: 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20  if( c=='\t' ){. 
a960: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
a970: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
a980: 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('t', out);.  
a990: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a9a0: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \n' ){.      fpu
a9b0: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
a9c0: 20 20 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20       fputc('n', 
a9d0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
a9e0: 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20  if( c=='\r' ){. 
a9f0: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
aa00: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
aa10: 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('r', out);.  
aa20: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70    }else if( !isp
aa30: 72 69 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a  rint(c&0xff) ){.
aa40: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
aa50: 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20  (out, "\\%03o", 
aa60: 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c  c&0xff);.    }el
aa70: 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28  se{.      fputc(
aa80: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  c, out);.    }. 
aa90: 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20   }.  fputc('"', 
aaa0: 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  out);.}../*.** O
aab0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
aac0: 73 74 72 69 6e 67 20 77 69 74 68 20 63 68 61 72  string with char
aad0: 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20  acters that are 
aae0: 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54  special to.** HT
aaf0: 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73  ML escaped..*/.s
ab00: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
ab10: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49  t_html_string(FI
ab20: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
ab30: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
ab40: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a  ;.  if( z==0 ) z
ab50: 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20   = "";.  while( 
ab60: 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  *z ){.    for(i=
ab70: 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20  0;   z[i].      
ab80: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
ab90: 3c 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  <'.            &
aba0: 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20  & z[i]!='&'.    
abb0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
abc0: 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='>'.           
abd0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20   && z[i]!='\"'. 
abe0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
abf0: 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20  i]!='\'';.      
ac00: 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28    i++){}.    if(
ac10: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74   i>0 ){.      ut
ac20: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
ac30: 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d  .*s",i,z);.    }
ac40: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
ac50: 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <' ){.      raw_
ac60: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b  printf(out,"&lt;
ac70: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
ac80: 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20  ( z[i]=='&' ){. 
ac90: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
aca0: 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20  out,"&amp;");.  
acb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
acc0: 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72  =='>' ){.      r
acd0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
ace0: 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gt;");.    }else
acf0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20   if( z[i]=='\"' 
ad00: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
ad10: 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22  ntf(out,"&quot;"
ad20: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
ad30: 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20   z[i]=='\'' ){. 
ad40: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ad50: 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20  out,"&#39;");.  
ad60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ad80: 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a  z += i + 1;.  }.
ad90: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69  }../*.** If a fi
ada0: 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  eld contains any
adb0: 20 63 68 61 72 61 63 74 65 72 20 69 64 65 6e 74   character ident
adc0: 69 66 69 65 64 20 62 79 20 61 20 31 20 69 6e 20  ified by a 1 in 
add0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
ade0: 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65   array, then the
adf0: 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20   string must be 
ae00: 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a  quoted for CSV..
ae10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
ae20: 63 68 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74  char needCsvQuot
ae30: 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20  e[] = {.  1, 1, 
ae40: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae50: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
ae60: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
ae70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae80: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
ae90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
aea0: 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c    1, 0, 1, 0, 0,
aeb0: 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30   0, 0, 1,   0, 0
aec0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aed0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
aee0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
aef0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af00: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
af10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
af20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
af30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
af40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
af60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
af70: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af80: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
af90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
afa0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
afb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
afc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
afd0: 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 0, 1,.  1, 1, 
afe0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
aff0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b000: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
b010: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b020: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b030: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b040: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b050: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
b060: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b070: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
b080: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
b090: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b0a0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
b0b0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b0c0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
b0d0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
b0e0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0f0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
b100: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
b110: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b120: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
b130: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b140: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
b150: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
b160: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b170: 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 1, 1,.};../*.*
b180: 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c  * Output a singl
b190: 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20  e term of CSV.  
b1a0: 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c  Actually, p->col
b1b0: 53 65 70 61 72 61 74 6f 72 20 69 73 20 75 73 65  Separator is use
b1c0: 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70  d for.** the sep
b1d0: 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61  arator, which ma
b1e0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
b1f0: 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c  a comma.  p->nul
b200: 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65  lValue is.** the
b210: 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74   null value.  St
b220: 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64  rings are quoted
b230: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
b240: 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a  The separator.**
b250: 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20   is only issued 
b260: 69 66 20 62 53 65 70 20 69 73 20 74 72 75 65 2e  if bSep is true.
b270: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b280: 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c  output_csv(Shell
b290: 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
b2a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65  char *z, int bSe
b2b0: 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20  p){.  FILE *out 
b2c0: 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20  = p->out;.  if( 
b2d0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  z==0 ){.    utf8
b2e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  _printf(out,"%s"
b2f0: 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a  ,p->nullValue);.
b300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
b310: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70   i;.    int nSep
b320: 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63   = strlen30(p->c
b330: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
b340: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
b350: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
b360: 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28   needCsvQuote[((
b370: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
b380: 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c  )[i]].         |
b390: 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53  | (z[i]==p->colS
b3a0: 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20  eparator[0] &&. 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 53 65              (nSe
b3c0: 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  p==1 || memcmp(z
b3d0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
b3e0: 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b  r, nSep)==0)) ){
b3f0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  .        i = 0;.
b400: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b420: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
b430: 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64     char *zQuoted
b440: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
b450: 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b  tf("\"%w\"", z);
b460: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
b470: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51  tf(out, "%s", zQ
b480: 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  uoted);.      sq
b490: 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74  lite3_free(zQuot
b4a0: 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ed);.    }else{.
b4b0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
b4c0: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  f(out, "%s", z);
b4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b4e0: 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66   bSep ){.    utf
b4f0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b500: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
b510: 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  arator);.  }.}..
b520: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b530: 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65  ne runs when the
b540: 20 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74   user presses Ct
b550: 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rl-C.*/.static v
b560: 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61  oid interrupt_ha
b570: 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65  ndler(int NotUse
b580: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
b590: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
b5a0: 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74  .  seenInterrupt
b5b0: 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e  ++;.  if( seenIn
b5c0: 74 65 72 72 75 70 74 3e 32 20 29 20 65 78 69 74  terrupt>2 ) exit
b5d0: 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61  (1);.  if( globa
b5e0: 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e  lDb ) sqlite3_in
b5f0: 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62  terrupt(globalDb
b600: 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e  );.}..#if (defin
b610: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
b620: 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26  fined(WIN32)) &&
b630: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
b640: 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _WCE)./*.** This
b650: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f   routine runs fo
b660: 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73  r console events
b670: 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f   (e.g. Ctrl-C) o
b680: 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69  n Win32.*/.stati
b690: 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f  c BOOL WINAPI Co
b6a0: 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72  nsoleCtrlHandler
b6b0: 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c  (.  DWORD dwCtrl
b6c0: 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  Type /* One of t
b6d0: 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20  he CTRL_*_EVENT 
b6e0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a  constants */.){.
b6f0: 20 20 69 66 28 20 64 77 43 74 72 6c 54 79 70 65    if( dwCtrlType
b700: 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29  ==CTRL_C_EVENT )
b710: 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f  {.    interrupt_
b720: 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20  handler(0);.    
b730: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
b740: 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b  .  return FALSE;
b750: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
b760: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b770: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a  UTHORIZATION./*.
b780: 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75  ** When the ".au
b790: 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74  th ON" is set, t
b7a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74  he following aut
b7b0: 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
b7c0: 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20   is.** invoked. 
b7d0: 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
b7e0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
b7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
b800: 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70  lAuth(.  void *p
b810: 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e  ClientData,.  in
b820: 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  t op,.  const ch
b830: 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74  ar *zA1,.  const
b840: 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f   char *zA2,.  co
b850: 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20  nst char *zA3,. 
b860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34   const char *zA4
b870: 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  .){.  ShellState
b880: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
b890: 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a  e*)pClientData;.
b8a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
b8b0: 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20  har *azAction[] 
b8c0: 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45  = { 0,.     "CRE
b8d0: 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20  ATE_INDEX",     
b8e0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c      "CREATE_TABL
b8f0: 45 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45  E",         "CRE
b900: 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c  ATE_TEMP_INDEX",
b910: 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45  .     "CREATE_TE
b920: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43  MP_TABLE",    "C
b930: 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47  REATE_TEMP_TRIGG
b940: 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45  ER",  "CREATE_TE
b950: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
b960: 43 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c  CREATE_TRIGGER",
b970: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56         "CREATE_V
b980: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 22  IEW",          "
b990: 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44  DELETE",.     "D
b9a0: 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20  ROP_INDEX",     
b9b0: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c        "DROP_TABL
b9c0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44  E",           "D
b9d0: 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c  ROP_TEMP_INDEX",
b9e0: 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50  .     "DROP_TEMP
b9f0: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44  _TABLE",      "D
ba00: 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ROP_TEMP_TRIGGER
ba10: 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50  ",    "DROP_TEMP
ba20: 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52  _VIEW",.     "DR
ba30: 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20  OP_TRIGGER",    
ba40: 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22       "DROP_VIEW"
ba50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e  ,            "IN
ba60: 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41  SERT",.     "PRA
ba70: 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  GMA",           
ba80: 20 20 20 20 22 52 45 41 44 22 2c 20 20 20 20 20      "READ",     
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c              "SEL
baa0: 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e  ECT",.     "TRAN
bab0: 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20  SACTION",       
bac0: 20 20 20 22 55 50 44 41 54 45 22 2c 20 20 20 20     "UPDATE",    
bad0: 20 20 20 20 20 20 20 20 20 20 20 22 41 54 54 41             "ATTA
bae0: 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43  CH",.     "DETAC
baf0: 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
bb00: 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c    "ALTER_TABLE",
bb10: 20 20 20 20 20 20 20 20 20 20 22 52 45 49 4e 44            "REIND
bb20: 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59  EX",.     "ANALY
bb30: 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ZE",            
bb40: 20 20 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45    "CREATE_VTABLE
bb50: 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f  ",        "DROP_
bb60: 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46  VTABLE",.     "F
bb70: 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20  UNCTION",       
bb80: 20 20 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54        "SAVEPOINT
bb90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 52  ",            "R
bba0: 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20  ECURSIVE".  };. 
bbb0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
bbc0: 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61  char *az[4];.  a
bbd0: 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a  z[0] = zA1;.  az
bbe0: 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b  [1] = zA2;.  az[
bbf0: 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33  2] = zA3;.  az[3
bc00: 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f  ] = zA4;.  utf8_
bc10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bc20: 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c  authorizer: %s",
bc30: 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a   azAction[op]);.
bc40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20    for(i=0; i<4; 
bc50: 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  i++){.    raw_pr
bc60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
bc70: 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d  );.    if( az[i]
bc80: 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74   ){.      output
bc90: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
bca0: 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  , az[i]);.    }e
bcb0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
bcc0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e  rintf(p->out, "N
bcd0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
bce0: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
bcf0: 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72  >out, "\n");.  r
bd00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bd10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
bd20: 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20   Print a schema 
bd30: 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74  statement.  Part
bd40: 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e   of MODE_Semi an
bd50: 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75  d MODE_Pretty ou
bd60: 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tput..**.** This
bd70: 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74   routine convert
bd80: 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41  s some CREATE TA
bd90: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66  BLE statements f
bda0: 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73  or shadow tables
bdb0: 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20  .** in FTS3/4/5 
bdc0: 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c  into CREATE TABL
bdd0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
bde0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
bdf0: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
be00: 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20  SchemaLine(FILE 
be10: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
be20: 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *z, const char 
be30: 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 7a  *zTail){.  if( z
be40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
be50: 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72  if( zTail==0 ) r
be60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
be70: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52  ite3_strglob("CR
be80: 45 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d  EATE TABLE ['\"]
be90: 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  *", z)==0 ){.   
bea0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
beb0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
bec0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73  IF NOT EXISTS %s
bed0: 25 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c  %s", z+13, zTail
bee0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bef0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
bf00: 20 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69   "%s%s", z, zTai
bf10: 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  l);.  }.}.static
bf20: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
bf30: 61 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74  aLineN(FILE *out
bf40: 2c 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  , char *z, int n
bf50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
bf60: 61 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d  ail){.  char c =
bf70: 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20   z[n];.  z[n] = 
bf80: 30 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61  0;.  printSchema
bf90: 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61  Line(out, z, zTa
bfa0: 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b  il);.  z[n] = c;
bfb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bfc0: 20 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20   true if string 
bfd0: 7a 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20  z[] has nothing 
bfe0: 62 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61  but whitespace a
bff0: 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74  nd comments to t
c000: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
c010: 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a   first line..*/.
c020: 73 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45  static int wsToE
c030: 6f 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ol(const char *z
c040: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
c050: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
c060: 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
c070: 3d 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31  ='\n' ) return 1
c080: 3b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63  ;.    if( IsSpac
c090: 65 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e  e(z[i]) ) contin
c0a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ue;.    if( z[i]
c0b0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
c0c0: 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b  ='-' ) return 1;
c0d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c0e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
c0f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
c100: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45  w entry to the E
c110: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c120: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c130: 20 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64   void eqp_append
c140: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
c150: 69 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20  int iEqpId, int 
c160: 70 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  p2, const char *
c170: 7a 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61  zText){.  EQPGra
c180: 70 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69  phRow *pNew;.  i
c190: 6e 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65  nt nText = strle
c1a0: 6e 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66  n30(zText);.  if
c1b0: 28 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74  ( p->autoEQPtest
c1c0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
c1d0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c  ntf(p->out, "%d,
c1e0: 25 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64  %d,%s\n", iEqpId
c1f0: 2c 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20  , p2, zText);.  
c200: 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  }.  pNew = sqlit
c210: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
c220: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65  eof(*pNew) + nTe
c230: 78 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  xt );.  if( pNew
c240: 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f  ==0 ) shell_out_
c250: 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70  of_memory();.  p
c260: 4e 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45  New->iEqpId = iE
c270: 71 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50  qpId;.  pNew->iP
c280: 61 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20  arentId = p2;.  
c290: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65  memcpy(pNew->zTe
c2a0: 78 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74  xt, zText, nText
c2b0: 2b 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  +1);.  pNew->pNe
c2c0: 78 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  xt = 0;.  if( p-
c2d0: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b  >sGraph.pLast ){
c2e0: 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70  .    p->sGraph.p
c2f0: 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  Last->pNext = pN
c300: 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ew;.  }else{.   
c310: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20   p->sGraph.pRow 
c320: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = pNew;.  }.  p-
c330: 3e 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20  >sGraph.pLast = 
c340: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
c350: 72 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  ree and reset th
c360: 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  e EXPLAIN QUERY 
c370: 50 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68  PLAN data that h
c380: 61 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65  as been collecte
c390: 64 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70  d.** in p->sGrap
c3a0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
c3b0: 64 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c  d eqp_reset(Shel
c3c0: 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51  lState *p){.  EQ
c3d0: 50 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c  PGraphRow *pRow,
c3e0: 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
c3f0: 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e  Row = p->sGraph.
c400: 70 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77  pRow; pRow; pRow
c410: 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   = pNext){.    p
c420: 4e 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  Next = pRow->pNe
c430: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
c440: 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a  free(pRow);.  }.
c450: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72    memset(&p->sGr
c460: 61 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  aph, 0, sizeof(p
c470: 2d 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f  ->sGraph));.}../
c480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * Return the nex
c490: 74 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  t EXPLAIN QUERY 
c4a0: 50 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69  PLAN line with i
c4b0: 45 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72  EqpId that occur
c4c0: 73 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c  s after.** pOld,
c4d0: 20 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66   or return the f
c4e0: 69 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69  irst such line i
c4f0: 66 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a  f pOld is NULL.*
c500: 2f 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70  /.static EQPGrap
c510: 68 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72  hRow *eqp_next_r
c520: 6f 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ow(ShellState *p
c530: 2c 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51  , int iEqpId, EQ
c540: 50 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29  PGraphRow *pOld)
c550: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c560: 2a 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70  *pRow = pOld ? p
c570: 4f 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e  Old->pNext : p->
c580: 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77  sGraph.pRow;.  w
c590: 68 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52  hile( pRow && pR
c5a0: 6f 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69  ow->iParentId!=i
c5b0: 45 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70  EqpId ) pRow = p
c5c0: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  Row->pNext;.  re
c5d0: 74 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a  turn pRow;.}../*
c5e0: 20 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65   Render a single
c5f0: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72   level of the gr
c600: 61 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71  aph that has iEq
c610: 70 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e  pId as its paren
c620: 74 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65  t.  Called.** re
c630: 63 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e  cursively to ren
c640: 64 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a  der sublevels..*
c650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c660: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53  p_render_level(S
c670: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e  hellState *p, in
c680: 74 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50  t iEqpId){.  EQP
c690: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
c6a0: 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20  *pNext;.  int n 
c6b0: 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47  = strlen30(p->sG
c6c0: 72 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20  raph.zPrefix);. 
c6d0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28   char *z;.  for(
c6e0: 70 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f  pRow = eqp_next_
c6f0: 72 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30  row(p, iEqpId, 0
c700: 29 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20  ); pRow; pRow = 
c710: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
c720: 74 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77  t = eqp_next_row
c730: 28 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77  (p, iEqpId, pRow
c740: 29 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d  );.    z = pRow-
c750: 3e 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38  >zText;.    utf8
c760: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c770: 22 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73  "%s%s%s\n", p->s
c780: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70  Graph.zPrefix, p
c790: 4e 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22  Next ? "|--" : "
c7a0: 60 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66  `--", z);.    if
c7b0: 28 20 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( n<(int)sizeof(
c7c0: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c7d0: 78 29 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65  x)-7 ){.      me
c7e0: 6d 63 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e  mcpy(&p->sGraph.
c7f0: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78  zPrefix[n], pNex
c800: 74 20 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20  t ? "|  " : "   
c810: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70  ", 4);.      eqp
c820: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c  _render_level(p,
c830: 20 70 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a   pRow->iEqpId);.
c840: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c850: 7a 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a  zPrefix[n] = 0;.
c860: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c870: 2a 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72  ** Display and r
c880: 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e  eset the EXPLAIN
c890: 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61   QUERY PLAN data
c8a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c8b0: 65 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c  eqp_render(Shell
c8c0: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50  State *p){.  EQP
c8d0: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d  GraphRow *pRow =
c8e0: 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b   p->sGraph.pRow;
c8f0: 0a 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20  .  if( pRow ){. 
c900: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65     if( pRow->zTe
c910: 78 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  xt[0]=='-' ){.  
c920: 20 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e      if( pRow->pN
c930: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ext==0 ){.      
c940: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
c950: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
c970: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c980: 2c 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e  , "%s\n", pRow->
c990: 7a 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20  zText+3);.      
c9a0: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d  p->sGraph.pRow =
c9b0: 20 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20   pRow->pNext;.  
c9c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c9d0: 28 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  (pRow);.    }els
c9e0: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
c9f0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55  intf(p->out, "QU
ca00: 45 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20  ERY PLAN\n");.  
ca10: 20 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70    }.    p->sGrap
ca20: 68 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30  h.zPrefix[0] = 0
ca30: 3b 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72  ;.    eqp_render
ca40: 5f 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20  _level(p, 0);.  
ca50: 20 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a    eqp_reset(p);.
ca60: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
ca70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
ca80: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
ca90: 2a 2a 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64  ** Progress hand
caa0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ler callback..*/
cab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67  .static int prog
cac0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69  ress_handler(voi
cad0: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20  d *pClientData) 
cae0: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
caf0: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
cb00: 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  )pClientData;.  
cb10: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a  p->nProgress++;.
cb20: 20 20 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65    if( p->nProgre
cb30: 73 73 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73  ss>=p->mxProgres
cb40: 73 20 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65  s && p->mxProgre
cb50: 73 73 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  ss>0 ){.    raw_
cb60: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cb70: 50 72 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72  Progress limit r
cb80: 65 61 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20  eached (%u)\n", 
cb90: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20  p->nProgress);. 
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 52 45 53 45 54 20 29 20 70  OGRESS_RESET ) p
cbd0: 2d 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->nProgress = 0;
cbe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50  .    if( p->flgP
cbf0: 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f  rogress & SHELL_
cc00: 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 29 20  PROGRESS_ONCE ) 
cc10: 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73 20 3d 20  p->mxProgress = 
cc20: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  0;.    return 1;
cc30: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66  .  }.  if( (p->f
cc40: 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45  lgProgress & SHE
cc50: 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51 55 49 45  LL_PROGRESS_QUIE
cc60: 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  T)==0 ){.    raw
cc70: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
cc80: 22 50 72 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c  "Progress %u\n",
cc90: 20 70 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a   p->nProgress);.
cca0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ccb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ccc0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
ccd0: 5f 43 41 4c 4c 42 41 43 4b 20 2a 2f 0a 0a 2f 2a  _CALLBACK */../*
cce0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
ccf0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
cd00: 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a   that the shell.
cd10: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
cd20: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
cd30: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
cd40: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63  atic int shell_c
cd50: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
cd60: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  *pArg,.  int nAr
cd70: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
cd80: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
cd90: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
cda0: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54  **azArg,    /* T
cdb0: 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75  ext of each resu
cdc0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
cdd0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20  har **azCol,    
cde0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
cdf0: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65  */.  int *aiType
ce00: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
ce10: 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  types */.){.  in
ce20: 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  t i;.  ShellStat
ce30: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
ce40: 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28  te*)pArg;..  if(
ce50: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
ce60: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
ce70: 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20  p->cMode ){.    
ce80: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20  case MODE_Line: 
ce90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20  {.      int w = 
cea0: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  5;.      if( azA
ceb0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
cec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ced0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cee0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
cef0: 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20  rlen30(azCol[i] 
cf00: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
cf10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
cf20: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
cf30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cf40: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74   p->cnt++>0 ) ut
cf50: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cf60: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
cf70: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
cf80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
cf90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
cfa0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cfb0: 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20  t,"%*s = %s%s", 
cfc0: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  w, azCol[i],.   
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
cfe0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
cff0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c   : p->nullValue,
d000: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d010: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d030: 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c    case MODE_Expl
d040: 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f  ain:.    case MO
d050: 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20  DE_Column: {.   
d060: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d070: 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74  int aExplainWidt
d080: 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34  hs[] = {4, 13, 4
d090: 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31  , 4, 4, 13, 2, 1
d0a0: 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3};.      const 
d0b0: 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20  int *colWidth;. 
d0c0: 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72       int showHdr
d0d0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f  ;.      char *ro
d0e0: 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20  wSep;.      if( 
d0f0: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43  p->cMode==MODE_C
d100: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
d110: 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63   colWidth = p->c
d120: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20  olWidth;.       
d130: 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68   showHdr = p->sh
d140: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
d150: 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f    rowSep = p->ro
d160: 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20  wSeparator;.    
d170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d180: 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70   colWidth = aExp
d190: 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20  lainWidths;.    
d1a0: 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b      showHdr = 1;
d1b0: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
d1c0: 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20  = SEP_Row;.     
d1d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
d1e0: 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20  cnt++==0 ){.    
d1f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d200: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d210: 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20       int w, n;. 
d220: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
d230: 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
d240: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
d250: 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74       w = colWidt
d260: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
d270: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d280: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
d290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d2a0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
d2b0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
d2c0: 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20  enChar(azCol[i] 
d2d0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
d2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d2f0: 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b  ( w<10 ) w = 10;
d300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
d310: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
d320: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
d330: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
d340: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
d350: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
d360: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
d370: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
d380: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
d390: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
d3b0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
d3c0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
d3d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f           if( sho
d3e0: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
d3f0: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
d400: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
d410: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
d420: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d430: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d440: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
d450: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
d460: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d470: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
d480: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
d490: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d4a0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d4b0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
d4c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
d4d0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
d4e0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d500: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
d510: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
d520: 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20    if( w<0 ) w = 
d530: 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w;.            
d540: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d550: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
d560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d570: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d580: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e  ntf(p->out,"%-*.
d590: 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20  *s%s",w,w,.     
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 22 0a 20 20 20 20 20  ---------".     
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
d600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d660: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d680: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d690: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
d6a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
d6b0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d6c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
d6d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
d6e0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
d6f0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
d700: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
d710: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
d720: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d730: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
d740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d750: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
d760: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
d770: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
d780: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
d790: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
d7a0: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
d7b0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
d7c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d7d0: 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e   i==1 && p->aiIn
d7e0: 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74  dent && p->pStmt
d7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
d800: 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e  ( p->iIndent<p->
d810: 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20  nIndent ){.     
d820: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d830: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
d840: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
d850: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
d860: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d870: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
d880: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
d890: 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74         utf8_widt
d8a0: 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20  h_print(p->out, 
d8b0: 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  w, azArg[i] ? az
d8c0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
d8d0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
d8e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d8f0: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
d900: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
d910: 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
d920: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d930: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53  .    case MODE_S
d940: 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68  emi: {   /* .sch
d950: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
d960: 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ema output */.  
d970: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
d980: 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ine(p->out, azAr
d990: 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  g[0], ";\n");.  
d9a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d9b0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50  .    case MODE_P
d9c0: 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63  retty: {  /* .sc
d9d0: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
d9e0: 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65  hema with --inde
d9f0: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  nt */.      char
da00: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *z;.      int j
da10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72  ;.      int nPar
da20: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  en = 0;.      ch
da30: 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20  ar cEnd = 0;.   
da40: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
da50: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a   int nLine = 0;.
da60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
da70: 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  rg==1 );.      i
da80: 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29  f( azArg[0]==0 )
da90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
daa0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
dab0: 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22  e("CREATE VIEW%"
dac0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
dad0: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
dae0: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
daf0: 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72  ATE TRIG%", azAr
db00: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
db10: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
db20: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
db30: 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b   "%s;\n", azArg[
db40: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  0]);.        bre
db50: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
db60: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
db70: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
db80: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d  g[0]);.      j =
db90: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
dba0: 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  0; IsSpace(z[i])
dbb0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66  ; i++){}.      f
dbc0: 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  or(; (c = z[i])!
dbd0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
dbe0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
dbf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
dc00: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29  ( z[j-1]=='\r' )
dc10: 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a   z[j-1] = '\n';.
dc20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
dc30: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c  Space(z[j-1]) ||
dc40: 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63   z[j-1]=='(' ) c
dc50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
dc60: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
dc70: 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26  (' || c==')') &&
dc80: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
dc90: 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  z[j-1]) ){.     
dca0: 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
dcb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
dcc0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
dcd0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
dce0: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
dcf0: 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  1]) ){ j--; }.  
dd00: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
dd10: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30      if( strlen30
dd20: 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20  (z)>=79 ){.     
dd30: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63     for(i=j=0; (c
dd40: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
dd50: 29 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e  ){  /* Copy chan
dd60: 67 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61  ges from z[i] ba
dd70: 63 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20  ck to z[j] */.  
dd80: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
dd90: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
dda0: 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20     cEnd = 0;.   
ddb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ddc0: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c   c=='"' || c=='\
ddd0: 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a  '' || c=='`' ){.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
ddf0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
de00: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
de10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
de20: 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20  cEnd = ']';.    
de30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
de40: 63 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d  c=='-' && z[i+1]
de50: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
de60: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27       cEnd = '\n'
de70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
de80: 65 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a  e if( c=='(' ){.
de90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72              nPar
dea0: 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  en++;.          
deb0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27  }else if( c==')'
dec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ded0: 6e 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  nParen--;.      
dee0: 20 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e        if( nLine>
def0: 30 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26  0 && nParen==0 &
df00: 26 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & j>0 ){.       
df10: 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65         printSche
df20: 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20  maLineN(p->out, 
df30: 7a 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  z, j, "\n");.   
df40: 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30             j = 0
df50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
df60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
df70: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63        z[j++] = c
df80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
df90: 6e 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e  nParen==1 && cEn
dfa0: 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
dfb0: 26 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  && (c=='(' || c=
dfc0: 3d 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27  ='\n' || (c==','
dfd0: 20 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69   && !wsToEol(z+i
dfe0: 2b 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20  +1))).          
dff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
e000: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d  f( c=='\n' ) j--
e010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
e020: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70  intSchemaLineN(p
e030: 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e  ->out, z, j, "\n
e040: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
e050: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    j = 0;.       
e060: 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20       nLine++;.  
e070: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
e080: 20 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29   IsSpace(z[i+1])
e090: 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ i++; }.     
e0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e0b0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20  .        z[j] = 
e0c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
e0d0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
e0e0: 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e  (p->out, z, ";\n
e0f0: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
e100: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
e110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e120: 20 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74    case MODE_List
e130: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
e140: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
e150: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e160: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e170: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e180: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e190: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22  tf(p->out,"%s%s"
e1a0: 2c 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20  ,azCol[i],.     
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d               i==
e1c0: 6e 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53  nArg-1 ? p->rowS
e1d0: 65 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f  eparator : p->co
e1e0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e1f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e200: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e210: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e230: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e240: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
e250: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
e260: 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75  z==0 ) z = p->nu
e270: 6c 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  llValue;.       
e280: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e290: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
e2a0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72         if( i<nAr
e2b0: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g-1 ){.         
e2c0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e2d0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e2e0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e2f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e300: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e310: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e320: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e330: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e340: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e350: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e360: 4d 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20  MODE_Html: {.   
e370: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e380: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e390: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  der ){.        r
e3a0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e3b0: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
e3c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
e3d0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
e3e0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e3f0: 3e 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20  >out,"<TH>");.  
e400: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
e410: 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  tml_string(p->ou
e420: 74 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  t, azCol[i]);.  
e430: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e440: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e  tf(p->out,"</TH>
e450: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
e460: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e470: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e  tf(p->out,"</TR>
e480: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
e490: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
e4a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e4b0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e4c0: 74 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20  t,"<TR>");.     
e4d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e4e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e4f0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e500: 74 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20  t,"<TD>");.     
e510: 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73     output_html_s
e520: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
e530: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
e540: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
e550: 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
e560: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f  rintf(p->out,"</
e570: 54 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  TD>\n");.      }
e580: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
e590: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
e5a0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
e5b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e5c0: 20 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20   MODE_Tcl: {.   
e5d0: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d     if( p->cnt++=
e5e0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
e5f0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
e600: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e610: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
e620: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
e630: 70 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20  p->out,azCol[i] 
e640: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
e650: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 69  ;.          if(i
e660: 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72  <nArg-1) utf8_pr
e670: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e680: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
e690: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
e6a0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e6b0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e6c0: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e6d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e6e0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
e6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
e700: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e710: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70  +){.        outp
e720: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
e730: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e740: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e750: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e760: 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74   if(i<nArg-1) ut
e770: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e780: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
e790: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e7a0: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
e7b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e7c0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
e7d0: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
e7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e7f0: 4d 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20  MODE_Csv: {.    
e800: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
e810: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
e820: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e830: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e840: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e850: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e860: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
e870: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43  utput_csv(p, azC
e880: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e890: 20 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29   : "", i<nArg-1)
e8a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e8b0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e8c0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e8d0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
e8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e8f0: 28 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ( nArg>0 ){.    
e900: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e910: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e920: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e930: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e  p, azArg[i], i<n
e940: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e950: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e960: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e970: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e980: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e990: 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28      setTextMode(
e9a0: 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
e9b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e9c0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73     case MODE_Ins
e9d0: 65 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ert: {.      if(
e9e0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
e9f0: 6b 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  k;.      utf8_pr
ea00: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53  intf(p->out,"INS
ea10: 45 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e  ERT INTO %s",p->
ea20: 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zDestTable);.   
ea30: 20 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65     if( p->showHe
ea40: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
ea50: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ea60: 74 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20  t,"(");.        
ea70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
ea80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
ea90: 20 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70   if( i>0 ) raw_p
eaa0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c  rintf(p->out, ",
eab0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ");.          if
eac0: 28 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  ( quoteChar(azCo
ead0: 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[i]) ){.       
eae0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
eaf0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
eb00: 5c 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69  \"%w\"", azCol[i
eb10: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
eb20: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
eb30: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
eb40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eb50: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  3_free(z);.     
eb60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
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 20 22 25 73 22 2c  tf(p->out, "%s",
eb90: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
eba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ebb0: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
ebc0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29  intf(p->out,")")
ebd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ebe0: 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  p->cnt++;.      
ebf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
ec00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
ec10: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ec20: 2c 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20  , i>0 ? "," : " 
ec30: 56 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20  VALUES(");.     
ec40: 20 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d     if( (azArg[i]
ec50: 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20  ==0) || (aiType 
ec60: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
ec70: 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
ec80: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ec90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c  ntf(p->out,"NULL
eca0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
ecb0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
ecc0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
ecd0: 45 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20  E_TEXT ){.      
ece0: 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73      if( ShellHas
ecf0: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
ed00: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
ed10: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
ed20: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
ed30: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
ed40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70              outp
ed60: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
ed70: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
ed80: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
ed90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eda0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
edb0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
edc0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
edd0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
ede0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
edf0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
ee00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ee10: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ee20: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
ee30: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
ee40: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
ee50: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
ee60: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
ee70: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
ee80: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
ee90: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72  qlite3_uint64 ur
eea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
eeb0: 70 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66  py(&ur,&r,sizeof
eec0: 28 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (r));.          
eed0: 69 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30  if( ur==0x7ff000
eee0: 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a  0000000000LL ){.
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
ef00: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
ef10: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ef20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d     }else if( ur=
ef30: 3d 30 78 66 66 66 30 30 30 30 30 30 30 30 30 30  =0xfff0000000000
ef40: 30 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  000LL ){.       
ef50: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ef60: 70 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22  p->out, "-1e999"
ef70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
ef80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
ef90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
efa0: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
efb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
efc0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
efd0: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
efe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
eff0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f000: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f010: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
f020: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
f030: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
f040: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
f050: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
f060: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
f070: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
f080: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f090: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
f0a0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
f0b0: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
f0c0: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
f0d0: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
f0e0: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
f0f0: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
f100: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
f110: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
f120: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
f130: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f140: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
f150: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
f160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
f170: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
f180: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
f190: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
f1a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  se{.          ou
f1b0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
f1c0: 70 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ped_string(p->ou
f1d0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
f1e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f1f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f200: 28 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b  (p->out,");\n");
f210: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f220: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
f230: 45 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20  E_Quote: {.     
f240: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
f250: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
f260: 20 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d   p->cnt==0 && p-
f270: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
f280: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
f290: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
f2a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
f2b0: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
f2c0: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
f2d0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
f2e0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f2f0: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
f300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
f310: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f320: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ,"\n");.      }.
f330: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
f340: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f350: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f360: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72       if( i>0 ) r
f370: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f380: 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20  , ",");.        
f390: 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30  if( (azArg[i]==0
f3a0: 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20  ) || (aiType && 
f3b0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
f3c0: 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
f3d0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f3e0: 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b  (p->out,"NULL");
f3f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f400: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f410: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54  ype[i]==SQLITE_T
f420: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
f430: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
f440: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f450: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f460: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f470: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f480: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
f490: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f4a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f4b0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f4c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f4d0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f4e0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c  pe[i]==SQLITE_FL
f4f0: 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OAT ){.         
f500: 20 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20   char z[50];.   
f510: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20         double r 
f520: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f530: 5f 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74  _double(p->pStmt
f540: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f550: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
f560: 28 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20  (50,z,"%!.20g", 
f570: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  r);.          ra
f580: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f590: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
f5a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
f5b0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
f5c0: 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26  ==SQLITE_BLOB &&
f5d0: 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20   p->pStmt ){.   
f5e0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69         const voi
f5f0: 64 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  d *pBlob = sqlit
f600: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
f610: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
f620: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62         int nBlob
f630: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f640: 6e 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74  n_bytes(p->pStmt
f650: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
f660: 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28  output_hex_blob(
f670: 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e  p->out, pBlob, n
f680: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  Blob);.        }
f690: 65 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65  else if( isNumbe
f6a0: 72 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29  r(azArg[i], 0) )
f6b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
f6c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
f6d0: 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  %s", azArg[i]);.
f6e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f6f0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f700: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
f710: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
f720: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f730: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
f740: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29  ntf(p->out,"\n")
f750: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f760: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
f770: 44 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20  DE_Ascii: {.    
f780: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
f790: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
f7a0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
f7b0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f7c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
f7d0: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f7e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7f0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f800: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75  or);.          u
f810: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f820: 74 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20  t,"%s",azCol[i] 
f830: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
f840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f850: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f860: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
f870: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
f880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f890: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
f8a0: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
f8b0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
f8c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30  .        if( i>0
f8d0: 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70   ) utf8_printf(p
f8e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f8f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
f900: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f910: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
f920: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
f930: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
f940: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
f950: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f960: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
f970: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
f980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f990: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45  .    case MODE_E
f9a0: 51 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f  QP: {.      eqp_
f9b0: 61 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61  append(p, atoi(a
f9c0: 7a 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61  zArg[0]), atoi(a
f9d0: 7a 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b  zArg[1]), azArg[
f9e0: 33 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  3]);.      break
f9f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
fa00: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fa10: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
fa20: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
fa30: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  at the SQLite li
fa40: 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73  brary.** invokes
fa50: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
fa60: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
fa70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
fa80: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
fa90: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
faa0: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fab0: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20   **azCol){.  /* 
fac0: 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68  since we don't h
fad0: 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63  ave type info, c
fae0: 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61  all the shell_ca
faf0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55  llback with a NU
fb00: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65  LL value */.  re
fb10: 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62  turn shell_callb
fb20: 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20  ack(pArg, nArg, 
fb30: 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55  azArg, azCol, NU
fb40: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LL);.}../*.** Th
fb50: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
fb60: 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  ck routine from 
fb70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74  sqlite3_exec() t
fb80: 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a  hat appends all.
fb90: 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74  ** output onto t
fba0: 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c  he end of a Shel
fbb0: 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lText object..*/
fbc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74  .static int capt
fbd0: 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
fbe0: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
fbf0: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
fc00: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29  zArg, char **az)
fc10: 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70  {.  ShellText *p
fc20: 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70   = (ShellText*)p
fc30: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
fc40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fc50: 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72  (az);.  if( azAr
fc60: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
fc70: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70  .  if( p->n ) ap
fc80: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c  pendText(p, "|",
fc90: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
fca0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
fcb0: 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64    if( i ) append
fcc0: 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b  Text(p, ",", 0);
fcd0: 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69  .    if( azArg[i
fce0: 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  ] ) appendText(p
fcf0: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  , azArg[i], 0);.
fd00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
fd10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
fd20: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
fd30: 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
fd40: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
fd50: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
fd60: 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74  void createSelft
fd70: 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74  estTable(ShellSt
fd80: 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ate *p){.  char 
fd90: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
fda0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
fdb0: 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49  db,.    "SAVEPOI
fdc0: 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  NT selftest_init
fdd0: 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45  ;\n".    "CREATE
fde0: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
fdf0: 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e  ISTS selftest(\n
fe00: 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54  ".    "  tno INT
fe10: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
fe20: 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e  ,\n"   /* Test n
fe30: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20  umber */.    "  
fe40: 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  op TEXT,\n"     
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe60: 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f   Operator:  memo
fe70: 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63   run */.    "  c
fe80: 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  md TEXT,\n"     
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fea0: 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a  Command text */.
feb0: 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c      "  ans TEXT\
fec0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
fed0: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
fee0: 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29  answer */.    ")
fef0: 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  ;".    "CREATE T
ff00: 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c  EMP TABLE [_shel
ff10: 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61  l$self](op,cmd,a
ff20: 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ns);\n".    "INS
ff30: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
ff40: 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c  $self](rowid,op,
ff50: 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56  cmd)\n".    "  V
ff60: 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28  ALUES(coalesce((
ff70: 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29  SELECT (max(tno)
ff80: 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65  +100)/10 FROM se
ff90: 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a  lftest),10),\n".
ffa0: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d      "         'm
ffb0: 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65  emo','Tests gene
ffc0: 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27  rated by --init'
ffd0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
ffe0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
fff0: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
10000 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a  ELECT 'run',\n".
10010 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
10020 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
10030 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ''SELECT type,na
10040 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
10050 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
10080 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
10090 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  2'',224))',\n". 
100a0 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
100b0 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74  _query('SELECT t
100c0 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
100d0 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
10100 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
10110 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20  ',224));\n".    
10120 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
10130 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
10140 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
10150 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  ',".    "    'SE
10160 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
10170 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46  ery(''SELECT * F
10180 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20  ROM \"' ||".    
10190 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  "        printf(
101a0 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c  '%w',name) || '\
101b0 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c  " NOT INDEXED'',
101c0 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
101d0 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
101e0 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43  ry(printf('SELEC
101f0 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
10200 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d  NOT INDEXED',nam
10210 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20  e),224))\n".    
10220 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  "  FROM (\n".   
10230 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d   "    SELECT nam
10240 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
10250 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ster\n".    "   
10260 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61    WHERE type='ta
10270 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  ble'\n".    "   
10280 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73      AND name<>'s
10290 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20  elftest'\n".    
102a0 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c  "       AND coal
102b0 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
102c0 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e  >0\n".    "  )\n
102d0 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
102e0 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49   name;\n".    "I
102f0 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
10300 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
10310 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c  "  VALUES('run',
10320 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
10330 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c  y_check','ok');\
10340 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
10350 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f  NTO selftest(tno
10360 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20  ,op,cmd,ans)".  
10370 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69    "  SELECT rowi
10380 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20  d*10,op,cmd,ans 
10390 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  FROM [_shell$sel
103a0 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50  f];\n".    "DROP
103b0 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73   TABLE [_shell$s
103c0 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c  elf];".    ,0,0,
103d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
103e0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
103f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
10400 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e  rr, "SELFTEST in
10410 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
10420 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  lure: %s\n", zEr
10430 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
10440 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
10450 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10460 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
10470 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e  EASE selftest_in
10480 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a  it",0,0,0);.}...
10490 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
104a0 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
104b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
104c0 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
104d0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
104e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
104f0 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
10500 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
10510 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
10520 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
10530 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
10540 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
10550 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
10560 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
10570 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  , n;.  char cQuo
10580 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
10590 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
105a0 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
105b0 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
105c0 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
105d0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
105e0 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
105f0 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71  rn;.  cQuote = q
10600 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
10610 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
10620 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51  zName);.  if( cQ
10630 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b  uote ) n += n+2;
10640 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
10650 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
10660 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
10670 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
10680 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20  memory();.  n = 
10690 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  0;.  if( cQuote 
106a0 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
106b0 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  e;.  for(i=0; zN
106c0 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
106d0 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
106e0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
106f0 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20  me[i]==cQuote ) 
10700 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
10710 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74  .  }.  if( cQuot
10720 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
10730 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  ote;.  z[n] = 0;
10740 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
10750 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
10760 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67  ment that will g
10770 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70  enerate SQL outp
10780 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  ut.  Print.** th
10790 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
107a0 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65  , comma-separate
107b0 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64  d, on a line and
107c0 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73   then add a.** s
107d0 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
107e0 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
107f0 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  f that line..**.
10800 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
10810 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31   of columns is 1
10820 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
10830 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22   contains text "
10840 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  --".** then writ
10850 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
10860 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  on a separate li
10870 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  ne.  That way, i
10880 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d  f a.** "--" comm
10890 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  ent occurs at th
108a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61  e end of the sta
108b0 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d  tement, the comm
108c0 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e  ent.** won't con
108d0 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  sume the semicol
108e0 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  on terminator..*
108f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
10900 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
10910 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  y(.  ShellState 
10920 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
10930 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a   Query context *
10940 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10950 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20  zSelect,     /* 
10960 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10970 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74   to extract cont
10980 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
10990 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20  har *zFirstRow  
109a0 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72    /* Print befor
109b0 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20  e first row, if 
109c0 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
109d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
109e0 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63  Select;.  int rc
109f0 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b  ;.  int nResult;
10a00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
10a10 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20  t char *z;.  rc 
10a20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
10a30 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c  e_v2(p->db, zSel
10a40 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63  ect, -1, &pSelec
10a50 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
10a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
10a70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74  Select ){.    ut
10a80 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
10a90 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
10aa0 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
10ab0 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
10ac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
10ad0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
10ae0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
10af0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
10b00 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
10b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10b20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10b30 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
10b40 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
10b50 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
10b60 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
10b70 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
10b80 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69  W ){.    if( zFi
10b90 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  rstRow ){.      
10ba0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10bb0 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74  ut, "%s", zFirst
10bc0 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72  Row);.      zFir
10bd0 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  stRow = 0;.    }
10be0 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
10bf0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
10c00 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
10c10 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f  t, 0);.    utf8_
10c20 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
10c30 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  %s", z);.    for
10c40 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=1; i<nResult;
10c50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66   i++){.      utf
10c60 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10c70 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f   ",%s", sqlite3_
10c80 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
10c90 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a  ect, i));.    }.
10ca0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
10cb0 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
10cc0 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21  ( z[0] && (z[0]!
10cd0 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d  ='-' || z[1]!='-
10ce0 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  ') ) z++;.    if
10cf0 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[0] ){.      
10d00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
10d10 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20  t, "\n;\n");.   
10d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
10d30 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
10d40 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20   ";\n");.    }. 
10d50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
10d60 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
10d70 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10d80 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
10d90 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ct);.  if( rc!=S
10da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10db0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
10dc0 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
10dd0 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
10de0 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
10df0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10e00 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
10e10 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
10e20 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
10e30 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
10e40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
10e60 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76  te space and sav
10e70 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72  e off current er
10e80 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ror string..*/.s
10e90 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65  tatic char *save
10ea0 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69  _err_msg(.  sqli
10eb0 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20  te3 *db         
10ec0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
10ed0 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  o query */.){.  
10ee0 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b  int nErrMsg = 1+
10ef0 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  strlen30(sqlite3
10f00 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
10f10 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
10f20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
10f30 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  (nErrMsg);.  if(
10f40 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
10f50 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20  memcpy(zErrMsg, 
10f60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
10f70 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20  b), nErrMsg);.  
10f80 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d  }.  return zErrM
10f90 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  sg;.}..#ifdef __
10fa0 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74  linux__./*.** At
10fb0 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79  tempt to display
10fc0 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69   I/O stats on Li
10fd0 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f  nux using /proc/
10fe0 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63  PID/io.*/.static
10ff0 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e   void displayLin
11000 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a  uxIoStats(FILE *
11010 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  out){.  FILE *in
11020 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b  ;.  char z[200];
11030 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
11040 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
11050 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c  , "/proc/%d/io",
11060 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e   getpid());.  in
11070 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22   = fopen(z, "rb"
11080 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
11090 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
110a0 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f  ( fgets(z, sizeo
110b0 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a  f(z), in)!=0 ){.
110c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
110d0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
110e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
110f0 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  tern;.      cons
11100 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20  t char *zDesc;. 
11110 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20     } aTrans[] = 
11120 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72  {.      { "rchar
11130 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
11140 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63        "Bytes rec
11150 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a  eived by read():
11160 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63  " },.      { "wc
11170 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
11180 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
11190 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a  sent to write():
111a0 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  "    },.      { 
111b0 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20  "syscr: ",      
111c0 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61              "Rea
111d0 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  d() system calls
111e0 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  :"      },.     
111f0 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20   { "syscw: ",   
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11210 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63  Write() system c
11220 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20  alls:"     },.  
11230 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65      { "read_byte
11240 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
11250 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72    "Bytes read fr
11260 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c  om storage:"  },
11270 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f  .      { "write_
11280 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
11290 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74       "Bytes writ
112a0 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22  ten to storage:"
112b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e   },.      { "can
112c0 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74  celled_write_byt
112d0 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c  es: ",  "Cancell
112e0 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22  ed write bytes:"
112f0 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
11300 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
11310 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
11320 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b  e(aTrans); i++){
11330 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11340 74 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69  trlen30(aTrans[i
11350 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20  ].zPattern);.   
11360 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
11370 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72  Trans[i].zPatter
11380 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n, z, n)==0 ){. 
11390 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
113a0 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
113b0 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44  s", aTrans[i].zD
113c0 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20  esc, &z[n]);.   
113d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
113e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
113f0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65  fclose(in);.}.#e
11400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  ndif../*.** Disp
11410 6c 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e  lay a single lin
11420 65 20 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e  e of status usin
11430 67 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e  g 64-bit values.
11440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11450 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11460 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
11470 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11480 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78  The shell contex
11490 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61  t */.  char *zLa
114a0 62 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  bel,            
114b0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
114c0 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20  is one line */. 
114d0 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
114e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
114f0 72 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65 73  rmat for the res
11500 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ult */.  int iSt
11510 61 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20  atusCtrl,       
11520 20 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74     /* Which stat
11530 75 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f  us to display */
11540 0a 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20  .  int bReset   
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11560 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68  True to reset th
11570 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20  e stats */.){.  
11580 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43  sqlite3_int64 iC
11590 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  ur = -1;.  sqlit
115a0 65 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20  e3_int64 iHiwtr 
115b0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  = -1;.  int i, n
115c0 50 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20  Percent;.  char 
115d0 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71  zLine[200];.  sq
115e0 6c 69 74 65 33 5f 73 74 61 74 75 73 36 34 28 69  lite3_status64(i
115f0 53 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75  StatusCtrl, &iCu
11600 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11610 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  et);.  for(i=0, 
11620 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72  nPercent=0; zFor
11630 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  mat[i]; i++){.  
11640 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d    if( zFormat[i]
11650 3d 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74  =='%' ) nPercent
11660 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ++;.  }.  if( nP
11670 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20  ercent>1 ){.    
11680 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11690 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
116a0 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
116b0 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
116c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
116d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
116e0 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e  eof(zLine), zLin
116f0 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77  e, zFormat, iHiw
11700 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70  tr);.  }.  raw_p
11710 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
11720 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62  -36s %s\n", zLab
11730 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f  el, zLine);.}../
11740 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d  *.** Display mem
11750 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  ory stats..*/.st
11760 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79  atic int display
11770 5f 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  _stats(.  sqlite
11780 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
11790 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
117a0 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
117b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
117c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
117d0 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
117e0 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52  tate */.  int bR
117f0 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  eset            
11800 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
11810 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73   reset the stats
11820 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75   */.){.  int iCu
11830 72 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b  r;.  int iHiwtr;
11840 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
11850 69 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70  if( pArg==0 || p
11860 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65  Arg->out==0 ) re
11870 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20  turn 0;.  out = 
11880 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66  pArg->out;..  if
11890 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26  ( pArg->pStmt &&
118a0 20 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20   (pArg->statsOn 
118b0 26 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  & 2) ){.    int 
118c0 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20  nCol, i, x;.    
118d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
118e0 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d  tmt = pArg->pStm
118f0 74 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  t;.    char z[10
11900 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73  0];.    nCol = s
11910 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
11920 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
11930 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
11940 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e  "%-36s %d\n", "N
11950 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
11960 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29  columns:", nCol)
11970 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11980 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11990 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
119a0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c  ntf(sizeof(z),z,
119b0 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d  "Column %d %nnam
119c0 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20  e:", i, &x);.   
119d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
119e0 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
119f0 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11a00 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  umn_name(pStmt,i
11a10 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ));.#ifndef SQLI
11a20 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
11a30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11a40 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c  nprintf(30, z+x,
11a50 20 22 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a   "declared type:
11a60 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  ");.      utf8_p
11a70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
11a80 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69  s %s\n", z, sqli
11a90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
11aa0 79 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a  ype(pStmt, i));.
11ab0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
11ac0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
11ad0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
11ae0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11af0 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74  tf(30, z+x, "dat
11b00 61 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20  abase name:");. 
11b10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11b20 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11b30 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11b40 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
11b50 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
11b60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
11b70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
11b80 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20  table name:");. 
11b90 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11ba0 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  (out, "%-36s %s\
11bb0 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63  n", z, sqlite3_c
11bc0 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
11bd0 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
11be0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11bf0 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69  tf(30, z+x, "ori
11c00 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20  gin name:");.   
11c10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
11c20 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11c30 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , z, sqlite3_col
11c40 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28  umn_origin_name(
11c50 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69  pStmt,i));.#endi
11c60 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  f.    }.  }..  d
11c70 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11c80 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65  Arg, "Memory Use
11c90 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  d:",.     "%lld 
11ca0 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
11cb0 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11cc0 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52  _MEMORY_USED, bR
11cd0 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11ce0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11cf0 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61  Number of Outsta
11d00 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e  nding Allocation
11d10 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  s:",.     "%lld 
11d20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c  (max %lld)", SQL
11d30 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
11d40 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29  C_COUNT, bReset)
11d50 3b 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68  ;.  if( pArg->sh
11d60 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
11d70 50 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20  Pagecache ){.   
11d80 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11d90 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
11da0 66 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55  f Pcache Pages U
11db0 73 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  sed:",.       "%
11dc0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70  lld (max %lld) p
11dd0 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ages", SQLITE_ST
11de0 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55  ATUS_PAGECACHE_U
11df0 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
11e00 7d 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c  }.  displayStatL
11e10 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65  ine(pArg, "Numbe
11e20 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72  r of Pcache Over
11e30 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20  flow Bytes:",.  
11e40 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
11e50 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
11e60 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11e70 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52  CHE_OVERFLOW, bR
11e80 65 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79  eset);.  display
11e90 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11ea0 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69  Largest Allocati
11eb0 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  on:",.     "%lld
11ec0 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11ed0 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49  STATUS_MALLOC_SI
11ee0 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ZE, bReset);.  d
11ef0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11f00 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63  Arg, "Largest Pc
11f10 61 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a  ache Allocation:
11f20 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79  ",.     "%lld by
11f30 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
11f40 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49  TUS_PAGECACHE_SI
11f50 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66  ZE, bReset);.#if
11f60 64 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54  def YYTRACKMAXST
11f70 41 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c  ACKDEPTH.  displ
11f80 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
11f90 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72   "Deepest Parser
11fa0 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22   Stack:",.     "
11fb0 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
11fc0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11fd0 50 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52  PARSER_STACK, bR
11fe0 65 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  eset);.#endif.. 
11ff0 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69   if( db ){.    i
12000 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c  f( pArg->shellFl
12010 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  gs & SHFLG_Looka
12020 73 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48  side ){.      iH
12030 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12050 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12060 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12070 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20  OKASIDE_USED,.  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
120a0 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
120b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
120c0 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
120d0 20 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73           "Lookas
120e0 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20  ide Slots Used: 
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12100 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20  d (max %d)\n",. 
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
12120 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20  r, iHiwtr);.    
12130 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
12140 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
12150 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
12160 45 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20  E_HIT,.         
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
12180 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12190 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
121a0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
121b0 75 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20  ut, "Successful 
121c0 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70  lookaside attemp
121d0 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  ts:       %d\n",
121e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
121f0 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
12200 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12210 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12220 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
12230 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  SS_SIZE,.       
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12250 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
12260 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20   bReset);.      
12270 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
12280 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65  >out, "Lookaside
12290 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f   failures due to
122a0 20 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e   size:      %d\n
122b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
122c0 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20   iHiwtr);.      
122d0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
122e0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
122f0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
12300 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20  MISS_FULL,.     
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
12330 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
12340 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12350 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69  g->out, "Lookasi
12360 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20  de failures due 
12370 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64  to OOM:       %d
12380 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12390 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
123a0 7d 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  }.    iHiwtr = i
123b0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
123c0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
123d0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
123e0 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
123f0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12400 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12410 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12420 74 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55  t, "Pager Heap U
12430 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
12440 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
12450 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
12460 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69    iCur);.    iHi
12470 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
12480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
12490 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
124a0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
124b0 5f 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48  _HIT, &iCur, &iH
124c0 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
124d0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
124e0 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
124f0 68 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20  hits:           
12500 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12510 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12520 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12530 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12540 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12550 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12560 4d 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48  MISS, &iCur, &iH
12570 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
12580 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12590 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
125a0 6d 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20  misses:         
125b0 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
125c0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
125d0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
125e0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
125f0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12600 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12610 57 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69  WRITE, &iCur, &i
12620 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
12630 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12640 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
12650 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
12660 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
12670 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
12680 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
12690 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
126a0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
126b0 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45  E_DBSTATUS_CACHE
126c0 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26  _SPILL, &iCur, &
126d0 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20  iHiwtr, 1);.    
126e0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
126f0 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68  >out, "Page cach
12700 65 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20  e spills:       
12710 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
12720 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48  ", iCur);.    iH
12730 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12750 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12760 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45  TE_DBSTATUS_SCHE
12770 4d 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MA_USED, &iCur, 
12780 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12790 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
127a0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68  (pArg->out, "Sch
127b0 65 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20  ema Heap Usage: 
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20    %d bytes\n",. 
127e0 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29             iCur)
127f0 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
12800 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
12810 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
12820 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
12830 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26  TUS_STMT_USED, &
12840 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12850 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12860 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12870 2c 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61  , "Statement Hea
12880 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67  p/Lookaside Usag
12890 65 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73  e:      %d bytes
128a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
128b0 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69   iCur);.  }..  i
128c0 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  f( pArg->pStmt )
128d0 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
128e0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
128f0 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
12900 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
12910 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20  FULLSCAN_STEP,. 
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
12940 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12950 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12960 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73   "Fullscan Steps
12970 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12980 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12990 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129b0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
129c0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
129d0 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29  US_SORT, bReset)
129e0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
129f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72  (pArg->out, "Sor
12a00 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  t Operations:   
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12a30 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
12a40 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
12a50 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
12a60 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
12a70 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b  TOINDEX,bReset);
12a80 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12a90 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f  pArg->out, "Auto
12aa0 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20  index Inserts:  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12ad0 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12ae0 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12af0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12b00 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
12b10 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20  STEP, bReset);. 
12b20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12b30 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61  rg->out, "Virtua
12b40 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a  l Machine Steps:
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12b60 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12b70 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12b80 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12b90 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12ba0 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45  STMTSTATUS_REPRE
12bb0 50 41 52 45 2c 20 62 52 65 73 65 74 29 3b 0a 20  PARE, bReset);. 
12bc0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12bd0 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70  rg->out, "Reprep
12be0 61 72 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20  are operations: 
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12c00 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12c10 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12c20 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12c30 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12c40 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20  STMTSTATUS_RUN, 
12c50 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12c60 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12c70 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69  t, "Number of ti
12c80 6d 65 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20  mes run:        
12c90 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12ca0 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12cb0 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12cc0 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12cd0 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12ce0 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52  ATUS_MEMUSED, bR
12cf0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12d00 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12d10 20 22 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79   "Memory used by
12d20 20 70 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20   prepared stmt: 
12d30 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12d40 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ur);.  }..#ifdef
12d50 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73   __linux__.  dis
12d60 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73  playLinuxIoStats
12d70 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e  (pArg->out);.#en
12d80 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  dif..  /* Do not
12d90 20 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63   remove this mac
12da0 68 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f  hine readable co
12db0 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61  mment: extra-sta
12dc0 74 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a  ts-output-here *
12dd0 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  /..  return 0;.}
12de0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
12df0 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73  scan stats..*/.s
12e00 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c  tatic void displ
12e10 61 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20  ay_scanstats(.  
12e20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
12e50 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53  uery */.  ShellS
12e60 74 61 74 65 20 2a 70 41 72 67 20 20 20 20 20 20  tate *pArg      
12e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
12e80 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
12e90 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  te */.){.#ifndef
12ea0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12eb0 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
12ec0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12ed0 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
12ee0 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b  PARAMETER(pArg);
12ef0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20  .#else.  int i, 
12f00 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f  k, n, mx;.  raw_
12f10 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12f20 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e  , "-------- scan
12f30 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  stats --------\n
12f40 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20  ");.  mx = 0;.  
12f50 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20  for(k=0; k<=mx; 
12f60 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  k++){.    double
12f70 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b   rEstLoop = 1.0;
12f80 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  .    for(i=n=0; 
12f90 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  1; i++){.      s
12fa0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d  qlite3_stmt *p =
12fb0 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20   pArg->pStmt;.  
12fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12fd0 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b  4 nLoop, nVisit;
12fe0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45  .      double rE
12ff0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  st;.      int iS
13000 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  id;.      const 
13010 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a  char *zExplain;.
13020 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13030 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
13040 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
13050 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28  CANSTAT_NLOOP, (
13060 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b  void*)&nLoop) ){
13070 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13090 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
130a0 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
130b0 54 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45  TE_SCANSTAT_SELE
130c0 43 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53  CTID, (void*)&iS
130d0 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  id);.      if( i
130e0 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53  Sid>mx ) mx = iS
130f0 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  id;.      if( iS
13100 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65  id!=k ) continue
13110 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
13120 20 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74   ){.        rEst
13130 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e  Loop = (double)n
13140 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66  Loop;.        if
13150 28 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( k>0 ) raw_prin
13160 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d  tf(pArg->out, "-
13170 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79  ------- subquery
13180 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20   %d -------\n", 
13190 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
131a0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c    n++;.      sql
131b0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
131c0 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
131d0 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49  E_SCANSTAT_NVISI
131e0 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69  T, (void*)&nVisi
131f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13200 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
13210 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
13220 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
13230 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
13240 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13250 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
13260 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
13270 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
13280 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
13290 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
132a0 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25  rg->out, "Loop %
132b0 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45  2d: %s\n", n, zE
132c0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72  xplain);.      r
132d0 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b  EstLoop *= rEst;
132e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
132f0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20  f(pArg->out,.   
13300 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20         "        
13310 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52   nLoop=%-8lld nR
13320 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77  ow=%-8lld estRow
13330 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c  =%-8lld estRow/L
13340 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20  oop=%-8g\n",.   
13350 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56         nLoop, nV
13360 69 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69  isit, (sqlite3_i
13370 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30  nt64)(rEstLoop+0
13380 2e 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20  .5), rEst.      
13390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
133a0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
133b0 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  out, "----------
133c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133d0 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  -\n");.#endif.}.
133e0 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
133f0 20 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20   azArray points 
13400 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  to a zero-termin
13410 61 74 65 64 20 61 72 72 61 79 20 6f 66 20 73 74  ated array of st
13420 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70  rings. zStr.** p
13430 6f 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c  oints to a singl
13440 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
13450 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20   string. Return 
13460 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72  non-zero if zStr
13470 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63  .** is equal, ac
13480 63 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d  cording to strcm
13490 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74  p(), to any of t
134a0 68 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68  he strings in th
134b0 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65  e array..** Othe
134c0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65  rwise, return ze
134d0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
134e0 74 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63  t str_in_array(c
134f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
13500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a   const char **az
13510 41 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b  Array){.  int i;
13520 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72  .  for(i=0; azAr
13530 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ray[i]; i++){.  
13540 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
13550 7a 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d  zStr, azArray[i]
13560 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
13570 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
13580 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*.** If compil
13590 65 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71  ed statement pSq
135a0 6c 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  l appears to be 
135b0 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
135c0 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a  ment, allocate.*
135d0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  * and populate t
135e0 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69  he ShellState.ai
135f0 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77  Indent[] array w
13600 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ith the number o
13610 66 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68  f.** spaces each
13620 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62   opcode should b
13630 65 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72  e indented befor
13640 65 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a  e it is output..
13650 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74  **.** The indent
13660 69 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a  ing rules are:.*
13670 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
13680 61 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65  ach "Next", "Pre
13690 76 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22  v", "VNext" or "
136a0 56 50 72 65 76 22 20 69 6e 73 74 72 75 63 74 69  VPrev" instructi
136b0 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20  on, indent.**   
136c0 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20      all opcodes 
136d0 74 68 61 74 20 6f 63 63 75 72 20 62 65 74 77 65  that occur betwe
136e0 65 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64  en the p2 jump d
136f0 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74  estination and t
13700 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20  he opcode.**    
13710 20 20 20 69 74 73 65 6c 66 20 62 79 20 32 20 73     itself by 2 s
13720 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  paces..**.**    
13730 20 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74   * For each "Got
13740 6f 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20  o", if the jump 
13750 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65  destination is e
13760 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72  arlier in the pr
13770 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61  ogram.**       a
13780 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f  nd ends on one o
13790 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59  f:.**          Y
137a0 69 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65  ield  SeekGt  Se
137b0 65 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64  ekLt  RowSetRead
137c0 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20    Rewind.**     
137d0 20 20 6f 72 20 69 66 20 74 68 65 20 50 31 20 70    or if the P1 p
137e0 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20  arameter is one 
137f0 69 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c  instead of zero,
13800 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69  .**       then i
13810 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65  ndent all opcode
13820 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 61  s between the ea
13830 72 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f  rlier instructio
13840 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22  n.**       and "
13850 47 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63 65  Goto" by 2 space
13860 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13870 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  d explain_data_p
13880 72 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74  repare(ShellStat
13890 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74  e *p, sqlite3_st
138a0 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e  mt *pSql){.  con
138b0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138d0 54 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  The text of the 
138e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
138f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13910 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68     /* Used to ch
13920 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
13930 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69  n EXPLAIN */.  i
13940 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b  nt *abYield = 0;
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13960 2a 20 54 72 75 65 20 69 66 20 6f 70 20 69 73 20  * True if op is 
13970 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20  an OP_Yield */. 
13980 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
139b0 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e  ze of p->aiInden
139c0 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a  t[], abYield */.
139d0 20 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20    int iOp;      
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70    /* Index of op
13a00 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69  eration in p->ai
13a10 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63  Indent[] */..  c
13a20 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78  onst char *azNex
13a30 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20  t[] = { "Next", 
13a40 22 50 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c  "Prev", "VPrev",
13a50 20 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65   "VNext", "Sorte
13a60 72 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63  rNext", 0 };.  c
13a70 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65  onst char *azYie
13a80 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22  ld[] = { "Yield"
13a90 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65  , "SeekLT", "See
13aa0 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61  kGT", "RowSetRea
13ab0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20  "Rewind", 0 };. 
13ae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47   const char *azG
13af0 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22  oto[] = { "Goto"
13b00 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79  , 0 };..  /* Try
13b10 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69   to figure out i
13b20 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79  f this is really
13b30 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74   an EXPLAIN stat
13b40 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20  ement. If this. 
13b50 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65   ** cannot be ve
13b60 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65  rified, return e
13b70 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20  arly.  */.  if( 
13b80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
13b90 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b  ount(pSql)!=8 ){
13ba0 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  .    p->cMode = 
13bb0 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74  p->mode;.    ret
13bc0 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20  urn;.  }.  zSql 
13bd0 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
13be0 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ql);.  if( zSql=
13bf0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
13c00 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27  or(z=zSql; *z=='
13c10 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c   ' || *z=='\t' |
13c20 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a  | *z=='\n' || *z
13c30 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\f' || *z=='\
13c40 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20  r'; z++);.  if( 
13c50 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
13c60 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37  (z, "explain", 7
13c70 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64  ) ){.    p->cMod
13c80 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
13c90 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
13ca0 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54  for(iOp=0; SQLIT
13cb0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
13cc0 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b  tep(pSql); iOp++
13cd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
13ce0 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
13cf0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
13d00 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63  (pSql, 0);.    c
13d10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d  onst char *zOp =
13d20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
13d30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13d40 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20  t(pSql, 1);..   
13d50 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68   /* Set p2 to th
13d60 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68  e P2 field of th
13d70 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65  e current opcode
13d80 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67  . Then, assuming
13d90 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20   that.    ** p2 
13da0 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  is an instructio
13db0 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76  n address, set v
13dc0 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20  ariable p2op to 
13dd0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
13de0 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63  t.    ** instruc
13df0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e  tion in the aiIn
13e00 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32  dent[] array. p2
13e10 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65   and p2op may be
13e20 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20   different if.  
13e30 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
13e40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
13e50 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72  part of a sub-pr
13e60 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20  ogram generated 
13e70 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  by an.    ** SQL
13e80 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65   trigger or fore
13e90 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20  ign key.  */.   
13ea0 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65   int p2 = sqlite
13eb0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
13ec0 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70  l, 3);.    int p
13ed0 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70  2op = (p2 + (iOp
13ee0 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f  -iAddr));..    /
13ef0 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69  * Grow the p->ai
13f00 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20  Indent array as 
13f10 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
13f20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20  if( iOp>=nAlloc 
13f30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70  ){.      if( iOp
13f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
13f50 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72  * Do further ver
13f60 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68  fication that th
13f70 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75  is is explain ou
13f80 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a  tput.  Abort if.
13f90 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73          ** it is
13fa0 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20   not */.        
13fb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
13fc0 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d  r *explainCols[]
13fd0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
13fe0 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22  "addr", "opcode"
13ff0 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70  , "p1", "p2", "p
14000 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20  3", "p4", "p5", 
14010 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20  "comment" };.   
14020 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20       int jj;.   
14030 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
14040 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c  j<ArraySize(expl
14050 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b  ainCols); jj++){
14060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
14070 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f  trcmp(sqlite3_co
14080 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a  lumn_name(pSql,j
14090 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a  j),explainCols[j
140a0 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  j])!=0 ){.      
140b0 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d        p->cMode =
140c0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
140d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
140e0 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20  set(pSql);.     
140f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
14100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14110 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14120 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30     nAlloc += 100
14130 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64  ;.      p->aiInd
14140 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  ent = (int*)sqli
14150 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d  te3_realloc64(p-
14160 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f  >aiIndent, nAllo
14170 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
14180 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49        if( p->aiI
14190 6e 64 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c  ndent==0 ) shell
141a0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
141b0 3b 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20  ;.      abYield 
141c0 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
141d0 72 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c  realloc64(abYiel
141e0 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  d, nAlloc*sizeof
141f0 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66  (int));.      if
14200 28 20 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73  ( abYield==0 ) s
14210 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
14220 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry();.    }.    
14230 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73  abYield[iOp] = s
14240 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
14250 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70   azYield);.    p
14260 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20  ->aiIndent[iOp] 
14270 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64  = 0;.    p->nInd
14280 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20  ent = iOp+1;..  
14290 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72    if( str_in_arr
142a0 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20  ay(zOp, azNext) 
142b0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ){.      for(i=p
142c0 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29  2op; i<iOp; i++)
142d0 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20   p->aiIndent[i] 
142e0 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  += 2;.    }.    
142f0 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
14300 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26  (zOp, azGoto) &&
14310 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74   p2op<p->nIndent
14320 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c  .     && (abYiel
14330 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74  d[p2op] || sqlit
14340 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
14350 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20  ql, 2)).    ){. 
14360 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b       for(i=p2op;
14370 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e   i<iOp; i++) p->
14380 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32  aiIndent[i] += 2
14390 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
143a0 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->iIndent = 0;. 
143b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62   sqlite3_free(ab
143c0 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65  Yield);.  sqlite
143d0 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d  3_reset(pSql);.}
143e0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
143f0 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64   array allocated
14400 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61   by explain_data
14410 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73  _prepare()..*/.s
14420 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
14430 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53  in_data_delete(S
14440 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
14450 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
14460 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d  >aiIndent);.  p-
14470 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  >aiIndent = 0;. 
14480 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b   p->nIndent = 0;
14490 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20  .  p->iIndent = 
144a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  0;.}../*.** Disa
144b0 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20  ble and restore 
144c0 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20  .wheretrace and 
144d0 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74  .selecttrace set
144e0 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  tings..*/.#if de
144f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14500 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14510 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14520 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ECTTRACE).extern
14530 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65   int sqlite3Sele
14540 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  ctTrace;.static 
14550 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54  int savedSelectT
14560 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
14570 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14580 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65  DEBUG) && define
14590 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
145a0 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65  WHERETRACE).exte
145b0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
145c0 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ereTrace;.static
145d0 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54   int savedWhereT
145e0 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61  race;.#endif.sta
145f0 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
14600 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
14610 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
14620 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14630 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
14640 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
14650 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65  ECTTRACE).  save
14660 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  dSelectTrace = s
14670 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
14680 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  e;.  sqlite3Sele
14690 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  ctTrace = 0;.#en
146a0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
146b0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
146c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
146d0 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
146e0 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54  E).  savedWhereT
146f0 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68  race = sqlite3Wh
14700 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69  ereTrace;.  sqli
14710 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
14720 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74  0;.#endif.}.stat
14730 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f  ic void restore_
14740 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
14750 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
14760 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
14770 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
14780 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
14790 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  CTTRACE).  sqlit
147a0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
147b0 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65  savedSelectTrace
147c0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
147d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
147e0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
147f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
14800 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  ETRACE).  sqlite
14810 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61  3WhereTrace = sa
14820 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23  vedWhereTrace;.#
14830 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61  endif.}../* Crea
14840 74 65 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c  te the TEMP tabl
14850 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  e used to store 
14860 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  parameter bindin
14870 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  gs */.static voi
14880 64 20 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69  d bind_table_ini
14890 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
148a0 7b 0a 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61  {.  int wrSchema
148b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
148c0 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c  db_config(p->db,
148d0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
148e0 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
148f0 2c 20 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29  , -1, &wrSchema)
14900 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  ;.  sqlite3_db_c
14910 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c  onfig(p->db, SQL
14920 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
14930 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c  TABLE_SCHEMA, 1,
14940 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65   0);.  sqlite3_e
14950 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22  xec(p->db,.    "
14960 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
14970 4e 4f 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e  NOT EXISTS temp.
14980 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72  sqlite_parameter
14990 73 28 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79  s(\n".    "  key
149a0 20 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45   TEXT PRIMARY KE
149b0 59 2c 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c  Y,\n".    "  val
149c0 75 65 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29  ue ANY\n".    ")
149d0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22   WITHOUT ROWID;"
149e0 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a  ,.    0, 0, 0);.
149f0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
14a00 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  fig(p->db, SQLIT
14a10 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41  E_DBCONFIG_WRITA
14a20 42 4c 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63  BLE_SCHEMA, wrSc
14a30 68 65 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  hema, 0);.}../*.
14a40 2a 2a 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65  ** Bind paramete
14a50 72 73 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64  rs on a prepared
14a60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
14a70 2a 20 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64  * Parameter bind
14a80 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
14a90 72 6f 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65  rom a TEMP table
14aa0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
14ab0 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 45  .**    CREATE TE
14ac0 4d 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f  MP TABLE sqlite_
14ad0 70 61 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54  parameters(key T
14ae0 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14af0 20 76 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49   value).**    WI
14b00 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
14b10 2a 2a 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f  ** No bindings o
14b20 63 63 75 72 20 69 66 20 74 68 69 73 20 74 61 62  ccur if this tab
14b30 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
14b40 74 2e 20 20 54 68 65 20 73 70 65 63 69 61 6c 20  t.  The special 
14b50 63 68 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a  character '$'.**
14b60 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
14b70 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
14b80 6f 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63  o help prevent c
14b90 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61  ollisions with a
14ba0 63 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  ctual tables..**
14bb0 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
14bc0 62 65 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73  be in the TEMP s
14bd0 63 68 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  chema..*/.static
14be0 20 76 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61   void bind_prepa
14bf0 72 65 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74  red_stmt(ShellSt
14c00 61 74 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74  ate *pArg, sqlit
14c10 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
14c20 0a 20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69  .  int nVar;.  i
14c30 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
14c40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14c50 70 51 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20  pQ = 0;..  nVar 
14c60 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14c70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
14c80 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61  Stmt);.  if( nVa
14c90 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  r==0 ) return;  
14ca0 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* Nothing to do
14cb0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14cc0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14cd0 65 74 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62  etadata(pArg->db
14ce0 2c 20 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74  , "TEMP", "sqlit
14cf0 65 5f 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20  e_parameters",. 
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20     "key", 0, 0, 
14d30 30 2c 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45  0, 0, 0)!=SQLITE
14d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
14d50 6e 3b 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20  n; /* Parameter 
14d60 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  table does not e
14d70 78 69 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63  xist */.  }.  rc
14d80 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
14d90 72 65 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a  re_v2(pArg->db,.
14da0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
14db0 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d  T value FROM tem
14dc0 70 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74  p.sqlite_paramet
14dd0 65 72 73 22 0a 20 20 20 20 20 20 20 20 20 20 22  ers".          "
14de0 20 57 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20   WHERE key=?1", 
14df0 2d 31 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69  -1, &pQ, 0);.  i
14e00 66 28 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29  f( rc || pQ==0 )
14e10 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14e20 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b  =1; i<=nVar; i++
14e30 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d  ){.    char zNum
14e40 5b 33 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  [30];.    const 
14e50 63 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c  char *zVar = sql
14e60 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
14e70 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  ter_name(pStmt, 
14e80 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72  i);.    if( zVar
14e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14ea0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
14eb0 7a 65 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c  zeof(zNum),zNum,
14ec0 22 3f 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20  "?%d",i);.      
14ed0 7a 56 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20  zVar = zNum;.   
14ee0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
14ef0 69 6e 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20  ind_text(pQ, 1, 
14f00 7a 56 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zVar, -1, SQLITE
14f10 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66  _STATIC);.    if
14f20 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
14f30 51 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  Q)==SQLITE_ROW )
14f40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14f50 62 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74  bind_value(pStmt
14f60 2c 20 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  , i, sqlite3_col
14f70 75 6d 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29  umn_value(pQ, 0)
14f80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14f90 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
14fa0 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
14fb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14fc0 65 33 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20  e3_reset(pQ);.  
14fd0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
14fe0 6c 69 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a  lize(pQ);.}../*.
14ff0 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72 65  ** Run a prepare
15000 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73  d statement.*/.s
15010 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f  tatic void exec_
15020 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20  prepared_stmt(. 
15030 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
15040 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
15070 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
15080 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15090 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20   /* Statment to 
150c0 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  run */.){.  int 
150d0 72 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72  rc;..  /* perfor
150e0 6d 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  m the first step
150f0 2e 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c  .  this will tel
15100 6c 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20  l us if we.  ** 
15110 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
15120 74 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77  t or not and how
15130 20 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a   wide it is..  *
15140 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
15150 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
15160 2f 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20  /* if we have a 
15170 72 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f  result set... */
15180 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f  .  if( SQLITE_RO
15190 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f  W == rc ){.    /
151a0 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
151b0 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
151c0 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
151d0 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e  d type */.    in
151e0 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
151f0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
15200 74 6d 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a  tmt);.    void *
15210 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
15220 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a  malloc64(3*nCol*
15230 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61  sizeof(const cha
15240 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66  r*) + 1);.    if
15250 28 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20  ( !pData ){.    
15260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15270 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
15280 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43        char **azC
15290 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70  ols = (char **)p
152a0 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61  Data;      /* Na
152b0 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  mes of result co
152c0 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63  lumns */.      c
152d0 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
152e0 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
152f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
15300 2f 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54  /.      int *aiT
15310 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
15320 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
15330 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
15340 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a        int i, x;.
15350 20 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a        assert(siz
15360 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65  eof(int) <= size
15370 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20  of(char *));.   
15380 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70     /* save off p
15390 74 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61  trs to column na
153a0 6d 65 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  mes */.      for
153b0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
153c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f  +){.        azCo
153d0 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
153e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
153f0 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
15400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b       }.      do{
15410 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72  .        /* extr
15420 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
15430 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
15440 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15450 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
15460 20 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b          aiTypes[
15470 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33  i] = x = sqlite3
15480 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
15490 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
154a0 20 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f    if( x==SQLITE_
154b0 42 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20  BLOB && pArg && 
154c0 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
154d0 45 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20  E_Insert ){.    
154e0 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69          azVals[i
154f0 5d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  ] = "";.        
15500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15510 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d       azVals[i] =
15520 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
15530 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
15540 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
15550 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
15560 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
15570 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
15580 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
15590 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
155a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
155b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a         break; /*
155c0 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20   from for */.   
155d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
155e0 20 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f   } /* end for */
155f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20  ..        /* if 
15600 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
15610 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
15620 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
15630 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52      if( SQLITE_R
15640 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20  OW == rc ){.    
15650 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68        /* call th
15660 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
15670 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73  ack with the res
15680 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a  ult row data */.
15690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68            if( sh
156a0 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72  ell_callback(pAr
156b0 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c  g, nCol, azVals,
156c0 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73   azCols, aiTypes
156d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
156e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f   rc = SQLITE_ABO
156f0 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  RT;.          }e
15700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
15710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
15720 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
15730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15740 0a 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20  .      } while( 
15750 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
15760 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
15770 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
15780 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
15790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
157a0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
157b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
157c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
157d0 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
157e0 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
157f0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
15800 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
15810 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
15820 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
15830 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
15840 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
15850 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
15860 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
15870 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15880 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
15890 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
158a0 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
158b0 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
158c0 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
158d0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
158e0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
158f0 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
15900 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
15910 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
15920 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
15930 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
15940 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
15950 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
15960 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
15970 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
15980 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
15990 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
159a0 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
159b0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
159c0 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
159d0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
159e0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
159f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
15a00 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
15a10 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
15a20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
15a30 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
15a40 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
15a50 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
15a60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15a70 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
15a80 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
15a90 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
15aa0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
15ab0 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
15ac0 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
15ad0 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
15ae0 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
15af0 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
15b00 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
15b10 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
15b20 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
15b30 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
15b40 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15b50 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
15b60 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
15b70 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
15b80 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
15b90 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15ba0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15bb0 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15bc0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
15bd0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
15be0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15bf0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
15c00 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
15c10 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
15c20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
15c30 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15c40 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
15c50 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
15c60 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
15c70 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
15c80 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
15c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15ca0 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
15cb0 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
15cc0 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
15cd0 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
15ce0 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
15cf0 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
15d00 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
15d10 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
15d20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
15d30 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
15d40 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
15d50 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
15d60 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
15d70 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15d80 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
15d90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15db0 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
15dc0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
15dd0 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
15de0 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
15df0 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
15e00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15e10 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
15e20 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
15e30 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
15e40 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
15e50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15e60 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
15e70 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
15e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e90 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
15ea0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
15eb0 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
15ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15ed0 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
15ee0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
15ef0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
15f00 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
15f10 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
15f20 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
15f30 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15f40 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
15f50 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
15f60 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
15f70 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
15f80 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15f90 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
15fa0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
15fb0 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
15fc0 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
15fd0 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
15fe0 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
15ff0 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
16000 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
16010 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
16020 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
16030 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
16040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
16060 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
16070 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
16080 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
16090 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
160a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
160b0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
160c0 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
160d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
160e0 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
160f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
16100 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
16110 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
16120 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
16130 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
16140 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
16150 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
16160 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f  ".expert" dot co
16170 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
16180 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f   int expertDotCo
16190 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
161a0 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
161b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
161c0 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
161d0 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
161e0 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
161f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
16200 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
16210 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
16220 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
16230 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
16240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16250 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
16260 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
16270 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16280 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
16290 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
162a0 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20  ;.  int iSample 
162b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
162c0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
162d0 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d  Expert==0 );.  m
162e0 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65  emset(&pState->e
162f0 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  xpert, 0, sizeof
16300 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a  (ExpertInfo));..
16310 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
16320 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
16330 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rg; i++){.    ch
16340 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
16350 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
16360 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
16370 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
16380 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  +;.    n = strle
16390 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
163a0 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63  n>=2 && 0==strnc
163b0 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22  mp(z, "-verbose"
163c0 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53  , n) ){.      pS
163d0 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
163e0 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
163f0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
16400 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
16410 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e  (z, "-sample", n
16420 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
16430 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  ==(nArg-1) ){.  
16440 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
16450 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e  (stderr, "option
16460 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
16470 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29  ument: %s\n", z)
16480 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
16490 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
164a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
164b0 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74    iSample = (int
164c0 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
164d0 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  Arg[++i]);.     
164e0 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30     if( iSample<0
164f0 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20   || iSample>100 
16500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
16510 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
16520 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61  "value out of ra
16530 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  nge: %s\n", azAr
16540 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
16550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
16560 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
16570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16580 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
16590 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
165a0 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
165b0 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
165c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
165d0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
165e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
165f0 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65  OK ){.    pState
16600 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16610 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
16620 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62  t_new(pState->db
16630 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
16640 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
16650 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20  .pExpert==0 ){. 
16660 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
16670 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33  stderr, "sqlite3
16680 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c  _expert_new: %s\
16690 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
166a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
166b0 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
166c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
166d0 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20  ert_config(.    
166e0 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
166f0 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58  pert.pExpert, EX
16700 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50  PERT_CONFIG_SAMP
16710 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20  LE, iSample.    
16720 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
16730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16740 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
16750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
16760 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
16770 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61  ** Execute a sta
16780 74 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66  tement or set of
16790 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72   statements.  Pr
167a0 69 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c  int.** any resul
167b0 74 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64  t rows/columns d
167c0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
167d0 63 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20  current mode.** 
167e0 73 65 74 20 76 69 61 20 74 68 65 20 73 75 70 70  set via the supp
167f0 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  lied callback..*
16800 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72  *.** This is ver
16810 79 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c  y similar to SQL
16820 69 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73  ite's built-in s
16830 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a  qlite3_exec().**
16840 20 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74   function except
16850 20 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67   it takes a slig
16860 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63  htly different c
16870 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63  allback.** and c
16880 61 6c 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67  allback data arg
16890 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
168a0 20 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28   int shell_exec(
168b0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
168c0 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
168e0 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
168f0 53 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  State */.  const
16900 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
16930 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
16940 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
16970 72 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20  ror msg written 
16980 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
16990 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
169a0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20   = NULL;     /* 
169b0 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  Statement to exe
169c0 63 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  cute. */.  int r
169d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
169e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
169f0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
16a00 6e 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20  nt rc2;.  const 
16a10 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b  char *zLeftover;
16a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69            /* Tai
16a30 6c 20 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64  l of unprocessed
16a40 20 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65   SQL */.  sqlite
16a50 33 20 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62  3 *db = pArg->db
16a60 3b 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73  ;..  if( pzErrMs
16a70 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  g ){.    *pzErrM
16a80 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a  sg = NULL;.  }..
16a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16aa0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16ab0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70  .  if( pArg->exp
16ac0 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
16ad0 20 20 20 72 63 20 3d 20 65 78 70 65 72 74 48 61     rc = expertHa
16ae0 6e 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53  ndleSQL(pArg, zS
16af0 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, pzErrMsg);. 
16b00 20 20 20 72 65 74 75 72 6e 20 65 78 70 65 72 74     return expert
16b10 46 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63  Finish(pArg, (rc
16b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a  !=SQLITE_OK), pz
16b30 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e  ErrMsg);.  }.#en
16b40 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53  dif..  while( zS
16b50 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45  ql[0] && (SQLITE
16b60 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20  _OK == rc) ){.  
16b70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
16b80 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20  har *zStmtSql;. 
16b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
16ba0 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
16bb0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
16bc0 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20   &zLeftover);.  
16bd0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20    if( SQLITE_OK 
16be0 21 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  != rc ){.      i
16bf0 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
16c00 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
16c10 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28   = save_err_msg(
16c20 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
16c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
16c40 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  ( !pStmt ){.    
16c50 20 20 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70      /* this happ
16c60 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e  ens for a commen
16c70 74 20 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65  t or white-space
16c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c   */.        zSql
16c90 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20   = zLeftover;.  
16ca0 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53        while( IsS
16cb0 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20  pace(zSql[0]) ) 
16cc0 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zSql++;.        
16cd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16ce0 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c  }.      zStmtSql
16cf0 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
16d00 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
16d10 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a   zStmtSql==0 ) z
16d20 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20  StmtSql = "";.  
16d30 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
16d40 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20  ce(zStmtSql[0]) 
16d50 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20  ) zStmtSql++;.. 
16d60 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66       /* save off
16d70 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
16d80 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e  atment handle an
16d90 64 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e  d reset row coun
16da0 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
16db0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Arg ){.        p
16dc0 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74  Arg->pStmt = pSt
16dd0 6d 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67  mt;.        pArg
16de0 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->cnt = 0;.     
16df0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68   }..      /* ech
16e00 6f 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  o the sql statem
16e10 65 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a  ent if echo on *
16e20 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
16e30 20 26 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67   && ShellHasFlag
16e40 28 70 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68  (pArg, SHFLG_Ech
16e50 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  o) ){.        ut
16e60 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  f8_printf(pArg->
16e70 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74  out, "%s\n", zSt
16e80 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c  mtSql ? zStmtSql
16e90 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20   : zSql);.      
16ea0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77  }..      /* Show
16eb0 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
16ec0 52 59 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20  RY PLAN if .eqp 
16ed0 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  is on */.      i
16ee0 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
16ef0 3e 61 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69  >autoEQP && sqli
16f00 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
16f10 69 6e 28 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a  in(pStmt)==0 ){.
16f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16f30 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a  stmt *pExplain;.
16f40 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
16f50 51 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  QP;.        int 
16f60 74 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a  triggerEQP = 0;.
16f70 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f          disable_
16f80 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
16f90 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s();.        sql
16fa0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
16fb0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
16fc0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
16fd0 2d 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29  -1, &triggerEQP)
16fe0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
16ff0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
17000 4f 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a  OEQP_trigger ){.
17010 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17020 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
17030 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
17040 54 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20  TRIGGER_EQP, 1, 
17050 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
17060 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
17070 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
17080 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
17090 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b   %s", zStmtSql);
170a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
170b0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
170c0 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
170d0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
170e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
170f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17100 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
17110 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
17120 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  n)==SQLITE_ROW )
17130 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
17140 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 4c 69  nst char *zEQPLi
17150 6e 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ne = (const char
17160 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
17170 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 33  _text(pExplain,3
17180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
17190 6e 74 20 69 45 71 70 49 64 20 3d 20 73 71 6c 69  nt iEqpId = sqli
171a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
171b0 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
171c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61           int iPa
171d0 72 65 6e 74 49 64 20 3d 20 73 71 6c 69 74 65 33  rentId = sqlite3
171e0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
171f0 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  lain, 1);.      
17200 20 20 20 20 20 20 69 66 28 20 7a 45 51 50 4c 69        if( zEQPLi
17210 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70  ne[0]=='-' ) eqp
17220 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20  _render(pArg);. 
17230 20 20 20 20 20 20 20 20 20 20 20 65 71 70 5f 61             eqp_a
17240 70 70 65 6e 64 28 70 41 72 67 2c 20 69 45 71 70  ppend(pArg, iEqp
17250 49 64 2c 20 69 50 61 72 65 6e 74 49 64 2c 20 7a  Id, iParentId, z
17260 45 51 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  EQPLine);.      
17270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17280 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29  eqp_render(pArg)
17290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
172a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
172b0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
172c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
172d0 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
172e0 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75      if( pArg->au
172f0 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66  toEQP>=AUTOEQP_f
17300 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ull ){.         
17310 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45   /* Also do an E
17320 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70  XPLAIN for ".eqp
17330 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20   full" mode */. 
17340 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20           zEQP = 
17350 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
17360 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53  "EXPLAIN %s", zS
17370 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  tmtSql);.       
17380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
17390 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
173a0 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
173b0 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  in, 0);.        
173c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
173d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
173e0 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d     pArg->cMode =
173f0 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20   MODE_Explain;. 
17400 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
17410 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28  in_data_prepare(
17420 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b  pArg, pExplain);
17430 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65  .            exe
17440 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  c_prepared_stmt(
17450 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b  pArg, pExplain);
17460 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70  .            exp
17470 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65  lain_data_delete
17480 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  (pArg);.        
17490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
174a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
174b0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
174c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
174d0 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20  (zEQP);.        
174e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  }.        if( pA
174f0 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
17500 4f 45 51 50 5f 74 72 69 67 67 65 72 20 26 26 20  OEQP_trigger && 
17510 74 72 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b  triggerEQP==0 ){
17520 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17530 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
17540 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
17550 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c  _TRIGGER_EQP, 0,
17560 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f   0);.          /
17570 2a 20 52 65 70 72 65 70 61 72 65 20 70 53 74 6d  * Reprepare pStm
17580 74 20 62 65 66 6f 72 65 20 72 65 61 63 74 69 76  t before reactiv
17590 69 6e 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20  ing trace modes 
175a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
175b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
175c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
175d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
175e0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
175f0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
17600 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20         if( pArg 
17610 29 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20  ) pArg->pStmt = 
17620 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  pStmt;.        }
17630 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65  .        restore
17640 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
17650 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  es();.      }.. 
17660 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
17670 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63  .        pArg->c
17680 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64  Mode = pArg->mod
17690 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
176a0 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e  Arg->autoExplain
176b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
176c0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69  ( sqlite3_stmt_i
176d0 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d  sexplain(pStmt)=
176e0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
176f0 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
17700 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
17710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17720 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
17730 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70  stmt_isexplain(p
17740 53 74 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20  Stmt)==2 ){.    
17750 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
17760 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a  ode = MODE_EQP;.
17770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17780 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
17790 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69  * If the shell i
177a0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22  s currently in "
177b0 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20  .explain" mode, 
177c0 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61  gather the extra
177d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
177e0 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64   required to add
177f0 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20   indents to the 
17800 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20  output.*/.      
17810 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64    if( pArg->cMod
17820 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
17830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
17840 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
17850 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  e(pArg, pStmt);.
17860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17870 7d 0a 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72  }..      bind_pr
17880 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67  epared_stmt(pArg
17890 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
178a0 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74  exec_prepared_st
178b0 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b  mt(pArg, pStmt);
178c0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64  .      explain_d
178d0 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29  ata_delete(pArg)
178e0 3b 0a 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64  ;.      eqp_rend
178f0 65 72 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20  er(pArg);..     
17900 20 2f 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20   /* print usage 
17910 73 74 61 74 73 20 69 66 20 73 74 61 74 73 20 6f  stats if stats o
17920 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
17930 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61  Arg && pArg->sta
17940 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tsOn ){.        
17950 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62  display_stats(db
17960 2c 20 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20  , pArg, 0);.    
17970 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72    }..      /* pr
17980 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72  int loop-counter
17990 73 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  s if required */
179a0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
179b0 26 26 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61  && pArg->scansta
179c0 74 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tsOn ){.        
179d0 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74  display_scanstat
179e0 73 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20  s(db, pArg);.   
179f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
17a00 69 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74  inalize the stat
17a10 65 6d 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75  ement just execu
17a20 74 65 64 2e 20 49 66 20 74 68 69 73 20 66 61 69  ted. If this fai
17a30 6c 73 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20  ls, save a.     
17a40 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
17a50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f  error message. O
17a60 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53  therwise, set zS
17a70 71 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ql to point to t
17a80 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  he.      ** next
17a90 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78   statement to ex
17aa0 65 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  ecute. */.      
17ab0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
17ac0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
17ad0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17ae0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d  ITE_NOMEM ) rc =
17af0 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20   rc2;.      if( 
17b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17b10 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
17b20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20  zLeftover;.     
17b30 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
17b40 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71  e(zSql[0]) ) zSq
17b50 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  l++;.      }else
17b60 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
17b70 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d  .        *pzErrM
17b80 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73  sg = save_err_ms
17b90 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  g(db);.      }..
17ba0 20 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73        /* clear s
17bb0 61 76 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65  aved stmt handle
17bc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
17bd0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
17be0 72 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c  rg->pStmt = NULL
17bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17c00 20 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65    } /* end while
17c10 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   */..  return rc
17c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
17c30 73 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f  se memory previo
17c40 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
17c50 79 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73  y tableColumnLis
17c60 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
17c70 6f 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69  oid freeColumnLi
17c80 73 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  st(char **azCol)
17c90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
17ca0 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20  (i=1; azCol[i]; 
17cb0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
17cc0 33 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29  3_free(azCol[i])
17cd0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c  ;.  }.  /* azCol
17ce0 5b 30 5d 20 69 73 20 61 20 73 74 61 74 69 63 20  [0] is a static 
17cf0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69  string */.  sqli
17d00 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b  te3_free(azCol);
17d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17d20 20 61 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74   a list of point
17d30 65 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77  ers to strings w
17d40 68 69 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d  hich are the nam
17d50 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c  es of all.** col
17d60 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54  umns in table zT
17d70 61 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79  ab.   The memory
17d80 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
17d90 65 73 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c  es is dynamicall
17da0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  y.** allocated a
17db0 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61  nd must be relea
17dc0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
17dd0 72 20 75 73 69 6e 67 20 61 20 73 75 62 73 65 71  r using a subseq
17de0 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
17df0 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29  freeColumnList()
17e00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f  ..**.** The azCo
17e10 6c 5b 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73  l[0] entry is us
17e20 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77  ually NULL.  How
17e30 65 76 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f  ever, if zTab co
17e40 6e 74 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a  ntains a rowid.*
17e50 2a 20 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65  * value that nee
17e60 64 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  ds to be preserv
17e70 65 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30  ed, then azCol[0
17e80 5d 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  ] is filled in w
17e90 69 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20  ith the.** name 
17ea0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c  of the rowid col
17eb0 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  umn..**.** The f
17ec0 69 72 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c  irst regular col
17ed0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
17ee0 20 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54   is azCol[1].  T
17ef0 68 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69  he list is termi
17f00 6e 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65  nated.** by an e
17f10 6e 74 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b  ntry with azCol[
17f20 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  i]==0..*/.static
17f30 20 63 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c   char **tableCol
17f40 75 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61  umnList(ShellSta
17f50 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
17f60 72 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72  r *zTab){.  char
17f70 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20   **azCol = 0;.  
17f80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
17f90 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  tmt;.  char *zSq
17fa0 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  l;.  int nCol = 
17fb0 30 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  0;.  int nAlloc 
17fc0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d  = 0;.  int nPK =
17fd0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
17fe0 62 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b  ber of PRIMARY K
17ff0 45 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20  EY columns seen 
18000 2a 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d  */.  int isIPK =
18010 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
18020 69 66 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b  if one PRIMARY K
18030 45 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70  EY column of typ
18040 65 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69  e INTEGER */.  i
18050 6e 74 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  nt preserveRowid
18060 20 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28   = ShellHasFlag(
18070 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76  p, SHFLG_Preserv
18080 65 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72  eRowid);.  int r
18090 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  c;..  zSql = sql
180a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
180b0 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d  AGMA table_info=
180c0 25 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63  %Q", zTab);.  rc
180d0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
180e0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
180f0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
18100 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18110 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
18120 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  c ) return 0;.  
18130 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
18140 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
18150 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66  TE_ROW ){.    if
18160 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32  ( nCol>=nAlloc-2
18170 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63   ){.      nAlloc
18180 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43   = nAlloc*2 + nC
18190 6f 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61  ol + 10;.      a
181a0 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72  zCol = sqlite3_r
181b0 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41  ealloc(azCol, nA
181c0 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f  lloc*sizeof(azCo
181d0 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  l[0]));.      if
181e0 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65  ( azCol==0 ) she
181f0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
18200 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a  ();.    }.    az
18210 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71  Col[++nCol] = sq
18220 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
18230 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s", sqlite3_colu
18240 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
18250 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ));.    if( sqli
18260 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
18270 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20  Stmt, 5) ){.    
18280 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69    nPK++;.      i
18290 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20  f( nPK==1.      
182a0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
182b0 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp((const char*
182c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
182d0 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20  text(pStmt,2),. 
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 20 20 20 20 20 20 22 49 4e 54 45 47 45           "INTEGE
18300 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  R")==0.      ){.
18310 20 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20          isIPK = 
18320 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18330 20 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20          isIPK = 
18340 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
18350 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
18360 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
18370 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
18380 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43   return 0;.  azC
18390 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43  ol[0] = 0;.  azC
183a0 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a  ol[nCol+1] = 0;.
183b0 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69  .  /* The decisi
183c0 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  on of whether or
183d0 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61   not a rowid rea
183e0 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  lly needs to be 
183f0 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69  preserved.  ** i
18400 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65  s tricky.  We ne
18410 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73  ver need to pres
18420 65 72 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72  erve a rowid for
18430 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
18440 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61   table.  ** or a
18450 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49   table with an I
18460 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18470 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62  EY.  We are unab
18480 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20  le to preserve. 
18490 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61   ** rowids on ta
184a0 62 6c 65 73 20 77 68 65 72 65 20 74 68 65 20 72  bles where the r
184b0 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65 73 73  owid is inaccess
184c0 69 62 6c 65 20 62 65 63 61 75 73 65 20 74 68 65  ible because the
184d0 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a  re are other.  *
184e0 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * columns in the
184f0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f   table named "ro
18500 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c  wid", "_rowid_",
18510 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f   and "oid"..  */
18520 0a 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52  .  if( preserveR
18530 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b  owid && isIPK ){
18540 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e  .    /* If a sin
18550 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  gle PRIMARY KEY 
18560 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65  column with type
18570 20 49 4e 54 45 47 45 52 20 77 61 73 20 73 65 65   INTEGER was see
18580 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  n, then it.    *
18590 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c  * might be an al
185a0 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49  ise for the ROWI
185b0 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67 68 74  D.  But it might
185c0 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f   also be a WITHO
185d0 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20  UT ROWID.    ** 
185e0 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47  table or a INTEG
185f0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44  ER PRIMARY KEY D
18600 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74  ESC column, neit
18610 68 65 72 20 6f 66 20 77 68 69 63 68 20 61 72 65  her of which are
18620 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c  .    ** ROWID al
18630 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69  iases.  To disti
18640 6e 67 75 69 73 68 20 74 68 65 73 65 20 63 61 73  nguish these cas
18650 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  es, check to see
18660 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65   if.    ** there
18670 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79   is a "pk" entry
18680 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65   in "PRAGMA inde
18690 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20  x_list".  There 
186a0 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e  will be.    ** n
186b0 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20  o "pk" index if 
186c0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
186d0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69  really is an ali
186e0 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44  as for the ROWID
186f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71  ..    */.    zSq
18700 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
18710 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20 46 52  ntf("SELECT 1 FR
18720 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f  OM pragma_index_
18730 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20 20 20  list(%Q)".      
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 72 69       " WHERE ori
18760 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29  gin='pk'", zTab)
18770 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18780 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
18790 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
187a0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73  pStmt, 0);.    s
187b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
187c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
187d0 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d  .      freeColum
187e0 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20  nList(azCol);.  
187f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18800 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
18810 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
18830 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
18840 20 20 20 70 72 65 73 65 72 76 65 52 6f 77 69 64     preserveRowid
18850 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f   = rc==SQLITE_RO
18860 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65  W;.  }.  if( pre
18870 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20  serveRowid ){.  
18880 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72    /* Only preser
18890 76 65 20 74 68 65 20 72 6f 77 69 64 20 69 66 20  ve the rowid if 
188a0 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61  we can find a na
188b0 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  me to use for th
188c0 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a  e.    ** rowid *
188d0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61  /.    static cha
188e0 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b  r *azRowid[] = {
188f0 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
18900 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20  d_", "oid" };.  
18910 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
18920 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
18930 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  +){.      for(i=
18940 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29  1; i<=nCol; i++)
18950 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
18960 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a  lite3_stricmp(az
18970 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69  Rowid[j],azCol[i
18980 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ])==0 ) break;. 
18990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
189a0 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20   i>nCol ){.     
189b0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
189c0 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61  int, we know tha
189d0 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20  t azRowid[j] is 
189e0 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
189f0 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  any.        ** o
18a00 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69  rdinary column i
18a10 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65  n the table.  Ve
18a20 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69  rify that azRowi
18a30 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a  d[j] is a valid.
18a40 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20          ** name 
18a50 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20 62 65  for the rowid be
18a60 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74 20 74  fore adding it t
18a70 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54  o azCol[0].  WIT
18a80 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20  HOUT ROWID.     
18a90 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c     ** tables wil
18aa0 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74  l fail this last
18ab0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20   check */.      
18ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
18ad0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
18ae0 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61  data(p->db,0,zTa
18af0 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30  b,azRowid[j],0,0
18b00 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20  ,0,0,0);.       
18b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18b20 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20  OK ) azCol[0] = 
18b30 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20  azRowid[j];.    
18b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
18b50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
18b60 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a  eturn azCol;.}..
18b70 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65  /*.** Toggle the
18b80 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72   reverse_unorder
18b90 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69  ed_selects setti
18ba0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
18bb0 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f  id toggleSelectO
18bc0 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rder(sqlite3 *db
18bd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
18be0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
18bf0 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30  int iSetting = 0
18c00 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31  ;.  char zStmt[1
18c10 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  00];.  sqlite3_p
18c20 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50  repare_v2(db, "P
18c30 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e  RAGMA reverse_un
18c40 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22  ordered_selects"
18c50 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
18c60 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
18c70 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
18c80 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
18c90 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65  Setting = sqlite
18ca0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
18cb0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  mt, 0);.  }.  sq
18cc0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
18cd0 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Stmt);.  sqlite3
18ce0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
18cf0 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a  (zStmt), zStmt,.
18d00 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 72         "PRAGMA r
18d10 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
18d20 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21  _selects(%d)", !
18d30 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c  iSetting);.  sql
18d40 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
18d50 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d  tmt, 0, 0, 0);.}
18d60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
18d70 61 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c  a different call
18d80 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65  back routine use
18d90 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68  d for dumping th
18da0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45  e database..** E
18db0 61 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64  ach row received
18dc0 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63   by this callbac
18dd0 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  k consists of a 
18de0 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74  table name,.** t
18df0 68 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22  he table type ("
18e00 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65  index" or "table
18e10 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72  ") and SQL to cr
18e20 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a  eate the table..
18e30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18e40 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78  should print tex
18e50 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  t sufficient to 
18e60 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62  recreate the tab
18e70 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
18e80 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  t dump_callback(
18e90 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
18ea0 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
18eb0 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74  rg, char **azNot
18ec0 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Used){.  int rc;
18ed0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18ee0 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63  Table;.  const c
18ef0 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f  har *zType;.  co
18f00 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
18f10 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
18f20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29  = (ShellState *)
18f30 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  pArg;..  UNUSED_
18f40 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55  PARAMETER(azNotU
18f50 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67  sed);.  if( nArg
18f60 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20  !=3 || azArg==0 
18f70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54  ) return 0;.  zT
18f80 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b  able = azArg[0];
18f90 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67  .  zType = azArg
18fa0 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a  [1];.  zSql = az
18fb0 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73  Arg[2];..  if( s
18fc0 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  trcmp(zTable, "s
18fd0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
18fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  ==0 ){.    raw_p
18ff0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44  rintf(p->out, "D
19000 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74  ELETE FROM sqlit
19010 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b  e_sequence;\n");
19020 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
19030 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71  ite3_strglob("sq
19040 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61  lite_stat?", zTa
19050 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ble)==0 ){.    r
19060 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
19070 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
19080 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
19090 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
190a0 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
190b0 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  te_", 7)==0 ){. 
190c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
190d0 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
190e0 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56  (zSql, "CREATE V
190f0 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32  IRTUAL TABLE", 2
19100 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  0)==0 ){.    cha
19110 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28  r *zIns;.    if(
19120 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68   !p->writableSch
19130 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ema ){.      raw
19140 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19150 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
19160 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b  _schema=ON;\n");
19170 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62  .      p->writab
19180 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  leSchema = 1;.  
19190 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73    }.    zIns = s
191a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
191b0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
191c0 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  NTO sqlite_maste
191d0 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f  r(type,name,tbl_
191e0 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71  name,rootpage,sq
191f0 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55  l)".       "VALU
19200 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c  ES('table','%q',
19210 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a  '%q',0,'%q');",.
19220 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a         zTable, z
19230 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20  Table, zSql);.  
19240 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
19250 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49  >out, "%s\n", zI
19260 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
19270 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20  _free(zIns);.   
19280 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
19290 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68  se{.    printSch
192a0 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
192b0 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  zSql, ";\n");.  
192c0 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  }..  if( strcmp(
192d0 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d  zType, "table")=
192e0 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54  =0 ){.    ShellT
192f0 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20  ext sSelect;.   
19300 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c   ShellText sTabl
19310 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  e;.    char **az
19320 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Col;.    int i;.
19330 20 20 20 20 63 68 61 72 20 2a 73 61 76 65 64 44      char *savedD
19340 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e  estTable;.    in
19350 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20  t savedMode;..  
19360 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43    azCol = tableC
19370 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61  olumnList(p, zTa
19380 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  ble);.    if( az
19390 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
193a0 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  p->nErr++;.     
193b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
193c0 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
193d0 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20  quote the table 
193e0 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74  name, even if it
193f0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70   appears to be p
19400 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a  ure ascii,.    *
19410 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69 73 20  * in case it is 
19420 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20  a keyword. Ex:  
19430 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62  INSERT INTO "tab
19440 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69  le" ... */.    i
19450 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c 65 29  nitText(&sTable)
19460 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
19470 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65  (&sTable, zTable
19480 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62  , quoteChar(zTab
19490 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  le));.    /* If 
194a0 70 72 65 73 65 72 76 69 6e 67 20 74 68 65 20 72  preserving the r
194b0 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75  owid, add a colu
194c0 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20 74 68  mn list after th
194d0 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20  e table name..  
194e0 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f    ** In other wo
194f0 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e  rds:  "INSERT IN
19500 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62  TO tab(rowid,a,b
19510 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e  ,c,...) VALUES(.
19520 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ..)".    ** inst
19530 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
19540 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61   "INSERT INTO ta
19550 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a  b VALUES(...)"..
19560 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
19570 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zCol[0] ){.     
19580 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
19590 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20  ble, "(", 0);.  
195a0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
195b0 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d  sTable, azCol[0]
195c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
195d0 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69  i=1; azCol[i]; i
195e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ++){.        app
195f0 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c  endText(&sTable,
19600 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
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 61 7a 43 6f 6c 5b 69 5d 2c 20  able, azCol[i], 
19630 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
19640 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  i]));.      }.  
19650 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
19660 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b  sTable, ")", 0);
19670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42  .    }..    /* B
19680 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69  uild an appropri
19690 61 74 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ate SELECT state
196a0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74  ment */.    init
196b0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
196c0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
196d0 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54  sSelect, "SELECT
196e0 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   ", 0);.    if( 
196f0 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  azCol[0] ){.    
19700 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
19710 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c  elect, azCol[0],
19720 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e   0);.      appen
19730 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
19740 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ",", 0);.    }. 
19750 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f     for(i=1; azCo
19760 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
19770 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
19780 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  elect, azCol[i],
19790 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c   quoteChar(azCol
197a0 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [i]));.      if(
197b0 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20   azCol[i+1] ){. 
197c0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
197d0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c  t(&sSelect, ",",
197e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
197f0 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d   }.    freeColum
19800 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20  nList(azCol);.  
19810 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
19820 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c  elect, " FROM ",
19830 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54   0);.    appendT
19840 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54  ext(&sSelect, zT
19850 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
19860 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73  zTable));..    s
19870 61 76 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20  avedDestTable = 
19880 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20  p->zDestTable;. 
19890 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70     savedMode = p
198a0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a  ->mode;.    p->z
198b0 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62  DestTable = sTab
198c0 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64  le.z;.    p->mod
198d0 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d  e = p->cMode = M
198e0 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
198f0 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28  rc = shell_exec(
19900 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29  p, sSelect.z, 0)
19910 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
19920 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)==SQLITE_CORR
19930 55 50 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77  UPT ){.      raw
19940 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19950 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54  "/****** CORRUPT
19960 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a  ION ERROR ******
19970 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f  */\n");.      to
19980 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28  ggleSelectOrder(
19990 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68  p->db);.      sh
199a0 65 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c  ell_exec(p, sSel
199b0 65 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20  ect.z, 0);.     
199c0 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
199d0 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d  er(p->db);.    }
199e0 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
199f0 6c 65 20 3d 20 73 61 76 65 64 44 65 73 74 54 61  le = savedDestTa
19a00 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65  ble;.    p->mode
19a10 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20   = savedMode;.  
19a20 20 20 66 72 65 65 54 65 78 74 28 26 73 54 61 62    freeText(&sTab
19a30 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78  le);.    freeTex
19a40 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
19a50 20 69 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72   if( rc ) p->nEr
19a60 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r++;.  }.  retur
19a70 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  n 0;.}../*.** Ru
19a80 6e 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64  n zQuery.  Use d
19a90 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61  ump_callback() a
19aa0 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
19ab0 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a  outine so that.*
19ac0 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
19ad0 66 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20  f the query are 
19ae0 6f 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74  output as SQL st
19af0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
19b00 49 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49  If we get a SQLI
19b10 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
19b20 2c 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72  , rerun the quer
19b30 79 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e  y after appendin
19b40 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72  g.** "ORDER BY r
19b50 6f 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68  owid DESC" to th
19b60 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  e end..*/.static
19b70 20 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f   int run_schema_
19b80 64 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68  dump_query(.  Sh
19b90 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63  ellState *p,.  c
19ba0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
19bb0 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  y.){.  int rc;. 
19bc0 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
19bd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19be0 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65  exec(p->db, zQue
19bf0 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  ry, dump_callbac
19c00 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20  k, p, &zErr);.  
19c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
19c20 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68  ORRUPT ){.    ch
19c30 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74  ar *zQ2;.    int
19c40 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28   len = strlen30(
19c50 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77  zQuery);.    raw
19c60 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
19c70 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54  "/****** CORRUPT
19c80 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a  ION ERROR ******
19c90 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  */\n");.    if( 
19ca0 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74  zErr ){.      ut
19cb0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
19cc0 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a  , "/****** %s **
19cd0 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b  ****/\n", zErr);
19ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
19cf0 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20  ree(zErr);.     
19d00 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d   zErr = 0;.    }
19d10 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f  .    zQ2 = mallo
19d20 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20  c( len+100 );.  
19d30 20 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72    if( zQ2==0 ) r
19d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
19d50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c  lite3_snprintf(l
19d60 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73  en+100, zQ2, "%s
19d70 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20   ORDER BY rowid 
19d80 44 45 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a  DESC", zQuery);.
19d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19da0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32  _exec(p->db, zQ2
19db0 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c  , dump_callback,
19dc0 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20   p, &zErr);.    
19dd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
19de0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
19df0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52  ut, "/****** ERR
19e00 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e  OR: %s ******/\n
19e10 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65  ", zErr);.    }e
19e20 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
19e30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
19e40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19e50 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
19e60 20 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d    free(zQ2);.  }
19e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e80 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68  ./*.** Text of h
19e90 65 6c 70 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a  elp messages..**
19ea0 0a 2a 2a 20 54 68 65 20 68 65 6c 70 20 74 65 78  .** The help tex
19eb0 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76  t for each indiv
19ec0 69 64 75 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65  idual command be
19ed0 67 69 6e 73 20 77 69 74 68 20 61 20 6c 69 6e 65  gins with a line
19ee0 20 74 68 61 74 20 73 74 61 72 74 73 0a 2a 2a 20   that starts.** 
19ef0 77 69 74 68 20 22 2e 22 2e 20 20 53 75 62 73 65  with ".".  Subse
19f00 71 75 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20  quent lines are 
19f10 73 75 70 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66  supplimental inf
19f20 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
19f30 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 74 77  There must be tw
19f40 6f 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73  o or more spaces
19f50 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
19f60 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   of the command 
19f70 61 6e 64 20 74 68 65 0a 2a 2a 20 73 74 61 72 74  and the.** start
19f80 20 6f 66 20 74 68 65 20 64 65 73 63 72 69 70 74   of the descript
19f90 69 6f 6e 20 6f 66 20 77 68 61 74 20 74 68 61 74  ion of what that
19fa0 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a   command does..*
19fb0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
19fc0 68 61 72 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20  har *(azHelp[]) 
19fd0 3d 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  = {.#if defined(
19fe0 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
19ff0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1a000 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a010 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68  LTABLE).  ".arch
1a020 69 76 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  ive ...         
1a030 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61      Manage SQL a
1a040 72 63 68 69 76 65 73 22 2c 0a 20 20 22 20 20 20  rchives",.  "   
1a050 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73  Each command mus
1a060 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1a070 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1a080 69 6e 67 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20  ing options:",. 
1a090 20 22 20 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65   "     -c, --cre
1a0a0 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ate             
1a0b0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 61    Create a new a
1a0c0 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20  rchive",.  "    
1a0d0 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20   -u, --update   
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20              Add 
1a0f0 66 69 6c 65 73 20 6f 72 20 75 70 64 61 74 65 20  files or update 
1a100 66 69 6c 65 73 20 77 69 74 68 20 63 68 61 6e 67  files with chang
1a110 65 64 20 6d 74 69 6d 65 22 2c 0a 20 20 22 20 20  ed mtime",.  "  
1a120 20 20 20 2d 69 2c 20 2d 2d 69 6e 73 65 72 74 20     -i, --insert 
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1a140 6b 65 20 2d 75 20 62 75 74 20 61 6c 77 61 79 73  ke -u but always
1a150 20 61 64 64 20 65 76 65 6e 20 69 66 20 6d 74 69   add even if mti
1a160 6d 65 20 75 6e 63 68 61 6e 67 65 64 22 2c 0a 20  me unchanged",. 
1a170 20 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73   "     -t, --lis
1a180 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a190 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20    List contents 
1a1a0 6f 66 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  of archive",.  "
1a1b0 20 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61       -x, --extra
1a1c0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1a1d0 45 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72  Extract files fr
1a1e0 6f 6d 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  om archive",.  "
1a1f0 20 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75     Optional argu
1a200 6d 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20  ments:",.  "    
1a210 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20   -v, --verbose  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e              Prin
1a230 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20  t each filename 
1a240 61 73 20 69 74 20 69 73 20 70 72 6f 63 65 73 73  as it is process
1a250 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20  ed",.  "     -f 
1a260 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c  FILE, --file FIL
1a270 45 20 20 20 20 20 20 20 4f 70 65 72 61 74 65 20  E       Operate 
1a280 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45 20  on archive FILE 
1a290 28 64 65 66 61 75 6c 74 20 69 73 20 63 75 72 72  (default is curr
1a2a0 65 6e 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20  ent db)",.  "   
1a2b0 20 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70    -a FILE, --app
1a2c0 65 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65  end FILE     Ope
1a2d0 72 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65  rate on FILE ope
1a2e0 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70  ned using the ap
1a2f0 6e 64 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20  ndvfs VFS",.  " 
1a300 20 20 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69      -C DIR, --di
1a310 72 65 63 74 6f 72 79 20 44 49 52 20 20 20 20 43  rectory DIR    C
1a320 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
1a330 72 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65  ry DIR to read/e
1a340 78 74 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20  xtract files",. 
1a350 20 22 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79   "     -n, --dry
1a360 72 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  run             
1a370 20 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74    Show the SQL t
1a380 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f  hat would have o
1a390 63 63 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20  ccurred",.  "   
1a3a0 45 78 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20  Examples:",.  " 
1a3b0 20 20 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68      .ar -cf arch
1a3c0 69 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20  ive.sar foo bar 
1a3d0 20 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76   # Create archiv
1a3e0 65 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73  e.sar from files
1a3f0 20 66 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20   foo and bar",. 
1a400 20 22 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61   "     .ar -tf a
1a410 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20  rchive.sar      
1a420 20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65      # List membe
1a430 72 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61  rs of archive.sa
1a440 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20  r",.  "     .ar 
1a450 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73 61 72  -xvf archive.sar
1a460 20 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f           # Verbo
1a470 73 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c  sely extract fil
1a480 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e  es from archive.
1a490 73 61 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20  sar",.  "   See 
1a4a0 61 6c 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20  also:",.  "     
1a4b0 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f   http://sqlite.o
1a4c0 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61  rg/cli.html#sqla
1a4d0 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72  r_archive_suppor
1a4e0 74 22 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  t",.#endif.#ifnd
1a4f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a500 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22  UTHORIZATION.  "
1a510 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20  .auth ON|OFF    
1a520 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75           Show au
1a530 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63  thorizer callbac
1a540 6b 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e  ks",.#endif.  ".
1a550 62 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45  backup ?DB? FILE
1a560 20 20 20 20 20 20 20 20 42 61 63 6b 75 70 20 44          Backup D
1a570 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69  B (default \"mai
1a580 6e 5c 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20  n\") to FILE",. 
1a590 20 22 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e   "       --appen
1a5a0 64 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65  d            Use
1a5b0 20 74 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c   the appendvfs",
1a5c0 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79  .  "       --asy
1a5d0 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 57  nc             W
1a5e0 72 69 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74  rite to FILE wit
1a5f0 68 6f 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61  hout a journal a
1a600 6e 64 20 77 69 74 68 6f 75 74 20 66 73 79 6e 63  nd without fsync
1a610 28 29 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e  ()",.  ".bail on
1a620 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  |off            
1a630 20 53 74 6f 70 20 61 66 74 65 72 20 68 69 74 74   Stop after hitt
1a640 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44  ing an error.  D
1a650 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22  efault OFF",.  "
1a660 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20  .binary on|off  
1a670 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69           Turn bi
1a680 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f  nary output on o
1a690 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20  r off.  Default 
1a6a0 4f 46 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52  OFF",.  ".cd DIR
1a6b0 45 43 54 4f 52 59 20 20 20 20 20 20 20 20 20 20  ECTORY          
1a6c0 20 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72    Change the wor
1a6d0 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74  king directory t
1a6e0 6f 20 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20  o DIRECTORY",.  
1a6f0 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66  ".changes on|off
1a700 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e            Show n
1a710 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68  umber of rows ch
1a720 61 6e 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20  anged by SQL",. 
1a730 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20   ".check GLOB   
1a740 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20             Fail 
1a750 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20  if output since 
1a760 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e  .testcase does n
1a770 6f 74 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63  ot match",.  ".c
1a780 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20  lone NEWDB      
1a790 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74         Clone dat
1a7a0 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f  a into NEWDB fro
1a7b0 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  m the existing d
1a7c0 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61  atabase",.  ".da
1a7d0 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20  tabases         
1a7e0 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
1a7f0 20 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74   and files of at
1a800 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
1a810 22 2c 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20  ",.  ".dbconfig 
1a820 3f 6f 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c  ?op? ?val?     L
1a830 69 73 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71  ist or change sq
1a840 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
1a850 29 20 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e  ) options",.  ".
1a860 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20  dbinfo ?DB?     
1a870 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
1a880 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tus information 
1a890 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61  about the databa
1a8a0 73 65 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54  se",.  ".dump ?T
1a8b0 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20  ABLE? ...       
1a8c0 20 52 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61   Render all data
1a8d0 62 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20  base content as 
1a8e0 53 51 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69  SQL",.  "   Opti
1a8f0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d  ons:",.  "     -
1a900 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
1a910 20 20 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f        Include RO
1a920 57 49 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68  WID values in th
1a930 65 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20  e output",.  "  
1a940 20 20 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20     --newlines   
1a950 20 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20            Allow 
1a960 75 6e 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e  unescaped newlin
1a970 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
1a980 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54  output",.  "   T
1a990 41 42 4c 45 20 69 73 20 61 20 4c 49 4b 45 20 70  ABLE is a LIKE p
1a9a0 61 74 74 65 72 6e 20 66 6f 72 20 74 68 65 20 74  attern for the t
1a9b0 61 62 6c 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a  ables to dump",.
1a9c0 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e              Turn
1a9e0 20 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e   command echo on
1a9f0 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71   or off",.  ".eq
1aa00 70 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e  p on|off|full|..
1aa10 2e 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20  .     Enable or 
1aa20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69  disable automati
1aa30 63 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  c EXPLAIN QUERY 
1aa40 50 4c 41 4e 22 2c 0a 20 20 22 20 20 20 4f 74 68  PLAN",.  "   Oth
1aa50 65 72 20 4d 6f 64 65 73 3a 22 2c 0a 23 69 66 64  er Modes:",.#ifd
1aa60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1aa70 20 20 22 20 20 20 20 20 20 74 65 73 74 20 20 20    "      test   
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1aa90 68 6f 77 20 72 61 77 20 45 58 50 4c 41 49 4e 20  how raw EXPLAIN 
1aaa0 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75  QUERY PLAN outpu
1aab0 74 22 2c 0a 20 20 22 20 20 20 20 20 20 74 72 61  t",.  "      tra
1aac0 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ce              
1aad0 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22     Like \"full\"
1aae0 20 62 75 74 20 61 6c 73 6f 20 65 6e 61 62 6c 65   but also enable
1aaf0 20 5c 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74   \"PRAGMA vdbe_t
1ab00 72 61 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a  race\"",.#endif.
1ab10 20 20 22 20 20 20 20 20 20 74 72 69 67 67 65 72    "      trigger
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1ab30 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74  ike \"full\" but
1ab40 20 61 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67   also show trigg
1ab50 65 72 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20  er bytecode",.  
1ab60 22 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20  ".excel         
1ab70 20 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61            Displa
1ab80 79 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  y the output of 
1ab90 6e 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20  next command in 
1aba0 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a  a spreadsheet",.
1abb0 20 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20    ".exit ?CODE? 
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74              Exit
1abd0 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69   this program wi
1abe0 74 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43  th return-code C
1abf0 4f 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74  ODE",.  ".expert
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20    EXPERIMENTAL. 
1ac20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20  Suggest indexes 
1ac30 66 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75  for specified qu
1ac40 65 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75  eries",./* Becau
1ac50 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  se explain mode 
1ac60 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74  comes on automat
1ac70 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20  ically now, the 
1ac80 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a  ".explain" mode.
1ac90 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ** is removed fr
1aca0 6f 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65  om the help scre
1acb0 65 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c  en.  It is still
1acc0 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c   supported for l
1acd0 65 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a  egacy, however *
1ace0 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f  /./*".explain ?o
1acf0 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75  n|off|auto?   Tu
1ad00 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75  rn EXPLAIN outpu
1ad10 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66  t mode on or off
1ad20 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63   or to automatic
1ad30 22 2c 2a 2f 0a 20 20 22 2e 66 69 6c 65 63 74 72  ",*/.  ".filectr
1ad40 6c 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20  l CMD ...       
1ad50 20 52 75 6e 20 76 61 72 69 6f 75 73 20 73 71 6c   Run various sql
1ad60 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1ad70 6c 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 22 2c  l() operations",
1ad80 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
1ada0 75 6e 20 5c 22 2e 66 69 6c 65 63 74 72 6c 5c 22  un \".filectrl\"
1adb0 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
1adc0 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 22 2c  ts for details",
1add0 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20  .  ".fullschema 
1ade0 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f  ?--indent?   Sho
1adf0 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65  w schema and the
1ae00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69   content of sqli
1ae10 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c  te_stat tables",
1ae20 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c  .  ".headers on|
1ae30 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72  off          Tur
1ae40 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61  n display of hea
1ae50 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  ders on or off",
1ae60 0a 20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f  .  ".help ?-all?
1ae70 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f   ?PATTERN?   Sho
1ae80 77 20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20  w help text for 
1ae90 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d  PATTERN",.  ".im
1aea0 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20  port FILE TABLE 
1aeb0 20 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74        Import dat
1aec0 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
1aed0 20 54 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66   TABLE",.#ifndef
1aee0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53   SQLITE_OMIT_TES
1aef0 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d  T_CONTROL.  ".im
1af00 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42  poster INDEX TAB
1af10 4c 45 20 20 20 20 43 72 65 61 74 65 20 69 6d 70  LE    Create imp
1af20 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c  oster table TABL
1af30 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58  E on index INDEX
1af40 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e  ",.#endif.  ".in
1af50 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dexes ?TABLE?   
1af60 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
1af70 20 6f 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20   of indexes",.  
1af80 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1af90 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
1afa0 41 42 4c 45 20 69 73 20 73 70 65 63 69 66 69 65  ABLE is specifie
1afb0 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
1afc0 65 78 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20  exes for",.  "  
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 73 20           tables 
1aff0 6d 61 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75  matching TABLE u
1b000 73 69 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70  sing the LIKE op
1b010 65 72 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66  erator.",.#ifdef
1b020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
1b030 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61  OTRACE.  ".iotra
1b040 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ce FILE         
1b050 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69     Enable I/O di
1b060 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67  agnostic logging
1b070 20 74 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69   to FILE",.#endi
1b080 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d  f.  ".limit ?LIM
1b090 49 54 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69  IT? ?VAL?     Di
1b0a0 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20  splay or change 
1b0b0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
1b0c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20  SQLITE_LIMIT",. 
1b0d0 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20   ".lint OPTIONS 
1b0e0 20 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72             Repor
1b0f0 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65  t potential sche
1b100 6d 61 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22  ma issues.",.  "
1b110 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a       Options:",.
1b120 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d    "        fkey-
1b130 69 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64  indexes     Find
1b140 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e   missing foreign
1b150 20 6b 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23   key indexes",.#
1b160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b170 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1b180 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20  N.  ".load FILE 
1b190 3f 45 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f  ?ENTRY?       Lo
1b1a0 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ad an extension 
1b1b0 6c 69 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66  library",.#endif
1b1c0 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66  .  ".log FILE|of
1b1d0 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72  f            Tur
1b1e0 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20  n logging on or 
1b1f0 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62  off.  FILE can b
1b200 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22  e stderr/stdout"
1b210 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20  ,.  ".mode MODE 
1b220 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65  ?TABLE?       Se
1b230 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a  t output mode",.
1b240 20 20 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e    "   MODE is on
1b250 65 20 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20  e of:",.  "     
1b260 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73  ascii    Columns
1b270 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20  /rows delimited 
1b280 62 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45  by 0x1F and 0x1E
1b290 22 2c 0a 20 20 22 20 20 20 20 20 63 73 76 20 20  ",.  "     csv  
1b2a0 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61      Comma-separa
1b2b0 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ted values",.  "
1b2c0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
1b2d0 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
1b2e0 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
1b2f0 29 22 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c  )",.  "     html
1b300 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65       HTML <table
1b310 3e 20 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20  > code",.  "    
1b320 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e   insert   SQL in
1b330 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1b340 66 6f 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20  for TABLE",.  " 
1b350 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65      line     One
1b360 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22   value per line"
1b370 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20  ,.  "     list  
1b380 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69     Values delimi
1b390 74 65 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20  ted by \"|\"",. 
1b3a0 20 22 20 20 20 20 20 71 75 6f 74 65 20 20 20 20   "     quote    
1b3b0 45 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61  Escape answers a
1b3c0 73 20 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20  s for SQL",.  " 
1b3d0 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
1b3e0 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
1b3f0 73 22 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20  s",.  "     tcl 
1b400 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c       TCL list el
1b410 65 6d 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c  ements",.  ".nul
1b420 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20  lvalue STRING   
1b430 20 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20       Use STRING 
1b440 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c  in place of NULL
1b450 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e   values",.  ".on
1b460 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20  ce (-e|-x|FILE) 
1b470 20 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72        Output for
1b480 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f   the next SQL co
1b490 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49  mmand only to FI
1b4a0 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20  LE",.  "     If 
1b4b0 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68  FILE begins with
1b4c0 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61   '|' then open a
1b4d0 73 20 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20  s a pipe",.  "  
1b4e0 20 20 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73     Other options
1b4f0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65  :",.  "       -e
1b500 20 20 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65      Invoke syste
1b510 6d 20 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a  m text editor",.
1b520 20 20 22 20 20 20 20 20 20 20 2d 78 20 20 20 20    "       -x    
1b530 4f 70 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64  Open in a spread
1b540 73 68 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e  sheet",.  ".open
1b550 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45   ?OPTIONS? ?FILE
1b560 3f 20 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69  ?   Close existi
1b570 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ng database and 
1b580 72 65 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20  reopen FILE",.  
1b590 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c  "     Options:",
1b5a0 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70  .  "        --ap
1b5b0 70 65 6e 64 20 20 20 20 20 20 20 20 55 73 65 20  pend        Use 
1b5c0 61 70 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70  appendvfs to app
1b5d0 65 6e 64 20 64 61 74 61 62 61 73 65 20 74 6f 20  end database to 
1b5e0 74 68 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22  the end of FILE"
1b5f0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1b600 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
1b610 5a 45 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ZE.  "        --
1b620 64 65 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f  deserialize   Lo
1b630 61 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75  ad into memory u
1b640 73 65 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  seing sqlite3_de
1b650 73 65 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20  serialize()",.  
1b660 22 20 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62  "        --hexdb
1b670 20 20 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68           Load th
1b680 65 20 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62  e output of \"db
1b690 74 6f 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e  totxt\" as an in
1b6a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1b6b0 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1b6c0 6d 61 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61  maxsize N     Ma
1b6d0 78 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d  ximum size for -
1b6e0 2d 68 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65  -hexdb or --dese
1b6f0 72 69 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73  rialized databas
1b700 65 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  e",.#endif.  "  
1b710 20 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20        --new     
1b720 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
1b730 20 46 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74   FILE to an empt
1b740 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  y database",.  "
1b750 20 20 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e          --readon
1b760 6c 79 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c  ly      Open FIL
1b770 45 20 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22  E readonly",.  "
1b780 20 20 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20          --zip   
1b790 20 20 20 20 20 20 20 20 46 49 4c 45 20 69 73 20          FILE is 
1b7a0 61 20 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a  a ZIP archive",.
1b7b0 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45    ".output ?FILE
1b7c0 3f 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64  ?           Send
1b7d0 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20   output to FILE 
1b7e0 6f 72 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c  or stdout if FIL
1b7f0 45 20 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20  E is omitted",. 
1b800 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1b810 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1b820 68 65 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61  hen open it as a
1b830 20 70 69 70 65 2e 22 2c 0a 20 20 22 2e 70 61 72   pipe.",.  ".par
1b840 61 6d 65 74 65 72 20 43 4d 44 20 2e 2e 2e 20 20  ameter CMD ...  
1b850 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20       Manage SQL 
1b860 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  parameter bindin
1b870 67 73 22 2c 0a 20 20 22 20 20 20 63 6c 65 61 72  gs",.  "   clear
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 45 72 61 73 65 20 61 6c 6c 20 62 69 6e     Erase all bin
1b8a0 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 69 6e  dings",.  "   in
1b8b0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1b8c0 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
1b8d0 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20   the TEMP table 
1b8e0 74 68 61 74 20 68 6f 6c 64 73 20 62 69 6e 64 69  that holds bindi
1b8f0 6e 67 73 22 2c 0a 20 20 22 20 20 20 6c 69 73 74  ngs",.  "   list
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 4c 69 73 74 20 74 68 65 20 63 75 72      List the cur
1b920 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62  rent parameter b
1b930 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20  indings",.  "   
1b940 73 65 74 20 50 41 52 41 4d 45 54 45 52 20 56 41  set PARAMETER VA
1b950 4c 55 45 20 20 20 20 20 47 69 76 65 6e 20 53 51  LUE     Given SQ
1b960 4c 20 70 61 72 61 6d 65 74 65 72 20 50 41 52 41  L parameter PARA
1b970 4d 45 54 45 52 20 61 20 76 61 6c 75 65 20 6f 66  METER a value of
1b980 20 56 41 4c 55 45 22 2c 0a 20 20 22 20 20 20 20   VALUE",.  "    
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 50 41 52 41 4d 45 54 45 52         PARAMETER
1b9b0 20 73 68 6f 75 6c 64 20 73 74 61 72 74 20 77 69   should start wi
1b9c0 74 68 20 27 24 27 2c 20 27 3a 27 2c 20 27 40 27  th '$', ':', '@'
1b9d0 2c 20 6f 72 20 27 3f 27 22 2c 0a 20 20 22 20 20  , or '?'",.  "  
1b9e0 20 75 6e 73 65 74 20 50 41 52 41 4d 45 54 45 52   unset PARAMETER
1b9f0 20 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20           Remove 
1ba00 50 41 52 41 4d 45 54 45 52 20 66 72 6f 6d 20 74  PARAMETER from t
1ba10 68 65 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65  he binding table
1ba20 22 2c 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  ",.  ".print STR
1ba30 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50  ING...         P
1ba40 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52  rint literal STR
1ba50 49 4e 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  ING",.#ifndef SQ
1ba60 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
1ba70 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e  SS_CALLBACK.  ".
1ba80 70 72 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20  progress N      
1ba90 20 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70          Invoke p
1baa0 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20  rogress handler 
1bab0 61 66 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70  after every N op
1bac0 63 6f 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d  codes",.  "   --
1bad0 6c 69 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20  limit N         
1bae0 20 20 20 20 20 20 20 20 49 6e 74 65 72 72 75 70          Interrup
1baf0 74 20 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65  t after N progre
1bb00 73 73 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20  ss callbacks",. 
1bb10 20 22 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20   "   --once     
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1bb30 6f 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  o no more than o
1bb40 6e 65 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65  ne progress inte
1bb50 72 72 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d  rrupt",.  "   --
1bb60 71 75 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20  quiet|-q        
1bb70 20 20 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75          No outpu
1bb80 74 20 65 78 63 65 70 74 20 61 74 20 69 6e 74 65  t except at inte
1bb90 72 72 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d  rrupts",.  "   -
1bba0 2d 72 65 73 65 74 20 20 20 20 20 20 20 20 20 20  -reset          
1bbb0 20 20 20 20 20 20 20 20 20 52 65 73 65 74 20 74           Reset t
1bbc0 68 65 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63  he count for eac
1bbd0 68 20 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65  h input and inte
1bbe0 72 72 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20  rrupt",.#endif. 
1bbf0 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
1bc00 4f 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61  ONTINUE    Repla
1bc10 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
1bc20 70 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75  prompts",.  ".qu
1bc30 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1bc40 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
1bc50 70 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65  program",.  ".re
1bc60 61 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ad FILE         
1bc70 20 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74        Read input
1bc80 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 23 69 66   from FILE",.#if
1bc90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1bca0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1bcb0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
1bcc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
1bcd0 41 47 45 5f 56 54 41 42 29 0a 20 20 22 2e 72 65  AGE_VTAB).  ".re
1bce0 63 6f 76 65 72 20 20 20 20 20 20 20 20 20 20 20  cover           
1bcf0 20 20 20 20 20 20 52 65 63 6f 76 65 72 20 61 73        Recover as
1bd00 20 6d 75 63 68 20 64 61 74 61 20 61 73 20 70 6f   much data as po
1bd10 73 73 69 62 6c 65 20 66 72 6f 6d 20 63 6f 72 72  ssible from corr
1bd20 75 70 74 20 64 62 2e 22 2c 0a 23 65 6e 64 69 66  upt db.",.#endif
1bd30 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42  .  ".restore ?DB
1bd40 3f 20 46 49 4c 45 20 20 20 20 20 20 20 52 65 73  ? FILE       Res
1bd50 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
1bd60 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
1bd70 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22  in\") from FILE"
1bd80 2c 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20  ,.  ".save FILE 
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
1bda0 69 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  ite in-memory da
1bdb0 74 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45  tabase into FILE
1bdc0 22 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73  ",.  ".scanstats
1bdd0 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54   on|off        T
1bde0 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  urn sqlite3_stmt
1bdf0 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65  _scanstatus() me
1be00 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22  trics on or off"
1be10 2c 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41  ,.  ".schema ?PA
1be20 54 54 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68  TTERN?        Sh
1be30 6f 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ow the CREATE st
1be40 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e  atements matchin
1be50 67 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20  g PATTERN",.  " 
1be60 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1be70 20 22 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64   "         --ind
1be80 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 54  ent            T
1be90 72 79 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69  ry to pretty-pri
1bea0 6e 74 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a  nt the schema",.
1beb0 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50    ".selftest ?OP
1bec0 54 49 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20  TIONS?      Run 
1bed0 74 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e  tests defined in
1bee0 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
1bef0 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74  ble",.  "    Opt
1bf00 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ions:",.  "     
1bf10 20 20 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20    --init        
1bf20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20         Create a 
1bf30 6e 65 77 20 53 45 4c 46 54 45 53 54 20 74 61 62  new SELFTEST tab
1bf40 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d  le",.  "       -
1bf50 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v               
1bf60 20 20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70      Verbose outp
1bf70 75 74 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74  ut",.  ".separat
1bf80 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20  or COL ?ROW?    
1bf90 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75   Change the colu
1bfa0 6d 6e 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72  mn and row separ
1bfb0 61 74 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69  ators",.#if defi
1bfc0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1bfd0 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73  E_SESSION).  ".s
1bfe0 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d  ession ?NAME? CM
1bff0 44 20 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72  D ...  Create or
1c000 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e   control session
1c010 73 22 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d  s",.  "   Subcom
1c020 6d 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20  mands:",.  "    
1c030 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20   attach TABLE   
1c040 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68            Attach
1c050 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20   TABLE",.  "    
1c060 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20   changeset FILE 
1c070 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1c080 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f  a changeset into
1c090 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20   FILE",.  "     
1c0a0 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  close           
1c0b0 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f           Close o
1c0c0 6e 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22  ne session",.  "
1c0d0 20 20 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f       enable ?BOO
1c0e0 4c 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65  LEAN?         Se
1c0f0 74 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65  t or query the e
1c100 6e 61 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20  nable bit",.  " 
1c110 20 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e      filter GLOB.
1c120 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a  ..           Rej
1c130 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ect tables match
1c140 69 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20  ing GLOBs",.  " 
1c150 20 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f      indirect ?BO
1c160 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72  OLEAN?       Mar
1c170 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 69  k or query the i
1c180 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 22 2c  ndirect status",
1c190 0a 20 20 22 20 20 20 20 20 69 73 65 6d 70 74 79  .  "     isempty
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20    Query whether 
1c1c0 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65  the session is e
1c1d0 6d 70 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c  mpty",.  "     l
1c1e0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
1c1f0 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72          List cur
1c200 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73  rently open sess
1c210 69 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20  ion names",.  " 
1c220 20 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45      open DB NAME
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65               Ope
1c240 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
1c250 6f 6e 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20  on DB",.  "     
1c260 70 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20  patchset FILE   
1c270 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
1c280 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46   patchset into F
1c290 49 4c 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f  ILE",.  "   If ?
1c2a0 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64  NAME? is omitted
1c2b0 2c 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69  , the first defi
1c2c0 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75  ned session is u
1c2d0 73 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20  sed.",.#endif.  
1c2e0 22 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20  ".sha3sum ...   
1c2f0 20 20 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74            Comput
1c300 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66  e a SHA3 hash of
1c310 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
1c320 74 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f  t",.  "    Optio
1c330 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d  ns:",.  "      -
1c340 2d 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20  -schema         
1c350 20 20 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74       Also hash t
1c360 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c370 20 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20   table",.  "    
1c380 20 20 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20    --sha3-224    
1c390 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20          Use the 
1c3a0 73 68 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74  sha3-224 algorit
1c3b0 68 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  hm",.  "      --
1c3c0 73 68 61 33 2d 32 35 36 20 20 20 20 20 20 20 20  sha3-256        
1c3d0 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1c3e0 2d 32 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20  -256 algorithm. 
1c3f0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
1c400 61 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20  ault.",.  "     
1c410 20 2d 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20   --sha3-384     
1c420 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1c430 68 61 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68  ha3-384 algorith
1c440 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  m",.  "      --s
1c450 68 61 33 2d 35 31 32 20 20 20 20 20 20 20 20 20  ha3-512         
1c460 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1c470 35 31 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  512 algorithm",.
1c480 20 20 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72    "    Any other
1c490 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c   argument is a L
1c4a0 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20  IKE pattern for 
1c4b0 74 61 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c  tables to hash",
1c4c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1c4d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1c4e0 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
1c4f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1c500 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a 20 20  _DBPAGE_VTAB).  
1c510 22 2e 73 68 61 72 65 64 2d 73 63 68 65 6d 61 20  ".shared-schema 
1c520 43 4d 44 20 44 42 31 20 44 42 32 20 2e 2e 2e 22  CMD DB1 DB2 ..."
1c530 2c 0a 20 20 22 20 20 20 20 43 6f 6d 6d 61 6e 64  ,.  "    Command
1c540 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 63  s:",.  "       c
1c550 68 65 63 6b 20 20 20 20 20 20 20 20 20 20 20 20  heck            
1c560 20 20 20 20 44 65 74 65 72 6d 69 6e 65 20 69 66      Determine if
1c570 20 44 42 31 2c 20 44 42 32 2c 20 65 74 63 20 68   DB1, DB2, etc h
1c580 61 76 65 20 69 64 65 6e 74 69 63 61 6c 20 73 63  ave identical sc
1c590 68 65 6d 61 73 22 2c 0a 20 20 22 20 20 20 20 20  hemas",.  "     
1c5a0 20 20 66 69 78 20 20 20 20 20 20 20 20 20 20 20    fix           
1c5b0 20 20 20 20 20 20 20 41 74 74 65 6d 70 74 20 74         Attempt t
1c5c0 6f 20 6d 61 6b 65 20 44 42 31 2c 20 44 42 32 2c  o make DB1, DB2,
1c5d0 20 65 74 63 20 63 6f 6d 70 61 74 69 62 6c 65 22   etc compatible"
1c5e0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
1c5f0 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
1c600 59 53 54 45 4d 0a 20 20 22 2e 73 68 65 6c 6c 20  YSTEM.  ".shell 
1c610 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20  CMD ARGS...     
1c620 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e    Run CMD ARGS..
1c630 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68  . in a system sh
1c640 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  ell",.#endif.  "
1c650 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20  .show           
1c660 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
1c670 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
1c680 20 66 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74   for various set
1c690 74 69 6e 67 73 22 2c 0a 20 20 22 2e 73 74 61 74  tings",.  ".stat
1c6a0 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20  s ?on|off?      
1c6b0 20 20 20 20 53 68 6f 77 20 73 74 61 74 73 20 6f      Show stats o
1c6c0 72 20 74 75 72 6e 20 73 74 61 74 73 20 6f 6e 20  r turn stats on 
1c6d0 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66  or off",.#ifndef
1c6e0 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
1c6f0 59 53 54 45 4d 0a 20 20 22 2e 73 79 73 74 65 6d  YSTEM.  ".system
1c700 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20   CMD ARGS...    
1c710 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e    Run CMD ARGS..
1c720 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68  . in a system sh
1c730 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  ell",.#endif.  "
1c740 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20  .tables ?TABLE? 
1c750 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61           List na
1c760 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 20 6d 61  mes of tables ma
1c770 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74 74  tching LIKE patt
1c780 65 72 6e 20 54 41 42 4c 45 22 2c 0a 20 20 22 2e  ern TABLE",.  ".
1c790 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20 20 20  testcase NAME   
1c7a0 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72 65          Begin re
1c7b0 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74  directing output
1c7c0 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75   to 'testcase-ou
1c7d0 74 2e 74 78 74 27 22 2c 0a 20 20 22 2e 74 65 73  t.txt'",.  ".tes
1c7e0 74 63 74 72 6c 20 43 4d 44 20 2e 2e 2e 20 20 20  tctrl CMD ...   
1c7f0 20 20 20 20 20 52 75 6e 20 76 61 72 69 6f 75 73       Run various
1c800 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c810 6e 74 72 6f 6c 28 29 20 6f 70 65 72 61 74 69 6f  ntrol() operatio
1c820 6e 73 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  ns",.  "        
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 20 20 52 75 6e 20 5c 22 2e 74 65 73 74 63 74     Run \".testct
1c850 72 6c 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67  rl\" with no arg
1c860 75 6d 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69  uments for detai
1c870 6c 73 22 2c 0a 20 20 22 2e 74 69 6d 65 6f 75 74  ls",.  ".timeout
1c880 20 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 20   MS             
1c890 20 54 72 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63   Try opening loc
1c8a0 6b 65 64 20 74 61 62 6c 65 73 20 66 6f 72 20 4d  ked tables for M
1c8b0 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 22 2c  S milliseconds",
1c8c0 0a 20 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  .  ".timer on|of
1c8d0 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72  f            Tur
1c8e0 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e 20 6f  n SQL timer on o
1c8f0 72 20 6f 66 66 22 2c 0a 23 69 66 6e 64 65 66 20  r off",.#ifndef 
1c900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
1c910 45 0a 20 20 22 2e 74 72 61 63 65 20 3f 4f 50 54  E.  ".trace ?OPT
1c920 49 4f 4e 53 3f 20 20 20 20 20 20 20 20 20 4f 75  IONS?         Ou
1c930 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73 74  tput each SQL st
1c940 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69 73  atement as it is
1c950 20 72 75 6e 22 2c 0a 20 20 22 20 20 20 20 46 49   run",.  "    FI
1c960 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
1c970 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75        Send outpu
1c980 74 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22 20  t to FILE",.  " 
1c990 20 20 20 73 74 64 6f 75 74 20 20 20 20 20 20 20     stdout       
1c9a0 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20             Send 
1c9b0 6f 75 74 70 75 74 20 74 6f 20 73 74 64 6f 75 74  output to stdout
1c9c0 22 2c 0a 20 20 22 20 20 20 20 73 74 64 65 72 72  ",.  "    stderr
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1c9f0 20 73 74 64 65 72 72 22 2c 0a 20 20 22 20 20 20   stderr",.  "   
1ca00 20 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20   off            
1ca10 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c 65           Disable
1ca20 20 74 72 61 63 69 6e 67 22 2c 0a 20 20 22 20 20   tracing",.  "  
1ca30 20 20 2d 2d 65 78 70 61 6e 64 65 64 20 20 20 20    --expanded    
1ca40 20 20 20 20 20 20 20 20 20 20 45 78 70 61 6e 64            Expand
1ca50 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1ca60 73 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s",.#ifdef SQLIT
1ca70 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
1ca80 5a 45 0a 20 20 22 20 20 20 20 2d 2d 6e 6f 72 6d  ZE.  "    --norm
1ca90 61 6c 69 7a 65 64 20 20 20 20 20 20 20 20 20 20  alized          
1caa0 20 20 4e 6f 72 6d 61 6c 20 74 68 65 20 53 51 4c    Normal the SQL
1cab0 20 73 74 61 74 65 6d 65 6e 74 73 22 2c 0a 23 65   statements",.#e
1cac0 6e 64 69 66 0a 20 20 22 20 20 20 20 2d 2d 70 6c  ndif.  "    --pl
1cad0 61 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ain             
1cae0 20 20 20 20 53 68 6f 77 20 53 51 4c 20 61 73 20      Show SQL as 
1caf0 69 74 20 69 73 20 69 6e 70 75 74 22 2c 0a 20 20  it is input",.  
1cb00 22 20 20 20 20 2d 2d 73 74 6d 74 20 20 20 20 20  "    --stmt     
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1cb20 63 65 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65  ce statement exe
1cb30 63 75 74 69 6f 6e 20 28 53 51 4c 49 54 45 5f 54  cution (SQLITE_T
1cb40 52 41 43 45 5f 53 54 4d 54 29 22 2c 0a 20 20 22  RACE_STMT)",.  "
1cb50 20 20 20 20 2d 2d 70 72 6f 66 69 6c 65 20 20 20      --profile   
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 50 72 6f 66              Prof
1cb70 69 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20 28  ile statements (
1cb80 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f  SQLITE_TRACE_PRO
1cb90 46 49 4c 45 29 22 2c 0a 20 20 22 20 20 20 20 2d  FILE)",.  "    -
1cba0 2d 72 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  -row            
1cbb0 20 20 20 20 20 20 20 54 72 61 63 65 20 65 61 63         Trace eac
1cbc0 68 20 72 6f 77 20 28 53 51 4c 49 54 45 5f 54 52  h row (SQLITE_TR
1cbd0 41 43 45 5f 52 4f 57 29 22 2c 0a 20 20 22 20 20  ACE_ROW)",.  "  
1cbe0 20 20 2d 2d 63 6c 6f 73 65 20 20 20 20 20 20 20    --close       
1cbf0 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 20            Trace 
1cc00 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6c 6f 73 65  connection close
1cc10 20 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43   (SQLITE_TRACE_C
1cc20 4c 4f 53 45 29 22 2c 0a 23 65 6e 64 69 66 20 2f  LOSE)",.#endif /
1cc30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
1cc40 41 43 45 20 2a 2f 0a 20 20 22 2e 76 66 73 69 6e  ACE */.  ".vfsin
1cc50 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  fo ?AUX?        
1cc60 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
1cc70 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
1cc80 65 6c 20 56 46 53 22 2c 0a 20 20 22 2e 76 66 73  el VFS",.  ".vfs
1cc90 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
1cca0 20 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76       List all av
1ccb0 61 69 6c 61 62 6c 65 20 56 46 53 65 73 22 2c 0a  ailable VFSes",.
1ccc0 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
1ccd0 3f 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e  ?           Prin
1cce0 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
1ccf0 65 20 56 46 53 20 73 74 61 63 6b 22 2c 0a 20 20  e VFS stack",.  
1cd00 22 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d  ".width NUM1 NUM
1cd10 32 20 2e 2e 2e 20 20 20 20 20 53 65 74 20 63 6f  2 ...     Set co
1cd20 6c 75 6d 6e 20 77 69 64 74 68 73 20 66 6f 72 20  lumn widths for 
1cd30 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 22  \"column\" mode"
1cd40 2c 0a 20 20 22 20 20 20 20 20 4e 65 67 61 74 69  ,.  "     Negati
1cd50 76 65 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d  ve values right-
1cd60 6a 75 73 74 69 66 79 22 2c 0a 7d 3b 0a 0a 2f 2a  justify",.};../*
1cd70 0a 2a 2a 20 4f 75 74 70 75 74 20 68 65 6c 70 20  .** Output help 
1cd80 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 7a 50 61 74  text..**.** zPat
1cd90 74 65 72 6e 20 64 65 73 63 72 69 62 65 73 20 74  tern describes t
1cda0 68 65 20 73 65 74 20 6f 66 20 63 6f 6d 6d 61 6e  he set of comman
1cdb0 64 73 20 66 6f 72 20 77 68 69 63 68 20 68 65 6c  ds for which hel
1cdc0 70 20 74 65 78 74 20 69 73 20 70 72 6f 76 69 64  p text is provid
1cdd0 65 64 2e 0a 2a 2a 20 49 66 20 7a 50 61 74 74 65  ed..** If zPatte
1cde0 72 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rn is NULL, then
1cdf0 20 73 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d 61 6e   show all comman
1ce00 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 67 69 76  ds, but only giv
1ce10 65 20 61 20 6f 6e 65 2d 6c 69 6e 65 0a 2a 2a 20  e a one-line.** 
1ce20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 65  description of e
1ce30 61 63 68 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ach..**.** Retur
1ce40 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1ce50 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
1ce60 69 63 20 69 6e 74 20 73 68 6f 77 48 65 6c 70 28  ic int showHelp(
1ce70 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
1ce80 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 29   char *zPattern)
1ce90 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
1cea0 20 69 6e 74 20 6a 20 3d 20 30 3b 0a 20 20 69 6e   int j = 0;.  in
1ceb0 74 20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  t n = 0;.  char 
1cec0 2a 7a 50 61 74 3b 0a 20 20 69 66 28 20 7a 50 61  *zPat;.  if( zPa
1ced0 74 74 65 72 6e 3d 3d 30 0a 20 20 20 7c 7c 20 7a  ttern==0.   || z
1cee0 50 61 74 74 65 72 6e 5b 30 5d 3d 3d 27 30 27 0a  Pattern[0]=='0'.
1cef0 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61     || strcmp(zPa
1cf00 74 74 65 72 6e 2c 22 2d 61 22 29 3d 3d 30 0a 20  ttern,"-a")==0. 
1cf10 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 50 61 74    || strcmp(zPat
1cf20 74 65 72 6e 2c 22 2d 61 6c 6c 22 29 3d 3d 30 0a  tern,"-all")==0.
1cf30 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 68 6f 77    ){.    /* Show
1cf40 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62   all commands, b
1cf50 75 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 6e 65  ut only one line
1cf60 20 70 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   per command */.
1cf70 20 20 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e      if( zPattern
1cf80 3d 3d 30 20 29 20 7a 50 61 74 74 65 72 6e 20 3d  ==0 ) zPattern =
1cf90 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30   "";.    for(i=0
1cfa0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  ; i<ArraySize(az
1cfb0 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Help); i++){.   
1cfc0 20 20 20 69 66 28 20 61 7a 48 65 6c 70 5b 69 5d     if( azHelp[i]
1cfd0 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 50 61 74  [0]=='.' || zPat
1cfe0 74 65 72 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20  tern[0] ){.     
1cff0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
1d000 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65  ut, "%s\n", azHe
1d010 6c 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  lp[i]);.        
1d020 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1d030 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d040 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d  /* Look for comm
1d050 61 6e 64 73 20 74 68 61 74 20 66 6f 72 20 77 68  ands that for wh
1d060 69 63 68 20 7a 50 61 74 74 65 72 6e 20 69 73 20  ich zPattern is 
1d070 61 6e 20 65 78 61 63 74 20 70 72 65 66 69 78 20  an exact prefix 
1d080 2a 2f 0a 20 20 20 20 7a 50 61 74 20 3d 20 73 71  */.    zPat = sq
1d090 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 2e  lite3_mprintf(".
1d0a0 25 73 2a 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b  %s*", zPattern);
1d0b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d0c0 41 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70  ArraySize(azHelp
1d0d0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
1d0e0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1d0f0 6f 62 28 7a 50 61 74 2c 20 61 7a 48 65 6c 70 5b  ob(zPat, azHelp[
1d100 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1d110 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
1d120 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c  t, "%s\n", azHel
1d130 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a  p[i]);.        j
1d140 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
1d150 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
1d160 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1d170 72 65 65 28 7a 50 61 74 29 3b 0a 20 20 20 20 69  ree(zPat);.    i
1d180 66 28 20 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  f( n ){.      if
1d190 28 20 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( n==1 ){.      
1d1a0 20 20 2f 2a 20 77 68 65 6e 20 7a 50 61 74 74 65    /* when zPatte
1d1b0 72 6e 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rn is a prefix o
1d1c0 66 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f  f exactly one co
1d1d0 6d 6d 61 6e 64 2c 20 74 68 65 6e 20 69 6e 63 6c  mmand, then incl
1d1e0 75 64 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  ude the.        
1d1f0 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  ** details of th
1d200 61 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68 69 63  at command, whic
1d210 68 20 73 68 6f 75 6c 64 20 62 65 67 69 6e 20 61  h should begin a
1d220 74 20 6f 66 66 73 65 74 20 6a 20 2a 2f 0a 20 20  t offset j */.  
1d230 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1d240 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1d250 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 5d 5b  -1 && azHelp[j][
1d260 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]!='.' ){.     
1d270 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1d280 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1d290 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1d2a0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
1d2b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d2c0 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d   return n;.    }
1d2d0 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  .    /* Look for
1d2e0 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 63   commands that c
1d2f0 6f 6e 74 61 69 6e 20 7a 50 61 74 74 65 72 6e 20  ontain zPattern 
1d300 61 6e 79 77 68 65 72 65 2e 20 20 53 68 6f 77 20  anywhere.  Show 
1d310 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  the complete.   
1d320 20 2a 2a 20 74 65 78 74 20 6f 66 20 61 6c 6c 20   ** text of all 
1d330 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74 20 6d 61  commands that ma
1d340 74 63 68 2e 20 2a 2f 0a 20 20 20 20 7a 50 61 74  tch. */.    zPat
1d350 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1d360 74 66 28 22 25 25 25 73 25 25 22 2c 20 7a 50 61  tf("%%%s%%", zPa
1d370 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1d380 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1d390 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1d3a0 20 20 20 20 20 20 69 66 28 20 61 7a 48 65 6c 70        if( azHelp
1d3b0 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20 29 20 6a 20  [i][0]=='.' ) j 
1d3c0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = i;.      if( s
1d3d0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
1d3e0 50 61 74 2c 20 61 7a 48 65 6c 70 5b 69 5d 2c 20  Pat, azHelp[i], 
1d3f0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
1d400 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
1d410 2c 20 22 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70  , "%s\n", azHelp
1d420 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 77 68  [j]);.        wh
1d430 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1d440 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1d450 48 65 6c 70 5b 6a 2b 31 5d 5b 30 5d 21 3d 27 2e  Help[j+1][0]!='.
1d460 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ' ){.          j
1d470 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  ++;.          ut
1d480 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
1d490 25 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d  %s\n", azHelp[j]
1d4a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d4b0 20 20 20 20 20 69 20 3d 20 6a 3b 0a 20 20 20 20       i = j;.    
1d4c0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
1d4d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d4e0 65 33 5f 66 72 65 65 28 7a 50 61 74 29 3b 0a 20  e3_free(zPat);. 
1d4f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d500 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1d510 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
1d520 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
1d530 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
1d540 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  );../*.** Read t
1d550 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  he content of fi
1d560 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65  le zName into me
1d570 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1d580 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
1d590 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74  c64().** and ret
1d5a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1d5b0 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65   the buffer. The
1d5c0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1d5d0 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
1d5e0 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  ng.** the memory
1d5f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1d600 65 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e  eter pnByte is n
1d610 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74  ot NULL, (*pnByt
1d620 65 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  e) is set to the
1d630 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1d640 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  .** read..**.** 
1d650 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c  For convenience,
1d660 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f   a nul-terminato
1d670 72 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73  r byte is always
1d680 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1d690 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72   data read.** fr
1d6a0 6f 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  om the file befo
1d6b0 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73  re the buffer is
1d6c0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20   returned. This 
1d6d0 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c  byte is not incl
1d6e0 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66  uded in.** the f
1d6f0 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a  inal value of (*
1d700 70 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c  pnByte), if appl
1d710 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55  icable..**.** NU
1d720 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  LL is returned i
1d730 66 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65  f any error is e
1d740 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20  ncountered. The 
1d750 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a  final value of *
1d760 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64  pnByte.** is und
1d770 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
1d780 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
1d790 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f  har *readFile(co
1d7a0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1d7b0 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1d7c0 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65   FILE *in = fope
1d7d0 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  n(zName, "rb");.
1d7e0 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69    long nIn;.  si
1d7f0 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68  ze_t nRead;.  ch
1d800 61 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20  ar *pBuf;.  if( 
1d810 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  in==0 ) return 0
1d820 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
1d830 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
1d840 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
1d850 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
1d860 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
1d870 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b  lloc64( nIn+1 );
1d880 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  .  if( pBuf==0 )
1d890 7b 20 66 63 6c 6f 73 65 28 69 6e 29 3b 20 72 65  { fclose(in); re
1d8a0 74 75 72 6e 20 30 3b 20 7d 0a 20 20 6e 52 65 61  turn 0; }.  nRea
1d8b0 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
1d8c0 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
1d8d0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
1d8e0 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
1d8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
1d900 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
1d910 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
1d920 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
1d930 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
1d940 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
1d950 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
1d960 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d970 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
1d980 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
1d990 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
1d9a0 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
1d9b0 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
1d9c0 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
1d9d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1d9e0 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
1d9f0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1da00 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
1da10 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
1da20 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
1da30 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
1da40 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1da50 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
1da60 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
1da70 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
1da80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1da90 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1daa0 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
1dab0 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1dac0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
1dad0 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
1dae0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
1daf0 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
1db00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
1db10 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
1db20 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
1db30 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
1db40 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
1db50 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1db60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1db70 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
1db80 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
1db90 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
1dba0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1dbb0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
1dbc0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
1dbd0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
1dbe0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
1dbf0 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
1dc00 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
1dc10 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
1dc20 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
1dc30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
1dc40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1dc50 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
1dc60 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
1dc70 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
1dc80 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
1dc90 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
1dca0 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
1dcb0 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
1dcc0 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
1dcd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1dce0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1dcf0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
1dd00 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
1dd10 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
1dd20 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
1dd30 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
1dd40 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
1dd50 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
1dd60 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1dd70 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1dd80 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1dd90 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
1dda0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
1ddb0 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
1ddc0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1ddd0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
1dde0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
1ddf0 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66  duce the type of
1de00 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20   file for zName 
1de10 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e  based on its con
1de20 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tent.  Return.**
1de30 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c   one of the SHEL
1de40 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e  L_OPEN_* constan
1de50 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ts..**.** If the
1de60 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
1de70 78 69 73 74 20 6f 72 20 69 73 20 65 6d 70 74 79  xist or is empty
1de80 20 62 75 74 20 69 74 73 20 6e 61 6d 65 20 6c 6f   but its name lo
1de90 6f 6b 73 20 6c 69 6b 65 20 61 20 5a 49 50 0a 2a  oks like a ZIP.*
1dea0 2a 20 61 72 63 68 69 76 65 20 61 6e 64 20 74 68  * archive and th
1deb0 65 20 64 66 6c 74 5a 69 70 20 66 6c 61 67 20 69  e dfltZip flag i
1dec0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 73 73  s true, then ass
1ded0 75 6d 65 20 69 74 20 69 73 20 61 20 5a 49 50 20  ume it is a ZIP 
1dee0 61 72 63 68 69 76 65 2e 0a 2a 2a 20 4f 74 68 65  archive..** Othe
1def0 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 61 6e  rwise, assume an
1df00 20 6f 72 64 69 6e 61 72 79 20 64 61 74 61 62 61   ordinary databa
1df10 73 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  se regardless of
1df20 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 69 66   the filename if
1df30 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 63 61 6e  .** the type can
1df40 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65  not be determine
1df50 64 20 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 2e 0a  d from content..
1df60 2a 2f 0a 69 6e 74 20 64 65 64 75 63 65 44 61 74  */.int deduceDat
1df70 61 62 61 73 65 54 79 70 65 28 63 6f 6e 73 74 20  abaseType(const 
1df80 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1df90 20 64 66 6c 74 5a 69 70 29 7b 0a 20 20 46 49 4c   dfltZip){.  FIL
1dfa0 45 20 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61  E *f = fopen(zNa
1dfb0 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a  me, "rb");.  siz
1dfc0 65 5f 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20  e_t n;.  int rc 
1dfd0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  = SHELL_OPEN_UNS
1dfe0 50 45 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  PEC;.  char zBuf
1dff0 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d  [100];.  if( f==
1e000 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 66 6c  0 ){.    if( dfl
1e010 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1e020 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1e030 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1e040 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45        return SHE
1e050 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b  LL_OPEN_ZIPFILE;
1e060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e070 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f     return SHELL_
1e080 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
1e090 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 66 72 65   }.  }.  n = fre
1e0a0 61 64 28 7a 42 75 66 2c 20 31 36 2c 20 31 2c 20  ad(zBuf, 16, 1, 
1e0b0 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
1e0c0 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
1e0d0 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 22  SQLite format 3"
1e0e0 2c 20 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 16)==0 ){.    
1e0f0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 20 20 72  fclose(f);.    r
1e100 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e  eturn SHELL_OPEN
1e110 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 66  _NORMAL;.  }.  f
1e120 73 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45  seek(f, -25, SEE
1e130 4b 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72  K_END);.  n = fr
1e140 65 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c  ead(zBuf, 25, 1,
1e150 20 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20   f);.  if( n==1 
1e160 26 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  && memcmp(zBuf, 
1e170 22 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65  "Start-Of-SQLite
1e180 33 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20  3-", 17)==0 ){. 
1e190 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1e1a0 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20  EN_APPENDVFS;.  
1e1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b  }else{.    fseek
1e1c0 28 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e  (f, -22, SEEK_EN
1e1d0 44 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  D);.    n = frea
1e1e0 64 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66  d(zBuf, 22, 1, f
1e1f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20  );.    if( n==1 
1e200 26 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30  && zBuf[0]==0x50
1e210 20 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34   && zBuf[1]==0x4
1e220 62 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78  b && zBuf[2]==0x
1e230 30 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75  05.       && zBu
1e240 66 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20  f[3]==0x06 ){.  
1e250 20 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f      rc = SHELL_O
1e260 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20  PEN_ZIPFILE;.   
1e270 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 30 20   }else if( n==0 
1e280 26 26 20 64 66 6c 74 5a 69 70 20 26 26 20 73 71  && dfltZip && sq
1e290 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 25  lite3_strlike("%
1e2a0 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d 3d  .zip",zName,0)==
1e2b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e2c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1e2d0 4c 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LE;.    }.  }.  
1e2e0 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 72 65 74  fclose(f);.  ret
1e2f0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 0a 23 69 66  urn rc;  .}..#if
1e300 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1e310 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 2f 2a  E_DESERIALIZE./*
1e320 0a 2a 2a 20 52 65 63 6f 6e 73 74 72 75 63 74 20  .** Reconstruct 
1e330 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1e340 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1e350 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20  output from the 
1e360 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 70 72 6f  "dbtotxt".** pro
1e370 67 72 61 6d 2e 20 20 52 65 61 64 20 63 6f 6e 74  gram.  Read cont
1e380 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ent from the fil
1e390 65 20 69 6e 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  e in p->zDbFilen
1e3a0 61 6d 65 2e 20 20 49 66 20 70 2d 3e 7a 44 62 46  ame.  If p->zDbF
1e3b0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 69 73 20 30 2c  ilename.** is 0,
1e3c0 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d 20   then read from 
1e3d0 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2e 0a  standard input..
1e3e0 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
1e3f0 65 64 20 63 68 61 72 20 2a 72 65 61 64 48 65 78  ed char *readHex
1e400 44 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  Db(ShellState *p
1e410 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b 0a  , int *pnData){.
1e420 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e430 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  *a = 0;.  int nL
1e440 69 6e 65 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ine;.  int n = 0
1e450 3b 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 30  ;.  int pgsz = 0
1e460 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20  ;.  int iOffset 
1e470 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b  = 0;.  int j, k;
1e480 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46 49 4c  .  int rc;.  FIL
1e490 45 20 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65  E *in;.  unsigne
1e4a0 64 20 69 6e 74 20 78 5b 31 36 5d 3b 0a 20 20 63  d int x[16];.  c
1e4b0 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
1e4c0 0a 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c  .  if( p->zDbFil
1e4d0 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e 20  ename ){.    in 
1e4e0 3d 20 66 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69  = fopen(p->zDbFi
1e4f0 6c 65 6e 61 6d 65 2c 20 22 72 22 29 3b 0a 20 20  lename, "r");.  
1e500 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
1e510 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e520 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
1e530 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
1e540 20 72 65 61 64 69 6e 67 5c 6e 22 2c 20 70 2d 3e   reading\n", p->
1e550 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
1e560 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e570 20 20 7d 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20    }.    nLine = 
1e580 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e590 69 6e 20 3d 20 70 2d 3e 69 6e 3b 0a 20 20 20 20  in = p->in;.    
1e5a0 6e 4c 69 6e 65 20 3d 20 70 2d 3e 6c 69 6e 65 6e  nLine = p->linen
1e5b0 6f 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  o;.    if( in==0
1e5c0 20 29 20 69 6e 20 3d 20 73 74 64 69 6e 3b 0a 20   ) in = stdin;. 
1e5d0 20 7d 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 30   }.  *pnData = 0
1e5e0 3b 0a 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 69  ;.  nLine++;.  i
1e5f0 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20  f( fgets(zLine, 
1e600 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69  sizeof(zLine), i
1e610 6e 29 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65 61  n)==0 ) goto rea
1e620 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e630 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e640 65 2c 20 22 7c 20 73 69 7a 65 20 25 64 20 70 61  e, "| size %d pa
1e650 67 65 73 69 7a 65 20 25 64 22 2c 20 26 6e 2c 20  gesize %d", &n, 
1e660 26 70 67 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  &pgsz);.  if( rc
1e670 21 3d 32 20 29 20 67 6f 74 6f 20 72 65 61 64 48  !=2 ) goto readH
1e680 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 69 66  exDb_error;.  if
1e690 28 20 6e 3c 30 20 29 20 67 6f 74 6f 20 72 65 61  ( n<0 ) goto rea
1e6a0 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e6b0 69 66 28 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20  if( pgsz<512 || 
1e6c0 70 67 73 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70  pgsz>65536 || (p
1e6d0 67 73 7a 26 28 70 67 73 7a 2d 31 29 29 21 3d 30  gsz&(pgsz-1))!=0
1e6e0 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44   ) goto readHexD
1e6f0 62 5f 65 72 72 6f 72 3b 0a 20 20 6e 20 3d 20 28  b_error;.  n = (
1e700 6e 2b 70 67 73 7a 2d 31 29 26 7e 28 70 67 73 7a  n+pgsz-1)&~(pgsz
1e710 2d 31 29 3b 20 20 2f 2a 20 52 6f 75 6e 64 20 6e  -1);  /* Round n
1e720 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1e730 6d 75 6c 74 69 70 6c 65 20 6f 66 20 70 67 73 7a  multiple of pgsz
1e740 20 2a 2f 0a 20 20 61 20 3d 20 73 71 6c 69 74 65   */.  a = sqlite
1e750 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 3f 20 6e 20  3_malloc( n ? n 
1e760 3a 20 31 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d  : 1 );.  if( a==
1e770 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
1e780 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75  intf(stderr, "Ou
1e790 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29  t of memory!\n")
1e7a0 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e7b0 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e7c0 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e    memset(a, 0, n
1e7d0 29 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31  );.  if( pgsz<51
1e7e0 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20  2 || pgsz>65536 
1e7f0 7c 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a  || (pgsz & (pgsz
1e800 2d 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75  -1))!=0 ){.    u
1e810 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e820 72 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  r, "invalid page
1e830 73 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  size\n");.    go
1e840 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e850 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c  or;.  }.  for(nL
1e860 69 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a 4c 69  ine++; fgets(zLi
1e870 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e880 29 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65  ), in)!=0; nLine
1e890 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73  ++){.    rc = ss
1e8a0 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70  canf(zLine, "| p
1e8b0 61 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64  age %d offset %d
1e8c0 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20  ", &j, &k);.    
1e8d0 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20  if( rc==2 ){.   
1e8e0 20 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a     iOffset = k;.
1e8f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e900 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
1e910 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20  rncmp(zLine, "| 
1e920 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  end ", 6)==0 ){.
1e930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e940 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61   }.    rc = ssca
1e950 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20  nf(zLine,"| %d: 
1e960 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e970 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e980 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 22   %x %x %x %x %x"
1e990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e9a0 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b    &j, &x[0], &x[
1e9b0 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d  1], &x[2], &x[3]
1e9c0 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20  , &x[4], &x[5], 
1e9d0 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20  &x[6], &x[7],.  
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 78                &x
1e9f0 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31  [8], &x[9], &x[1
1ea00 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31  0], &x[11], &x[1
1ea10 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31  2], &x[13], &x[1
1ea20 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20  4], &x[15]);.   
1ea30 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20   if( rc==17 ){. 
1ea40 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74       k = iOffset
1ea50 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b  +j;.      if( k+
1ea60 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  16<=n ){.       
1ea70 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1ea80 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36   for(ii=0; ii<16
1ea90 3b 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20  ; ii++) a[k+ii] 
1eaa0 3d 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20  = x[ii]&0xff;.  
1eab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1eac0 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b 0a 20    *pnData = n;. 
1ead0 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29   if( in!=p->in )
1eae0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1eaf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1eb00 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65  ->lineno = nLine
1eb10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1eb20 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72 72  ;..readHexDb_err
1eb30 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 70 2d  or:.  if( in!=p-
1eb40 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  >in ){.    fclos
1eb50 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
1eb60 20 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73      while( fgets
1eb70 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1eb80 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21 3d 30  Line), p->in)!=0
1eb90 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b   ){.      nLine+
1eba0 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74 72 6e  +;.      if(strn
1ebb0 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e  cmp(zLine, "| en
1ebc0 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62 72 65  d ", 6)==0 ) bre
1ebd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ak;.    }.    p-
1ebe0 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65 3b  >lineno = nLine;
1ebf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1ec00 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38 5f 70  ree(a);.  utf8_p
1ec10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
1ec20 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f  ror on line %d o
1ec30 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75 74 5c  f --hexdb input\
1ec40 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 72 65  n", nLine);.  re
1ec50 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1ec60 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
1ec70 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f  E_DESERIALIZE */
1ec80 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66  ../*.** Scalar f
1ec90 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 69  unction "shell_i
1eca0 6e 74 33 32 22 2e 20 54 68 65 20 66 69 72 73 74  nt32". The first
1ecb0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1ecc0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  s function.** mu
1ecd0 73 74 20 62 65 20 61 20 62 6c 6f 62 2e 20 54 68  st be a blob. Th
1ece0 65 20 73 65 63 6f 6e 64 20 61 20 6e 6f 6e 2d 6e  e second a non-n
1ecf0 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e  egative integer.
1ed00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
1ed10 2a 20 72 65 61 64 73 20 61 6e 64 20 72 65 74 75  * reads and retu
1ed20 72 6e 73 20 61 20 33 32 2d 62 69 74 20 62 69 67  rns a 32-bit big
1ed30 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1ed40 66 72 6f 6d 20 62 79 74 65 0a 2a 2a 20 6f 66 66  from byte.** off
1ed50 73 65 74 20 28 34 2a 3c 61 72 67 32 3e 29 20 6f  set (4*<arg2>) o
1ed60 66 20 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f 0a 73  f the blob..*/.s
1ed70 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
1ed80 49 6e 74 33 32 28 0a 20 20 73 71 6c 69 74 65 33  Int32(.  sqlite3
1ed90 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1eda0 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
1edb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1edc0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
1edd0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ede0 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
1edf0 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 49 6e 74  Blob;.  int iInt
1ee00 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
1ee10 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6e  METER(argc);.  n
1ee20 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
1ee30 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1ee40 30 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 28  0]);.  pBlob = (
1ee50 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ee60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1ee70 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
1ee80 3b 0a 20 20 69 49 6e 74 20 3d 20 73 71 6c 69 74  ;.  iInt = sqlit
1ee90 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
1eea0 76 5b 31 5d 29 3b 0a 0a 20 20 69 66 28 20 69 49  v[1]);..  if( iI
1eeb0 6e 74 3e 3d 30 20 26 26 20 28 69 49 6e 74 2b 31  nt>=0 && (iInt+1
1eec0 29 2a 34 3c 3d 6e 42 6c 6f 62 20 29 7b 0a 20 20  )*4<=nBlob ){.  
1eed0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1eee0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 42 6c 6f   char *a = &pBlo
1eef0 62 5b 69 49 6e 74 2a 34 5d 3b 0a 20 20 20 20 73  b[iInt*4];.    s
1ef00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
1ef10 6c 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e  l = ((sqlite3_in
1ef20 74 36 34 29 61 5b 30 5d 3c 3c 32 34 29 0a 20 20  t64)a[0]<<24).  
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33       + ((sqlite3
1ef50 5f 69 6e 74 36 34 29 61 5b 31 5d 3c 3c 31 36 29  _int64)a[1]<<16)
1ef60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef70 20 20 20 20 20 20 20 20 2b 20 28 28 73 71 6c 69          + ((sqli
1ef80 74 65 33 5f 69 6e 74 36 34 29 61 5b 32 5d 3c 3c  te3_int64)a[2]<<
1ef90 20 38 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   8).            
1efa0 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 73             + ((s
1efb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 33  qlite3_int64)a[3
1efc0 5d 3c 3c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ]<< 0);.    sqli
1efd0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
1efe0 28 63 6f 6e 74 65 78 74 2c 20 69 56 61 6c 29 3b  (context, iVal);
1eff0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
1f000 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73  alar function "s
1f010 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
1f020 22 20 75 73 65 64 20 62 79 20 74 68 65 20 2e 72  " used by the .r
1f030 65 63 6f 76 65 72 20 63 6f 6d 6d 61 6e 64 2e 0a  ecover command..
1f040 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
1f050 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1f060 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6f  unction is the o
1f070 75 74 70 75 74 20 6f 66 20 62 75 69 6c 74 2d 69  utput of built-i
1f080 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 71 75  n.** function qu
1f090 6f 74 65 28 29 2e 20 49 66 20 74 68 65 20 66 69  ote(). If the fi
1f0a0 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1f0b0 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 22 27   the input is "'
1f0c0 22 2c 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  ", .** indicatin
1f0d0 67 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  g that the value
1f0e0 20 70 61 73 73 65 64 20 74 6f 20 71 75 6f 74 65   passed to quote
1f0f0 28 29 20 77 61 73 20 61 20 74 65 78 74 20 76 61  () was a text va
1f100 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  lue,.** then thi
1f110 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
1f120 68 65 73 20 74 68 65 20 69 6e 70 75 74 20 66 6f  hes the input fo
1f130 72 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20  r "\n" and "\r" 
1f140 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 61 6e  characters.** an
1f150 64 20 61 64 64 73 20 61 20 77 72 61 70 70 65 72  d adds a wrapper
1f160 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
1f170 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1f180 20 20 20 72 65 70 6c 61 63 65 28 72 65 70 6c 61     replace(repla
1f190 63 65 28 3c 69 6e 70 75 74 3e 2c 20 27 5c 6e 27  ce(<input>, '\n'
1f1a0 2c 20 63 68 61 72 28 31 30 29 2c 20 27 5c 72 27  , char(10), '\r'
1f1b0 2c 20 63 68 61 72 28 31 33 29 29 3b 0a 2a 2a 0a  , char(13));.**.
1f1c0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69  ** Or, if the fi
1f1d0 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1f1e0 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
1f1f0 74 20 22 27 22 2c 20 74 68 65 6e 20 61 20 63 6f  t "'", then a co
1f200 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70  py.** of the inp
1f210 75 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ut is returned..
1f220 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1f230 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 28 0a  hellEscapeCrnl(.
1f240 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f250 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
1f260 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
1f270 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1f280 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1f290 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
1f2a0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1f2b0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1f2c0 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ]);.  UNUSED_PAR
1f2d0 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
1f2e0 69 66 28 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 5c  if( zText[0]=='\
1f2f0 27 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  '' ){.    int nT
1f300 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ext = sqlite3_va
1f310 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1f320 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ]);.    int i;. 
1f330 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30     char zBuf1[20
1f340 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ];.    char zBuf
1f350 32 5b 32 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74  2[20];.    const
1f360 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a   char *zNL = 0;.
1f370 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f380 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zCR = 0;.    int
1f390 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e   nCR = 0;.    in
1f3a0 74 20 6e 4e 4c 20 3d 20 30 3b 0a 0a 20 20 20 20  t nNL = 0;..    
1f3b0 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
1f3c0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
1f3d0 66 28 20 7a 4e 4c 3d 3d 30 20 26 26 20 7a 54 65  f( zNL==0 && zTe
1f3e0 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  xt[i]=='\n' ){. 
1f3f0 20 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75         zNL = unu
1f400 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74  sed_string(zText
1f410 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22  , "\\n", "\\012"
1f420 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 20 20  , zBuf1);.      
1f430 20 20 6e 4e 4c 20 3d 20 28 69 6e 74 29 73 74 72    nNL = (int)str
1f440 6c 65 6e 28 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  len(zNL);.      
1f450 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52 3d  }.      if( zCR=
1f460 3d 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d  =0 && zText[i]==
1f470 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f480 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
1f490 69 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 72 22  ing(zText, "\\r"
1f4a0 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
1f4b0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 52 20 3d  );.        nCR =
1f4c0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 52   (int)strlen(zCR
1f4d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f4e0 0a 0a 20 20 20 20 69 66 28 20 7a 4e 4c 20 7c 7c  ..    if( zNL ||
1f4f0 20 7a 43 52 20 29 7b 0a 20 20 20 20 20 20 69 6e   zCR ){.      in
1f500 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t iOut = 0;.    
1f510 20 20 69 36 34 20 6e 4d 61 78 20 3d 20 28 6e 4e    i64 nMax = (nN
1f520 4c 20 3e 20 6e 43 52 29 20 3f 20 6e 4e 4c 20 3a  L > nCR) ? nNL :
1f530 20 6e 43 52 3b 0a 20 20 20 20 20 20 69 36 34 20   nCR;.      i64 
1f540 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 61 78 20 2a 20  nAlloc = nMax * 
1f550 6e 54 65 78 74 20 2b 20 28 6e 4d 61 78 2b 36 34  nText + (nMax+64
1f560 29 2a 32 3b 0a 20 20 20 20 20 20 63 68 61 72 20  )*2;.      char 
1f570 2a 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 73  *zOut = (char*)s
1f580 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1f590 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  nAlloc);.      i
1f5a0 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
1f5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1f5c0 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1f5d0 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
1f5e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1f5f0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   }..      if( zN
1f600 4c 20 26 26 20 7a 43 52 20 29 7b 0a 20 20 20 20  L && zCR ){.    
1f610 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f620 5b 69 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65  [iOut], "replace
1f630 28 72 65 70 6c 61 63 65 28 22 2c 20 31 36 29 3b  (replace(", 16);
1f640 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d  .        iOut +=
1f650 20 31 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   16;.      }else
1f660 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1f670 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72  (&zOut[iOut], "r
1f680 65 70 6c 61 63 65 28 22 2c 20 38 29 3b 0a 20 20  eplace(", 8);.  
1f690 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 38 3b        iOut += 8;
1f6a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1f6b0 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d  or(i=0; zText[i]
1f6c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f6d0 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c  if( zText[i]=='\
1f6e0 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n' ){.          
1f6f0 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f700 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 0a 20  t], zNL, nNL);. 
1f710 20 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d           iOut +=
1f720 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65   nNL;.        }e
1f730 6c 73 65 20 69 66 28 20 7a 54 65 78 74 5b 69 5d  lse if( zText[i]
1f740 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
1f750 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f760 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75  );.          iOu
1f780 74 20 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20  t += nCR;.      
1f790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f7a0 20 20 20 7a 4f 75 74 5b 69 4f 75 74 5d 20 3d 20     zOut[iOut] = 
1f7b0 7a 54 65 78 74 5b 69 5d 3b 0a 20 20 20 20 20 20  zText[i];.      
1f7c0 20 20 20 20 69 4f 75 74 2b 2b 3b 0a 20 20 20 20      iOut++;.    
1f7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1f7e0 20 20 20 20 20 69 66 28 20 7a 4e 4c 20 29 7b 0a       if( zNL ){.
1f7f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f800 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22  zOut[iOut], ",'"
1f810 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b  , 2); iOut += 2;
1f820 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f830 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c  &zOut[iOut], zNL
1f840 2c 20 6e 4e 4c 29 3b 20 69 4f 75 74 20 2b 3d 20  , nNL); iOut += 
1f850 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nNL;.        mem
1f860 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f870 20 22 27 2c 20 63 68 61 72 28 31 30 29 29 22 2c   "', char(10))",
1f880 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32   12); iOut += 12
1f890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f8a0 69 66 28 20 7a 43 52 20 29 7b 0a 20 20 20 20 20  if( zCR ){.     
1f8b0 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f8c0 69 4f 75 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b  iOut], ",'", 2);
1f8d0 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20   iOut += 2;.    
1f8e0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f8f0 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f900 29 3b 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a  ); iOut += nCR;.
1f910 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f920 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20  zOut[iOut], "', 
1f930 63 68 61 72 28 31 33 29 29 22 2c 20 31 32 29 3b  char(13))", 12);
1f940 20 69 4f 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20   iOut += 12;.   
1f950 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1f960 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1f970 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 69  context, zOut, i
1f980 4f 75 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Out, SQLITE_TRAN
1f990 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
1f9a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
1f9b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1f9c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1f9d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1f9e0 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
1f9f0 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20 46 6c 61 67 73  0]);.}../* Flags
1fa00 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a   for open_db()..
1fa10 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1fa20 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70  t behavior of op
1fa30 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78  en_db() is to ex
1fa40 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61 74  it(1) if the dat
1fa50 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a  abase fails to.*
1fa60 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45  * open.  The OPE
1fa70 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66  N_DB_KEEPALIVE f
1fa80 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61 74  lag changes that
1fa90 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e   so that it prin
1faa0 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62  ts an error.** b
1fab0 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  ut still returns
1fac0 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
1fad0 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   exit..**.** The
1fae0 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45   OPEN_DB_ZIPFILE
1faf0 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65   flag causes ope
1fb00 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65 72  n_db() to prefer
1fb10 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61   to open files a
1fb20 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69  s a.** ZIP archi
1fb30 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  ve if the file d
1fb40 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
1fb50 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74   is empty and it
1fb60 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a  s name matches.*
1fb70 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74  * the *.zip patt
1fb80 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ern..*/.#define 
1fb90 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1fba0 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52  E   0x001   /* R
1fbb0 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f  eturn after erro
1fbc0 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65  r if true */.#de
1fbd0 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50  fine OPEN_DB_ZIP
1fbe0 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20 20  FILE     0x002  
1fbf0 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20   /* Open as ZIP 
1fc00 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  if name matches 
1fc10 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *.zip */../*.** 
1fc20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
1fc30 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
1fc40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1fc50 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
1fc60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1fc70 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
1fc80 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
1fc90 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
1fca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fcb0 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
1fcc0 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46  te *p, int openF
1fcd0 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e  lags){.  if( p->
1fce0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  db==0 ){.    if(
1fcf0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1fd00 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20  ELL_OPEN_UNSPEC 
1fd10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1fd20 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  zDbFilename==0 |
1fd30 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  | p->zDbFilename
1fd40 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1fd50 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
1fd60 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1fd70 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  L;.      }else{.
1fd80 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
1fd90 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65  ode = (u8)deduce
1fda0 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
1fdb0 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  zDbFilename, .  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e             (open
1fde0 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
1fdf0 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20  ZIPFILE)!=0);.  
1fe00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fe10 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d  switch( p->openM
1fe20 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
1fe30 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  e SHELL_OPEN_APP
1fe40 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20  ENDVFS: {.      
1fe50 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1fe60 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1fe70 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  , &p->db, .     
1fe80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1fe90 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1fea0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1feb0 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20  "apndvfs");.    
1fec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fed0 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1fee0 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a  ELL_OPEN_HEXDB:.
1fef0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1ff00 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1ff10 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1ff20 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d  ite3_open(0, &p-
1ff30 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1ff40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ff50 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1ff60 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20  EN_ZIPFILE: {.  
1ff70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ff80 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
1ff90 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1ffa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ffb0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1ffc0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b  OPEN_READONLY: {
1ffd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ffe0 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1fff0 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
20000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
20010 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
20020 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20030 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
20040 4c 4c 5f 4f 50 45 4e 5f 53 48 41 52 45 44 53 43  LL_OPEN_SHAREDSC
20050 48 45 4d 41 3a 20 7b 0a 20 20 20 20 20 20 20 20  HEMA: {.        
20060 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
20070 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
20080 26 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  &p->db,.        
20090 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
200a0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
200b0 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
200c0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 5f 53 43  E_OPEN_SHARED_SC
200d0 48 45 4d 41 2c 30 29 3b 0a 20 20 20 20 20 20 20  HEMA,0);.       
200e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
200f0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
20100 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20  _OPEN_UNSPEC:.  
20110 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
20120 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20  PEN_NORMAL: {.  
20130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
20140 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  en(p->zDbFilenam
20150 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20  e, &p->db);.    
20160 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20170 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f   }.    }.    glo
20180 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  balDb = p->db;. 
20190 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
201a0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
201b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
201c0 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74  >db) ){.      ut
201d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
201e0 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
201f0 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
20200 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a   \"%s\": %s\n",.
20210 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62            p->zDb
20220 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
20230 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
20240 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 65 6e  ;.      if( open
20250 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
20260 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20 20 20  KEEPALIVE ){.   
20270 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
20280 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70  n(":memory:", &p
20290 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 72  ->db);.        r
202a0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
202b0 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
202c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
202d0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
202e0 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74  ENSION.    sqlit
202f0 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65  e3_enable_load_e
20300 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20  xtension(p->db, 
20310 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  1);.#endif.    s
20320 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
20330 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
20340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61  .    sqlite3_sha
20350 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62  three_init(p->db
20360 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
20370 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  ite3_completion_
20380 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
20390 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
203a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
203b0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
203c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
203d0 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 0a  LE_DBPAGE_VTAB).
203e0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 64 61      sqlite3_dbda
203f0 74 61 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ta_init(p->db, 0
20400 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  , 0);.#endif.#if
20410 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
20420 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33  ZLIB.    sqlite3
20430 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d  _zipfile_init(p-
20440 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
20450 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e  sqlite3_sqlar_in
20460 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
20470 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
20480 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20490 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
204a0 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33  l_add_schema", 3
204b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
204c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
204e0 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65  ellAddSchemaName
204f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
20500 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
20510 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65  tion(p->db, "she
20520 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
20530 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
20540 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68    shellModuleSch
20570 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ema, 0, 0);.    
20580 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20590 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
205a0 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31  shell_putsnl", 1
205b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
205c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
205e0 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20  ellPutsFunc, 0, 
205f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
20600 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20610 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 65 73  p->db, "shell_es
20620 63 61 70 65 5f 63 72 6e 6c 22 2c 20 31 2c 20 53  cape_crnl", 1, 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 45 73 63 61 70 65 43 72 6e 6c 2c 20 30 2c 20 30  EscapeCrnl, 0, 0
20670 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
20680 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
20690 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 69 6e 74  ->db, "shell_int
206a0 33 32 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  32", 2, SQLITE_U
206b0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 20 20 73 68 65 6c 6c 49 6e 74 33 32 2c 20      shellInt32, 
206e0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
206f0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
20700 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  TEM.    sqlite3_
20710 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20720 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31  p->db, "edit", 1
20730 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
20740 2c 0a 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 20 65 64                ed
20760 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  itFunc, 0, 0);. 
20770 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20780 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20790 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c  , "edit", 2, SQL
207a0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_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 20 65 64 69 74 46 75 6e           editFun
207d0 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  c, 0, 0);.#endif
207e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
207f0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
20800 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
20810 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
20820 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
20830 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
20840 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
20850 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
20860 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
20870 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
20880 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
20890 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
208a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
208b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
208c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
208d0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
208e0 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  IZE.    else.   
208f0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20900 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  ==SHELL_OPEN_DES
20910 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f  ERIALIZE || p->o
20920 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
20930 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20  PEN_HEXDB ){.   
20940 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
20950 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a   int nData = 0;.
20960 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
20970 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 20 20  har *aData;.    
20980 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
20990 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  e==SHELL_OPEN_DE
209a0 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20  SERIALIZE ){.   
209b0 20 20 20 20 20 61 44 61 74 61 20 3d 20 28 75 6e       aData = (un
209c0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72 65 61  signed char*)rea
209d0 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65  dFile(p->zDbFile
209e0 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20  name, &nData);. 
209f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20a00 20 20 20 20 61 44 61 74 61 20 3d 20 72 65 61 64      aData = read
20a10 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74 61 29  HexDb(p, &nData)
20a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  ;.        if( aD
20a30 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
20a40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
20a50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20a70 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e  _deserialize(p->
20a80 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74  db, "main", aDat
20a90 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c  a, nData, nData,
20aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ab0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
20ac0 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
20ad0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
20ae0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
20af0 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e  SERIALIZE_FREEON
20b00 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66  CLOSE);.      if
20b10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
20b20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20b30 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20b40 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
20b50 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
20b60 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
20b70 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78      if( p->szMax
20b80 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
20b90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
20ba0 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
20bb0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
20bc0 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73  IZE_LIMIT, &p->s
20bd0 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMax);.      }. 
20be0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
20bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
20c00 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
20c10 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f  tabaes connectio
20c20 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72  n.  Report error
20c30 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65  s..*/.void close
20c40 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _db(sqlite3 *db)
20c50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
20c60 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
20c70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20c80 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20c90 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20ca0 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75  te3_close() retu
20cb0 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20  rns %d: %s\n",. 
20cc0 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74         rc, sqlit
20cd0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
20ce0 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45    } .}..#if HAVE
20cf0 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56  _READLINE || HAV
20d00 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a  E_EDITLINE./*.**
20d10 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65   Readline comple
20d20 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a  tion callbacks.*
20d30 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
20d40 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
20d50 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e  on_generator(con
20d60 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69  st char *text, i
20d70 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61  nt state){.  sta
20d80 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  tic sqlite3_stmt
20d90 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
20da0 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28  har *zRet;.  if(
20db0 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20   state==0 ){.   
20dc0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
20dd0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20de0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
20df0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
20e00 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
20e10 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
20e20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE 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 20 22 20 20 46 52             "  FR
20e50 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
20e60 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74  ) ORDER BY 1", t
20e70 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
20e80 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
20e90 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
20ea0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
20eb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
20ec0 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ql);.  }.  if( s
20ed0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
20ee0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
20ef0 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72  {.    zRet = str
20f00 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  dup((const char*
20f10 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
20f20 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
20f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
20f40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20f50 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
20f60 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d   = 0;.    zRet =
20f70 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20f80 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20   zRet;.}.static 
20f90 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f  char **readline_
20fa0 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
20fb0 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
20fc0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
20fd0 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70  nd){.  rl_attemp
20fe0 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f  ted_completion_o
20ff0 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ver = 1;.  retur
21000 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  n rl_completion_
21010 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72  matches(zText, r
21020 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
21030 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d  on_generator);.}
21040 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e  ..#elif HAVE_LIN
21050 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e  ENOISE./*.** Lin
21060 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f  enoise completio
21070 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  n callback.*/.st
21080 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f  atic void lineno
21090 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63  ise_completion(c
210a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65  onst char *zLine
210b0 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c  , linenoiseCompl
210c0 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69  etions *lc){.  i
210d0 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65  nt nLine = strle
210e0 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e  n30(zLine);.  in
210f0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73  t i, iStart;.  s
21100 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
21110 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
21120 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75  zSql;.  char zBu
21130 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20  f[1000];..  if( 
21140 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75  nLine>sizeof(zBu
21150 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a  f)-30 ) return;.
21160 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
21170 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d  '.' || zLine[0]=
21180 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20  ='#') return;.  
21190 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69  for(i=nLine-1; i
211a0 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  >=0 && (isalnum(
211b0 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69  zLine[i]) || zLi
211c0 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d  ne[i]=='_'); i--
211d0 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69  ){}.  if( i==nLi
211e0 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  ne-1 ) return;. 
211f0 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20   iStart = i+1;. 
21200 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c   memcpy(zBuf, zL
21210 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ine, iStart);.  
21220 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
21230 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
21240 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
21250 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
21260 22 0a 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 20 22 20 20 46 52             "  FR
21280 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
21290 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  ,%Q) ORDER BY 1"
212a0 2c 0a 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 20 26 7a 4c 69 6e             &zLin
212c0 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65  e[iStart], zLine
212d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  );.  sqlite3_pre
212e0 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62  pare_v2(globalDb
212f0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
21300 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
21310 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
21320 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
21330 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70  balDb, "PRAGMA p
21340 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30  age_count", 0, 0
21350 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68  , 0); /* Load th
21360 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68  e schema */.  wh
21370 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
21380 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
21390 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
213a0 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74  t char *zComplet
213b0 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ion = (const cha
213c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
213d0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
213e0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c  ;.    int nCompl
213f0 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  etion = sqlite3_
21400 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
21410 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
21420 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69  iStart+nCompleti
21430 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  on < sizeof(zBuf
21440 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-1 ){.      mem
21450 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c  cpy(zBuf+iStart,
21460 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43   zCompletion, nC
21470 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20  ompletion+1);.  
21480 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64      linenoiseAdd
21490 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a  Completion(lc, z
214a0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
214b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
214c0 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e  ze(pStmt);.}.#en
214d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d  dif../*.** Do C-
214e0 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64  language style d
214f0 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  equoting..**.** 
21500 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72     \a    -> alar
21510 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e  m.**    \b    ->
21520 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20   backspace.**   
21530 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a   \t    -> tab.**
21540 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77      \n    -> new
21550 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20  line.**    \v   
21560 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62   -> vertical tab
21570 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20  .**    \f    -> 
21580 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20  form feed.**    
21590 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
215a0 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
215b0 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a  s    -> space.**
215c0 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a      \"    -> ".*
215d0 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a  *    \'    -> '.
215e0 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62  **    \\    -> b
215f0 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c  ackslash.**    \
21600 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68  NNN  -> ascii ch
21610 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f  aracter NNN in o
21620 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ctal.*/.static v
21630 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  oid resolve_back
21640 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29  slashes(char *z)
21650 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
21660 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28  char c;.  while(
21670 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20   *z && *z!='\\' 
21680 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  ) z++;.  for(i=j
21690 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
216a0 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  0; i++, j++){.  
216b0 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26    if( c=='\\' &&
216c0 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20   z[i+1]!=0 ){.  
216d0 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
216e0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27        if( c=='a'
216f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21700 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\a';.      }els
21710 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a  e if( c=='b' ){.
21720 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27          c = '\b'
21730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21740 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
21750 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
21760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21770 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='n' ){.        
21780 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  c = '\n';.      
21790 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27  }else if( c=='v'
217a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
217b0 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\v';.      }els
217c0 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a  e if( c=='f' ){.
217d0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
217e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
217f0 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20  ( c=='r' ){.    
21800 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
21810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21820 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
21830 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d  c = '"';.      }
21840 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27  else if( c=='\''
21850 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21860 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\'';.      }els
21870 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b  e if( c=='\\' ){
21880 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c  .        c = '\\
21890 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
218a0 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
218b0 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '7' ){.        c
218c0 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20   -= '0';.       
218d0 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
218e0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
218f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
21900 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
21910 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
21920 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  '0';.          i
21930 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
21940 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
21950 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
21960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20  ;.            c 
21970 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
21980 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
21990 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
219a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
219b0 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  [j] = c;.  }.  i
219c0 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20  f( j<i ) z[j] = 
219d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
219e0 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69  rpret zArg as ei
219f0 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
21a00 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  or a boolean val
21a10 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72  ue.  Return 1 or
21a20 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61   0.** for TRUE a
21a30 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72  nd FALSE.  Retur
21a40 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  n the integer va
21a50 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61  lue if appropria
21a60 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
21a70 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63  t booleanValue(c
21a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
21a90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
21aa0 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
21ab0 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
21ac0 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65  .    for(i=2; he
21ad0 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
21ae0 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a  [i])>=0; i++){}.
21af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
21b00 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27  (i=0; zArg[i]>='
21b10 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27  0' && zArg[i]<='
21b20 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20  9'; i++){}.  }. 
21b30 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67   if( i>0 && zArg
21b40 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [i]==0 ) return 
21b50 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c  (int)(integerVal
21b60 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66  ue(zArg) & 0xfff
21b70 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71  fffff);.  if( sq
21b80 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
21b90 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20  rg, "on")==0 || 
21ba0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21bb0 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29  zArg,"yes")==0 )
21bc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21bd0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
21be0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
21bf0 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c  "off")==0 || sql
21c00 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21c10 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  g,"no")==0 ){.  
21c20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21c30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
21c40 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
21c50 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  t a boolean valu
21c60 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d  e: \"%s\". Assum
21c70 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a  ing \"no\".\n",.
21c80 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b            zArg);
21c90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21ca0 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
21cb0 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20  ar a shell flag 
21cc0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62  according to a b
21cd0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f  oolean value..*/
21ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
21cf0 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c  OrClearFlag(Shel
21d00 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67  lState *p, unsig
21d10 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74  ned mFlag, const
21d20 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
21d30 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
21d40 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68  (zArg) ){.    Sh
21d50 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46  ellSetFlag(p, mF
21d60 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lag);.  }else{. 
21d70 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
21d80 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d  g(p, mFlag);.  }
21d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
21da0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20  an output file, 
21db0 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e  assuming it is n
21dc0 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64  ot stderr or std
21dd0 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
21de0 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63  id output_file_c
21df0 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  lose(FILE *f){. 
21e00 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64   if( f && f!=std
21e10 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72  out && f!=stderr
21e20 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a   ) fclose(f);.}.
21e30 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70  ./*.** Try to op
21e40 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  en an output fil
21e50 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22  e.   The names "
21e60 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64  stdout" and "std
21e70 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f  err" are.** reco
21e80 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68  gnized and do th
21e90 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20  e right thing.  
21ea0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
21eb0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   if the output.*
21ec0 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f  * filename is "o
21ed0 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ff"..*/.static F
21ee0 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65  ILE *output_file
21ef0 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
21f00 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65   *zFile, int bTe
21f10 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20  xtMode){.  FILE 
21f20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  *f;.  if( strcmp
21f30 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29  (zFile,"stdout")
21f40 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
21f50 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69  tdout;.  }else i
21f60 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
21f70 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b   "stderr")==0 ){
21f80 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b  .    f = stderr;
21f90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
21fa0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22  cmp(zFile, "off"
21fb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
21fc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21fd0 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  f = fopen(zFile,
21fe0 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22   bTextMode ? "w"
21ff0 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66   : "wb");.    if
22000 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( f==0 ){.      
22010 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22020 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
22030 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
22040 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ", zFile);.    }
22050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
22060 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
22070 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
22080 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f  .** A routine fo
22090 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75  r handling outpu
220a0 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74  t from sqlite3_t
220b0 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  race()..*/.stati
220c0 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f  c int sql_trace_
220d0 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69  callback(.  unsi
220e0 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20  gned mType,     
220f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
22100 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20   type */.  void 
22110 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
22120 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53     /* The ShellS
22130 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  tate pointer */.
22140 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20    void *pP,     
22150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75            /* Usu
22160 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
22170 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f  o sqlite_stmt */
22180 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20  .  void *pX     
22190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
221a0 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a  xiliary output *
221b0 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  /.){.  ShellStat
221c0 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
221d0 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69  te*)pArg;.  sqli
221e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
221f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22200 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  Sql;.  int nSql;
22210 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f  .  if( p->traceO
22220 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
22230 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53  ;.  if( mType==S
22240 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
22250 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  E ){.    utf8_pr
22260 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
22270 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61  , "-- closing da
22280 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22290 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  n\n");.    retur
222a0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 0;.  }.  if( m
222b0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41  Type!=SQLITE_TRA
222c0 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73  CE_ROW && ((cons
222d0 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d  t char*)pX)[0]==
222e0 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  '-' ){.    zSql 
222f0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
22300 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  X;.  }else{.    
22310 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
22320 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73  _stmt*)pP;.    s
22330 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65  witch( p->eTrace
22340 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
22350 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  se SHELL_TRACE_E
22360 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20  XPANDED: {.     
22370 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
22380 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70  3_expanded_sql(p
22390 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
223a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
223b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
223c0 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20  LE_NORMALIZE.   
223d0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52     case SHELL_TR
223e0 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20  ACE_NORMALIZED: 
223f0 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
22400 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
22410 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  zed_sql(pStmt);.
22420 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22430 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
22440 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
22450 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
22460 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
22470 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
22480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22490 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30   }.  if( zSql==0
224a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
224b0 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
224c0 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Sql);.  while( n
224d0 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53  Sql>0 && zSql[nS
224e0 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53  ql-1]==';' ){ nS
224f0 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68  ql--; }.  switch
22500 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63  ( mType ){.    c
22510 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
22520 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53  _ROW:.    case S
22530 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
22540 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  : {.      utf8_p
22550 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
22560 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53  t, "%.*s;\n", nS
22570 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ql, zSql);.     
22580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22590 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
225a0 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20  ACE_PROFILE: {. 
225b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
225c0 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28  64 nNanosec = *(
225d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
225e0 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  X;.      utf8_pr
225f0 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
22600 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64  , "%.*s; -- %lld
22610 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53   ns\n", nSql, zS
22620 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20  ql, nNanosec);. 
22630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22650 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22660 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
22670 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
22680 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
22690 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
226a0 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
226b0 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
226c0 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
226d0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
226e0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
226f0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
22700 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
22710 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
22720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
22730 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
22740 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
22750 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
22760 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
22770 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
22780 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
22790 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
227a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
227b0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
227c0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
227d0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
227e0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
227f0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
22800 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
22810 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
22820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
22830 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
22840 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
22850 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
22860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22870 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
22880 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
22890 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
228a0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
228b0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
228c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
228d0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
228e0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
228f0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
22900 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
22910 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
22920 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
22930 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
22940 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
22950 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
22960 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
22970 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
22980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22990 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
229a0 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
229b0 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
229c0 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
229d0 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
229e0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
229f0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
22a00 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
22a10 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
22a20 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
22a30 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
22a40 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
22a50 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
22a60 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
22a70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
22a80 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
22a90 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
22aa0 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
22ab0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
22ac0 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
22ad0 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
22ae0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
22af0 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
22b00 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
22b10 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
22b20 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
22b30 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
22b40 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
22b50 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
22b60 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
22b70 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
22b80 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
22b90 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
22ba0 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
22bb0 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
22bc0 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
22bd0 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
22be0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
22bf0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
22c00 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
22c10 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
22c20 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
22c30 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
22c40 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
22c50 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
22c60 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
22c70 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
22c80 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
22c90 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
22ca0 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
22cb0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
22cc0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
22cd0 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
22ce0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
22cf0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
22d00 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
22d10 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
22d20 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
22d30 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
22d40 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
22d50 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
22d60 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
22d70 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
22d80 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
22d90 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
22da0 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
22db0 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
22dc0 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
22dd0 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
22de0 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
22df0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
22e00 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
22e10 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
22e20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
22e30 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
22e40 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
22e50 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
22e60 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
22e70 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
22e80 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
22e90 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
22ea0 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
22eb0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
22ec0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
22ed0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
22ee0 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
22ef0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
22f00 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
22f10 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
22f20 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
22f30 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
22f40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22f60 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
22f70 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
22f80 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
22f90 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
22fa0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
22fb0 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
22fc0 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
22fd0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
22fe0 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
22ff0 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
23000 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
23010 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
23020 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
23030 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
23040 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
23050 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23060 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
23070 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
23080 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
23090 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
230a0 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
230b0 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
230d0 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
230e0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
230f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
23100 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
23110 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
23120 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
23130 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
23140 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
23150 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
23160 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
23170 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
23180 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
23190 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
231a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
231b0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
231c0 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
231d0 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
231e0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
231f0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
23200 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
23210 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
23220 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
23230 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
23240 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
23250 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
23260 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
23270 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
23280 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
23290 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
232a0 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
232b0 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
232c0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
232d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
232e0 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
232f0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
23300 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
23310 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
23320 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
23330 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
23340 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
23350 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
23360 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
23370 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
23380 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
23390 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
233a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
233b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
233c0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
233d0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
233e0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
233f0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
23400 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
23410 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
23420 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
23430 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
23440 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
23450 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
23460 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
23470 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
23480 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
23490 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
234a0 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
234b0 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
234c0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
234d0 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
234e0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
234f0 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
23500 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
23510 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
23520 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
23530 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
23540 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
23550 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
23560 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
23570 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
23580 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
23590 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
235a0 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
235b0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
235c0 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
235d0 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
235e0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
235f0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
23600 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
23610 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
23620 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
23630 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
23640 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
23650 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
23660 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
23670 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
23680 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
23690 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
236a0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
236b0 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
236c0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
236d0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
236e0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
236f0 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
23700 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
23710 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
23720 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
23730 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
23740 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
23750 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
23760 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
23770 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
23780 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
23790 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
237a0 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
237b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
237c0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
237d0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
237e0 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
237f0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
23800 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
23810 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
23820 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
23830 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
23840 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
23850 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
23860 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
23870 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
23880 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
23890 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
238a0 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
238b0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
238c0 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
238d0 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
238e0 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
238f0 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
23900 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
23910 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
23920 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
23930 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
23940 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
23950 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
23960 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
23970 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23980 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
23990 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
239a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
239b0 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
239c0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
239d0 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
239e0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
239f0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
23a00 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
23a10 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
23a20 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
23a30 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
23a40 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
23a50 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
23a60 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
23a70 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
23a80 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
23a90 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
23aa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23ab0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
23ac0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
23ad0 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
23ae0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
23af0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
23b00 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
23b10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23b20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
23b30 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
23b40 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
23b50 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
23b60 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
23b70 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
23b80 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
23b90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
23ba0 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
23bb0 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
23bc0 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
23bd0 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
23be0 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
23bf0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
23c00 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
23c10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
23c20 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
23c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c40 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
23c50 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
23c60 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
23c70 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
23c80 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
23c90 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
23ca0 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
23cb0 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
23cc0 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
23cd0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
23ce0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
23cf0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23d00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
23d10 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
23d20 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
23d30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
23d40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
23d50 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
23d60 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
23d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d80 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
23d90 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
23da0 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
23db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
23dc0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
23dd0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
23de0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
23df0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
23e00 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
23e10 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
23e20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
23e30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23e40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23e50 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
23e60 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
23e70 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
23e80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23e90 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
23ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23eb0 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
23ec0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
23ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
23ef0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
23f00 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
23f10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23f20 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
23f30 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
23f40 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
23f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
23f60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23f70 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
23f80 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23fa0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
23fb0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
23fc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
23fd0 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
23fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23ff0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
24000 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
24010 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
24020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24030 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
24040 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, 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 20 28 63 6f 6e 73 74 20 63 68         (const ch
24070 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
24080 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
24090 29 2c 0a 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 20                  
240b0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
240c0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
240d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
240e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
240f0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
24100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24110 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
24120 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
24130 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
24140 28 70 51 75 65 72 79 2c 69 29 2c 0a 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 20 73 71 6c 69 74 65 33 5f          sqlite3_
24180 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
24190 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,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 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
241d0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
241e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
241f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24200 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
24210 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
24220 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
24230 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
24240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
24250 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
24260 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
24270 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
24280 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24290 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
242a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
242b0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
242c0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
242d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
242e0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
242f0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
24300 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
24310 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
24320 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
24330 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
24340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
24350 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
24360 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
24370 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
24380 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
24390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
243a0 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
243b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
243c0 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
243d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
243e0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
243f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24400 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
24410 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
24420 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
24430 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
24440 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
24450 2c 0a 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 20 7a                 z
24470 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
24480 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24490 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
244a0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
244b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
244c0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
244d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
244e0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
244f0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
24500 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
24510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24520 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
24530 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
24540 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
24550 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
24560 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
24570 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
24580 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
24590 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
245a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
245b0 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
245c0 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
245d0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
245e0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
245f0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
24600 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
24610 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
24620 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
24630 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
24640 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
24650 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
24660 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
24670 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
24680 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
24690 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
246a0 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
246b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
246c0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
246d0 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
246e0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
246f0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
24700 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
24710 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
24720 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
24730 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
24740 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
24750 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
24760 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
24770 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
24780 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
24790 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
247a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
247b0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
247c0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
247d0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
247e0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
247f0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
24800 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
24810 0a 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 20 22 20 57 48              " WH
24830 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
24840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24850 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
24860 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
24870 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
24880 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24890 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
248a0 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
248b0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
248e0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
248f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
24900 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
24910 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
24920 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
24930 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
24940 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
24950 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
24960 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
24970 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
24980 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24990 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
249a0 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
249b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
249c0 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
249d0 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
249e0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
249f0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
24a00 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
24a10 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
24a20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
24a30 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
24a40 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
24a50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24a60 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
24a70 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
24a80 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
24a90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24aa0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
24ab0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
24ac0 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
24ad0 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
24ae0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
24af0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
24b00 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
24b10 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
24b20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
24b30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
24b40 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24b50 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
24b60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
24b70 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
24b80 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
24b90 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
24ba0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
24bb0 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_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 20 22 20 57 48 45 52 45 20 25         " WHERE %
24be0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
24bf0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
24c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24c10 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
24c20 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
24c30 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
24c40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24c50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
24c60 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
24c70 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
24c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
24ca0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
24cb0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
24cc0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
24cf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
24d00 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
24d10 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
24d20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
24d30 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
24d40 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
24d50 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
24d60 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
24d70 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
24d80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24d90 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
24da0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
24db0 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
24dc0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
24dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
24de0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
24df0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
24e00 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
24e10 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
24e20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
24e30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24e40 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
24e50 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
24e60 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
24e70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
24e80 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
24e90 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
24ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
24eb0 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
24ec0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
24ed0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
24ee0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
24ef0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
24f00 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
24f10 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
24f20 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
24f30 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
24f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24f50 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
24f60 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
24f70 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
24f80 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
24f90 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
24fa0 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
24fb0 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
24fc0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
24fd0 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
24fe0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
24ff0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
25000 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
25010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
25020 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
25030 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
25040 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
25050 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
25060 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
25070 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
25080 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
25090 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
250a0 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
250b0 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
250c0 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
250d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
250e0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
250f0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
25100 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25110 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25120 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
25130 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
25140 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
25150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
25160 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
25170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25180 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
25190 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
251a0 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
251b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
251c0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
251d0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
251e0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
251f0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
25200 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
25210 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
25220 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
25230 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
25240 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
25250 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
25260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
25270 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
25280 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
25290 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
252a0 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
252b0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
252c0 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
252d0 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
252e0 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
252f0 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
25300 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
25310 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
25320 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
25330 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
25340 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
25350 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
25360 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
25370 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
25380 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
25390 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
253a0 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
253b0 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
253c0 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
253d0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
253e0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
253f0 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
25400 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
25410 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
25420 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
25430 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
25440 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
25450 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
25460 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
25470 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
25480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25490 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
254a0 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
254b0 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
254c0 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
254d0 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
254e0 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
254f0 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
25500 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25510 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
25520 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
25530 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
25540 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
25550 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
25560 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
25570 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
25580 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
25590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
255a0 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
255b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
255c0 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
255d0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
255e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
255f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
25600 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
25610 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
25620 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
25630 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
25640 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20  3_sleep(100);.  
25650 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
25660 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
25670 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a  HAVE_SYSTEM) */.
25680 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65    }.  p->outfile
25690 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75  [0] = 0;.  p->ou
256a0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f  t = stdout;.}../
256b0 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20  *.** Run an SQL 
256c0 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75  command and retu
256d0 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e  rn the single in
256e0 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f  teger result..*/
256f0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69  .static int db_i
25700 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nt(ShellState *p
25710 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
25720 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql){.  sqlite3_s
25730 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
25740 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  t res = 0;.  sql
25750 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
25760 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
25770 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
25780 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
25790 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
257a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
257b0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
257c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
257d0 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t,0);.  }.  sqli
257e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
257f0 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  mt);.  return re
25800 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  s;.}../*.** Conv
25810 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20  ert a 2-byte or 
25820 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
25830 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
25840 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
25850 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
25860 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49  ed int get2byteI
25870 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
25880 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
25890 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b  a[0]<<8) + a[1];
258a0 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .}.static unsign
258b0 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49  ed int get4byteI
258c0 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
258d0 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
258e0 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31  a[0]<<24) + (a[1
258f0 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c  ]<<16) + (a[2]<<
25900 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + a[3];.}../*
25910 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
25920 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f  on of the ".info
25930 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
25940 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
25950 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
25960 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
25970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
25980 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
25990 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
259a0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
259b0 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61   **azArg){.  sta
259c0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
259d0 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
259e0 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20  Name; int ofst; 
259f0 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20  } aField[] = {. 
25a00 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e      { "file chan
25a10 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32  ge counter:",  2
25a20 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  4  },.     { "da
25a30 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
25a40 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20  t:",  28  },.   
25a50 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61    { "freelist pa
25a60 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20  ge count:",  36 
25a70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
25a80 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20  ma cookie:",    
25a90 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20      40  },.     
25aa0 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74  { "schema format
25ab0 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d  :",        44  }
25ac0 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c  ,.     { "defaul
25ad0 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20  t cache size:", 
25ae0 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    48  },.     { 
25af0 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20  "autovacuum top 
25b00 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a  root:",  52  },.
25b10 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e       { "incremen
25b20 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20  tal vacuum:",   
25b30 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74  64  },.     { "t
25b40 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20  ext encoding:", 
25b50 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20         56  },.  
25b60 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69     { "user versi
25b70 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30  on:",         60
25b80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70    },.     { "app
25b90 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20  lication id:",  
25ba0 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20       68  },.    
25bb0 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72   { "software ver
25bc0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20  sion:",     96  
25bd0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
25be0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
25bf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25c00 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e; const char *z
25c10 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20  Sql; } aQuery[] 
25c20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62  = {.     { "numb
25c30 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a  er of tables:",.
25c40 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
25c50 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
25c60 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
25c70 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  e'" },.     { "n
25c80 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
25c90 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
25ca0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
25cb0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
25cc0 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20  index'" },.     
25cd0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69  { "number of tri
25ce0 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20  ggers:",.       
25cf0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
25d00 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
25d10 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d  ype='trigger'" }
25d20 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
25d30 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20   of views:",.   
25d40 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
25d50 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
25d60 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20  RE type='view'" 
25d70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
25d80 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20  a size:",.      
25d90 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c   "SELECT total(l
25da0 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d  ength(sql)) FROM
25db0 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69   %s" },.  };.  i
25dc0 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75 6e 73 69  nt i, rc;.  unsi
25dd0 67 6e 65 64 20 69 44 61 74 61 56 65 72 73 69 6f  gned iDataVersio
25de0 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65  n;.  char *zSche
25df0 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a  maTab;.  char *z
25e00 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  Db = nArg>=2 ? a
25e10 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
25e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
25e30 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75   *pStmt = 0;.  u
25e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
25e50 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64  r[100];.  open_d
25e60 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  b(p, 0);.  if( p
25e70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
25e80 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
25e90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
25ea0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
25eb0 20 20 22 53 45 4c 45 43 54 20 64 61 74 61 20 46    "SELECT data F
25ec0 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
25ed0 65 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f  e(?1) WHERE pgno
25ee0 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  =1",.           
25ef0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
25f00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
25f10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 63    if( !sqlite3_c
25f20 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
25f30 64 28 22 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  d("ENABLE_DBPAGE
25f40 5f 56 54 41 42 22 29 20 29 7b 0a 20 20 20 20 20  _VTAB") ){.     
25f50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25f60 65 72 72 2c 20 22 74 68 65 20 5c 22 2e 64 62 69  err, "the \".dbi
25f70 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64 20 72 65  nfo\" command re
25f80 71 75 69 72 65 73 20 74 68 65 20 22 0a 20 20 20  quires 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 20 22 2d 44 53 51 4c 49 54 45         "-DSQLITE
25fb0 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
25fc0 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  TAB compile-time
25fd0 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b 0a 20 20   options\n");.  
25fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
25ff0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26000 72 2c 20 22 65 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "error: %s\n"
26010 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
26020 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a  (p->db));.    }.
26030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
26040 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
26050 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
26060 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
26070 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62  xt(pStmt, 1, zDb
26080 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
26090 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  TIC);.  if( sqli
260a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
260b0 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26  =SQLITE_ROW.   &
260c0 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
260d0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e  _bytes(pStmt,0)>
260e0 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  100.  ){.    mem
260f0 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65  cpy(aHdr, sqlite
26100 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
26110 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20  tmt,0), 100);.  
26120 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
26130 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c  ze(pStmt);.  }el
26140 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
26150 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62  tf(stderr, "unab
26160 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  le to read datab
26170 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a  ase header\n");.
26180 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
26190 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
261a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
261b0 20 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74   i = get2byteInt
261c0 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28  (aHdr+16);.  if(
261d0 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33   i==1 ) i = 6553
261e0 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  6;.  utf8_printf
261f0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
26200 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65  %d\n", "database
26210 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29   page size:", i)
26220 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26230 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26240 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72  d\n", "write for
26250 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29  mat:", aHdr[18])
26260 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26270 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26280 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d  d\n", "read form
26290 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b  at:", aHdr[19]);
262a0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
262b0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
262c0 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62  \n", "reserved b
262d0 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d  ytes:", aHdr[20]
262e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
262f0 41 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64  ArraySize(aField
26300 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
26310 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69   ofst = aField[i
26320 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69  ].ofst;.    unsi
26330 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67  gned int val = g
26340 65 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20  et4byteInt(aHdr 
26350 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66  + ofst);.    utf
26360 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26370 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69   "%-20s %u", aFi
26380 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  eld[i].zName, va
26390 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  l);.    switch( 
263a0 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  ofst ){.      ca
263b0 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20  se 56: {.       
263c0 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61   if( val==1 ) ra
263d0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
263e0 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20   " (utf8)");.   
263f0 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20       if( val==2 
26400 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
26410 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29  out, " (utf16le)
26420 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
26430 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69  val==3 ) raw_pri
26440 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
26450 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20  tf16be)");.     
26460 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77   }.    }.    raw
26470 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26480 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
26490 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a   zDb==0 ){.    z
264a0 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
264b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69  te3_mprintf("mai
264c0 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  n.sqlite_master"
264d0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
264e0 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22  trcmp(zDb,"temp"
264f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  )==0 ){.    zSch
26500 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
26510 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22  _mprintf("%s", "
26520 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
26530 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  er");.  }else{. 
26540 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
26550 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26560 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d  "\"%w\".sqlite_m
26570 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20  aster", zDb);.  
26580 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  }.  for(i=0; i<A
26590 72 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29  rraySize(aQuery)
265a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
265b0 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
265c0 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b  _mprintf(aQuery[
265d0 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61  i].zSql, zSchema
265e0 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61  Tab);.    int va
265f0 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53  l = db_int(p, zS
26600 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
26610 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
26620 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
26630 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
26640 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61  ", aQuery[i].zNa
26650 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  me, val);.  }.  
26660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63  sqlite3_free(zSc
26670 68 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c 69  hemaTab);.  sqli
26680 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26690 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c  (p->db, zDb, SQL
266a0 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
266b0 45 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56 65  ERSION, &iDataVe
266c0 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70  rsion);.  utf8_p
266d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
266e0 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61 74  -20s %u\n", "dat
266f0 61 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61 74  a version", iDat
26700 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74  aVersion);.  ret
26710 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
26720 50 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e  Print the curren
26730 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  t sqlite3_errmsg
26740 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65  () value to stde
26750 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  rr and return 1.
26760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
26770 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f  hellDatabaseErro
26780 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
26790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
267a0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
267b0 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f  msg(db);.  utf8_
267c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
267d0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
267e0 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  rr);.  return 1;
267f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
26800 65 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e  e the pattern in
26810 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74   zGlob[] against
26820 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d   the text in z[]
26830 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a  .  Return TRUE.*
26840 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20  * if they match 
26850 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66  and FALSE (0) if
26860 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
26870 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  ch..**.** Globbi
26880 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
26890 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
268a0 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
268b0 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
268c0 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
268d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
268e0 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
268f0 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
26900 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
26910 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
26920 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
26930 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
26940 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
26950 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
26960 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
26970 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
26980 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
26990 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
269a0 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
269b0 2a 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20  *      '#'      
269c0 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
269d0 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20  uence of one or 
269e0 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68  more digits with
269f0 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   an.**          
26a00 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b        optional +
26a10 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72   or - sign in fr
26a20 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  ont.**.**      '
26a30 20 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61   '       Any spa
26a40 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20  n of whitespace 
26a50 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65  matches any othe
26a60 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20  r span of.**    
26a70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74              whit
26a80 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  espace..**.** Ex
26a90 74 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61  tra whitespace a
26aa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d  t the end of z[]
26ab0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
26ac0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63  static int testc
26ad0 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63  ase_glob(const c
26ae0 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73  har *zGlob, cons
26af0 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
26b00 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69  t c, c2;.  int i
26b10 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
26b20 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  n;..  while( (c 
26b30 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21  = (*(zGlob++)))!
26b40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73  =0 ){.    if( Is
26b50 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
26b60 20 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a    if( !IsSpace(*
26b70 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
26b80 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
26b90 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47  ace(*zGlob) ) zG
26ba0 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  lob++;.      whi
26bb0 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
26bc0 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ) z++;.    }else
26bd0 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20   if( c=='*' ){. 
26be0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28       while( (c=(
26bf0 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20  *(zGlob++))) == 
26c00 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b  '*' || c=='?' ){
26c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
26c20 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d  '?' && (*(z++))=
26c30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26c50 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
26c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
26c70 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
26c80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
26c90 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61  le( *z && testca
26ca0 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c  se_glob(zGlob-1,
26cb0 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
26cc0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
26cd0 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
26ce0 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20   (*z)!=0;.      
26cf0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
26d00 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d  c2 = (*(z++)))!=
26d10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
26d20 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20  le( c2!=c ){.   
26d30 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b         c2 = *(z+
26d40 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
26d50 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
26d60 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
26d70 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61        if( testca
26d80 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29  se_glob(zGlob,z)
26d90 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
26da0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
26db0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
26dc0 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
26dd0 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d     if( (*(z++))=
26de0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26df0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
26e00 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '[' ){.      int
26e10 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
26e20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
26e30 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
26e40 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29        c = *(z++)
26e50 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
26e60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
26e70 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
26e80 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  +);.      if( c2
26e90 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
26ea0 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
26eb0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
26ec0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
26ed0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
26ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
26ef0 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
26f00 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
26f10 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
26f20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
26f30 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
26f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
26f50 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  ='-' && zGlob[0]
26f60 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  !=']' && zGlob[0
26f70 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
26f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
26f90 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
26fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e            if( c>
26fb0 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63  =prior_c && c<=c
26fc0 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  2 ) seen = 1;.  
26fd0 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
26fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
26ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
27000 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20  ( c==c2 ){.     
27010 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b         seen = 1;
27020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27030 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
27040 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   c2;.        }. 
27050 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
27060 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
27070 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
27080 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
27090 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
270a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
270b0 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c=='#' ){.      
270c0 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c  if( (z[0]=='-' |
270d0 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20  | z[0]=='+') && 
270e0 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20  IsDigit(z[1]) ) 
270f0 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  z++;.      if( !
27100 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20  IsDigit(z[0]) ) 
27110 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
27120 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
27130 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20  ( IsDigit(z[0]) 
27140 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65  ){ z++; }.    }e
27150 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63  lse{.      if( c
27160 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74  !=(*(z++)) ) ret
27170 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
27180 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63  .  while( IsSpac
27190 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  e(*z) ){ z++; }.
271a0 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
271b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
271c0 65 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  e the string as 
271d0 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  a command-line o
271e0 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65  ption with eithe
271f0 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20  r one or two.** 
27200 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  initial "-" char
27210 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
27220 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63  c int optionMatc
27230 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  h(const char *zS
27240 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
27250 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74  zOpt){.  if( zSt
27260 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  r[0]!='-' ) retu
27270 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a  rn 0;.  zStr++;.
27280 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27    if( zStr[0]=='
27290 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72  -' ) zStr++;.  r
272a0 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74  eturn strcmp(zSt
272b0 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a  r, zOpt)==0;.}..
272c0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66  /*.** Delete a f
272d0 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c  ile..*/.int shel
272e0 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73  lDeleteFile(cons
272f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
27300 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  e){.  int rc;.#i
27310 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
27320 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
27330 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
27340 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  _unicode(zFilena
27350 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e  me);.  rc = _wun
27360 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74  link(z);.  sqlit
27370 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
27380 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28  e.  rc = unlink(
27390 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  zFilename);.#end
273a0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
273b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
273c0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
273d0 72 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68  rary file (if th
273e0 65 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20  ere is one) and 
273f0 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f  free the.** memo
27400 72 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  ry used to hold 
27410 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
27420 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  temp file..*/.st
27430 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54  atic void clearT
27440 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61  empFile(ShellSta
27450 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
27460 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20  >zTempFile==0 ) 
27470 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
27480 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74  >doXdgOpen ) ret
27490 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c  urn;.  if( shell
274a0 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54  DeleteFile(p->zT
274b0 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72  empFile) ) retur
274c0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  n;.  sqlite3_fre
274d0 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b  e(p->zTempFile);
274e0 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20  .  p->zTempFile 
274f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 0;.}../*.** Cr
27500 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20  eate a new temp 
27510 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74  file name with t
27520 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
27530 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27540 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c  newTempFile(Shel
27550 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
27560 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b   char *zSuffix){
27570 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65  .  clearTempFile
27580 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
27590 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ree(p->zTempFile
275a0 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  );.  p->zTempFil
275b0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  e = 0;.  if( p->
275c0 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
275d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
275e0 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f  ->db, 0, SQLITE_
275f0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
27600 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c  ME, &p->zTempFil
27610 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
27620 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
27630 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  .    sqlite3_uin
27640 74 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  t64 r;.    sqlit
27650 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
27660 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
27670 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
27680 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27690 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20  ("temp%llx.%s", 
276a0 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  r, zSuffix);.  }
276b0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65  else{.    p->zTe
276c0 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  mpFile = sqlite3
276d0 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22  _mprintf("%z.%s"
276e0 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20  , p->zTempFile, 
276f0 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20  zSuffix);.  }.  
27700 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
27710 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  ==0 ){.    raw_p
27720 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
27730 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
27740 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
27750 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   }.}.../*.** The
27760 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27770 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75  of SQL scalar fu
27780 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c  nction fkey_coll
27790 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73  ate_clause(), us
277a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c  ed.** by the ".l
277b0 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73  int fkey-indexes
277c0 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20  " command. This 
277d0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
277e0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c  is always.** cal
277f0 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72  led with four ar
27800 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61  guments - the pa
27810 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c  rent table name,
27820 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
27830 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20  mn name,.** the 
27840 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65  child table name
27850 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63   and the child c
27860 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  olumn name..**.*
27870 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  *   fkey_collate
27880 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d  _clause('parent-
27890 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f  tab', 'parent-co
278a0 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c  l', 'child-tab',
278b0 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a   'child-col').**
278c0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
278d0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
278e0 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20  s or columns do 
278f0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
27900 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  function.** retu
27910 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72  rns an empty str
27920 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74  ing. An empty st
27930 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74  ring is also ret
27940 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61  urned if both ta
27950 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75  bles.** and colu
27960 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61  mns exist but ha
27970 76 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  ve the same defa
27980 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
27990 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69  quence. Or,.** i
279a0 66 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74  f both exist but
279b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
279c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
279d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
279e0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
279f0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
27a00 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70  ing " COLLATE <p
27a10 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
27a20 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72  ", where.** <par
27a30 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69  ent-collation> i
27a40 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
27a50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
27a60 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
27a70 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
27a80 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43   void shellFkeyC
27a90 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20  ollateClause(.  
27aa0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
27ab0 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
27ac0 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
27ad0 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
27ae0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
27af0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
27b00 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20  _handle(pCtx);. 
27b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27b20 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rent;.  const ch
27b30 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a  ar *zParentCol;.
27b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27b50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73  arentSeq;.  cons
27b60 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a  t char *zChild;.
27b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
27b80 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74  hildCol;.  const
27b90 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71   char *zChildSeq
27ba0 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61   = 0;  /* Initia
27bb0 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61  lize to avoid fa
27bc0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72  lse-positive war
27bd0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ning */.  int rc
27be0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
27bf0 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e  l==4 );.  zParen
27c00 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
27c10 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27c20 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
27c30 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63   zParentCol = (c
27c40 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27c50 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
27c60 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[1]);.  zChil
27c70 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
27c80 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27c90 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  ext(apVal[2]);. 
27ca0 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f   zChildCol = (co
27cb0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
27cc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
27cd0 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  al[3]);..  sqlit
27ce0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
27cf0 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c  Ctx, "", -1, SQL
27d00 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  ITE_STATIC);.  r
27d10 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
27d20 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
27d30 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61  a(.      db, "ma
27d40 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50  in", zParent, zP
27d50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50  arentCol, 0, &zP
27d60 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20  arentSeq, 0, 0, 
27d70 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
27d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
27da0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
27db0 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62  data(.        db
27dc0 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64  , "main", zChild
27dd0 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20  , zChildCol, 0, 
27de0 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30  &zChildSeq, 0, 0
27df0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
27e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27e10 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73  _OK && sqlite3_s
27e20 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65  tricmp(zParentSe
27e30 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b  q, zChildSeq) ){
27e40 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73  .    char *z = s
27e50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27e60 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50   COLLATE %s", zP
27e70 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73  arentSeq);.    s
27e80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
27e90 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20  xt(pCtx, z, -1, 
27ea0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
27eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27ec0 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(z);.  }.}...
27ed0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
27ee0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d  entation of dot-
27ef0 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66  command ".lint f
27f00 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f  key-indexes"..*/
27f10 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
27f20 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53  FkeyIndexes(.  S
27f30 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
27f40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
27f50 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
27f60 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
27f70 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
27fa0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
27fb0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
27fc0 20 69 6e 74 20 6e 41 72 67 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
27ff0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
28000 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28010 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64   *db = pState->d
28020 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
28030 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71  base handle to q
28040 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f  uery "main" db o
28050 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  f */.  FILE *out
28060 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20   = pState->out; 
28070 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d         /* Stream
28080 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72   to write non-er
28090 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f  ror output to */
280a0 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20  .  int bVerbose 
280b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
280c0 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73     /* If -verbos
280d0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
280e0 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61    int bGroupByPa
280f0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
28100 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79    /* If -groupby
28110 70 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e  parent is presen
28120 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  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 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
28150 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41  rate through azA
28160 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rg[] */.  const 
28170 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20  char *zIndent = 
28180 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  "";       /* How
28190 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20   much to indent 
281a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20  CREATE INDEX by 
281b0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 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 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
281e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
281f0 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
28200 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
28210 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  iled version of 
28220 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
28230 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  low */..  /*.  *
28240 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74  * This SELECT st
28250 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
28260 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68  one row for each
28270 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
28280 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20  straint.  ** in 
28290 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  the schema of th
282a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
282b0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   The column valu
282c0 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  es are:.  **.  *
282d0 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66  * 0. The text of
282e0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
282f0 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20  t similar to:.  
28300 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58  **.  **      "EX
28310 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28320 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63   SELECT 1 FROM c
28330 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45  hild_table WHERE
28340 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20   child_key=?".  
28350 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20  **.  **    This 
28360 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61  SELECT is simila
28370 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61  r to the one tha
28380 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
28390 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ys implementatio
283a0 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20  n.  **    needs 
283b0 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c  to run internall
283c0 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65  y on child table
283d0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
283e0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  n index that can
283f0 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64  .  **    be used
28400 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69   to optimize thi
28410 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
28420 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65   can also be use
28430 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a  d by the FK.  **
28440 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69      implementati
28450 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44  on to optimize D
28460 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
28470 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
28480 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20  e parent.  **   
28490 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
284a0 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74  * 1. A GLOB patt
284b0 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ern suitable for
284c0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
284d0 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20  (). If the plan 
284e0 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20  output by.  **  
284f0 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55    the EXPLAIN QU
28500 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
28510 20 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61   matches this pa
28520 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20  ttern, then the 
28530 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63  schema.  **    c
28540 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78  ontains an index
28550 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
28560 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  d to optimize th
28570 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  e query..  **.  
28580 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64  ** 2. Human read
28590 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64  able text that d
285a0 65 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69  escribes the chi
285b0 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ld table and col
285c0 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  umns. e.g..  **.
285d0 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c    **       "chil
285e0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
285f0 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22  y1, child_key2)"
28600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75  .  **.  ** 3. Hu
28610 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78  man readable tex
28620 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  t that describes
28630 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
28640 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65  e and columns. e
28650 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
28660 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c      "parent_tabl
28670 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70  e(parent_key1, p
28680 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a  arent_key2)".  *
28690 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c  *.  ** 4. A full
286a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
286b0 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69  atement for an i
286c0 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20  ndex that could 
286d0 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
286e0 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45     optimize DELE
286f0 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
28700 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
28710 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67  arent table. e.g
28720 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
28730 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
28740 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c  child_table_chil
28750 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74  d_key ON child_t
28760 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22  able(child_key)"
28770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68  .  **.  ** 5. Th
28780 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61  e name of the pa
28790 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  rent table..  **
287a0 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20  .  ** These six 
287b0 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20  values are used 
287c0 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62  by the C logic b
287d0 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65  elow to generate
287e0 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a   the report..  *
287f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28800 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54  zSql =.  "SELECT
28810 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58   ".    "     'EX
28820 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28830 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27   SELECT 1 FROM '
28840 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
28850 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a  ) || ' WHERE '".
28860 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
28870 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e  concat(quote(s.n
28880 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71  ame) || '.' || q
28890 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
288a0 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20  | '=?' ".    "  
288b0 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  || fkey_collate_
288c0 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
288d0 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
288e0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
288f0 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
28900 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20  me, f.[from]),' 
28910 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22  AND ')".    ", "
28920 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52  .    "     'SEAR
28930 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e  CH TABLE ' || s.
28940 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20  name || ' USING 
28950 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28  COVERING INDEX*(
28960 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
28970 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c  up_concat('*=?',
28980 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27   ' AND ') || ')'
28990 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
289a0 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20       s.name  || 
289b0 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
289c0 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27  cat(f.[from],  '
289d0 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  , ') || ')'".   
289e0 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
289f0 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27  f.[table] || '('
28a00 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
28a10 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d  (COALESCE(f.[to]
28a20 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20  , p.[name])) || 
28a30 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
28a40 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20    "     'CREATE 
28a50 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65  INDEX ' || quote
28a60 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20  (s.name ||'_'|| 
28a70 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b  group_concat(f.[
28a80 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20  from], '_'))".  
28a90 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c    "  || ' ON ' |
28aa0 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  | quote(s.name) 
28ab0 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c  || '('".    "  |
28ac0 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71  | group_concat(q
28ad0 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
28ae0 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
28af0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
28b00 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
28b10 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
28b20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
28b30 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
28b40 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27  me, f.[from]), '
28b50 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20  , ')".    "  || 
28b60 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20  ');'".    ", ". 
28b70 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c     "     f.[tabl
28b80 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  e] ".    "FROM s
28b90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20  qlite_master AS 
28ba0 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67  s, pragma_foreig
28bb0 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d  n_key_list(s.nam
28bc0 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c  e) AS f ".    "L
28bd0 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f  EFT JOIN pragma_
28be0 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20  table_info AS p 
28bf0 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44  ON (pk-1=seq AND
28c00 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d   p.arg=f.[table]
28c10 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42  ) ".    "GROUP B
28c20 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22  Y s.name, f.id "
28c30 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28  .    "ORDER BY (
28c40 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e  CASE WHEN ? THEN
28c50 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20   f.[table] ELSE 
28c60 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b  s.name END)".  ;
28c70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28c80 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43  GlobIPK = "SEARC
28c90 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20  H TABLE * USING 
28ca0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
28cb0 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a  KEY (rowid=?)";.
28cc0 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41  .  for(i=2; i<nA
28cd0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  rg; i++){.    in
28ce0 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  t n = strlen30(a
28cf0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66  zArg[i]);.    if
28d00 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ( n>1 && sqlite3
28d10 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62  _strnicmp("-verb
28d20 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  ose", azArg[i], 
28d30 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  n)==0 ){.      b
28d40 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
28d50 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
28d60 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73  n>1 && sqlite3_s
28d70 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62  trnicmp("-groupb
28d80 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b  yparent", azArg[
28d90 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  i], n)==0 ){.   
28da0 20 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e     bGroupByParen
28db0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e  t = 1;.      zIn
28dc0 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20  dent = "    ";. 
28dd0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20     }.    else{. 
28de0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28df0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
28e00 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f  %s %s ?-verbose?
28e10 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74   ?-groupbyparent
28e20 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?\n",.          
28e30 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b  azArg[0], azArg[
28e40 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1].      );.    
28e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
28e70 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
28e80 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  the fkey_collate
28e90 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75  _clause() SQL fu
28ea0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d  nction */.  rc =
28eb0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
28ec0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b  function(db, "fk
28ed0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
28ee0 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54  e", 4, SQLITE_UT
28ef0 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65  F8,.      0, she
28f00 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61  llFkeyCollateCla
28f10 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a  use, 0, 0.  );..
28f20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
28f40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
28f50 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
28f60 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d  , &pSql, 0);.  }
28f70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
28f90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71  te3_bind_int(pSq
28fa0 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61  l, 1, bGroupByPa
28fb0 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  rent);.  }..  if
28fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28fd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
28fe0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20      char *zPrev 
28ff0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
29000 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
29010 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
29020 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  {.      int res 
29030 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
29040 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
29050 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  in = 0;.      co
29060 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
29070 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
29080 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
29090 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
290a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
290b0 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lob = (const cha
290c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
290d0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
290e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
290f0 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73  r *zFrom = (cons
29100 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
29110 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
29120 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 2);.      cons
29130 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20  t char *zTarget 
29140 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
29150 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
29160 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  xt(pSql, 3);.   
29170 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29180 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  CI = (const char
29190 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
291a0 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a  _text(pSql, 4);.
291b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
291c0 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e   *zParent = (con
291d0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
291e0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
291f0 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63  l, 5);..      rc
29200 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
29210 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
29220 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
29230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
29250 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  ak;.      if( SQ
29260 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
29270 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
29280 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
29290 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20  t char *zPlan = 
292a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
292b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
292c0 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20  (pExplain, 3);. 
292d0 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20         res = (. 
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d               0==
292f0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
29300 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20  zGlob, zPlan).  
29310 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73           || 0==s
29320 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
29330 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a  GlobIPK, zPlan).
29340 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29350 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
29360 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
29370 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
29380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29390 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  K ) break;..    
293a0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
293b0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
293c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
293d0 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  : internal error
293e0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
293f0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
29400 20 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f          if( bGro
29410 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20  upByParent.     
29420 20 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20     && (bVerbose 
29430 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20  || res==0).     
29440 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20     && (zPrev==0 
29450 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
29460 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65  mp(zParent, zPre
29470 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  v)).        ){. 
29480 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
29490 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72  ntf(out, "-- Par
294a0 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c  ent table %s\n",
294b0 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
294c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
294d0 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20  e(zPrev);.      
294e0 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69      zPrev = sqli
294f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
29500 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , zParent);.    
29510 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
29520 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
29530 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
29540 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e  f(out, "%s%s -->
29550 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c   %s\n", zIndent,
29560 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a   zCI, zTarget);.
29570 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29580 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
29590 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
295a0 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f  tf(out, "%s/* no
295b0 20 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72   extra indexes r
295c0 65 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d  equired for %s -
295d0 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  > %s */\n",.    
295e0 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e            zInden
295f0 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65  t, zFrom, zTarge
29600 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
29610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29620 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29630 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
29640 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29660 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29670 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
29680 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
29690 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d      }..    rc2 =
296a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
296b0 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(pSql);.    if(
296c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
296d0 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2!=SQLITE_OK
296e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
296f0 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  c2;.      raw_pr
29700 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
29710 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
29720 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
29730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
29740 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29750 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
29760 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
29770 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29780 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
29790 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74  tation of ".lint
297a0 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
297b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
297c0 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
297d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
297e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
297f0 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
29800 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
29810 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
29840 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
29850 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
29860 20 69 6e 74 20 6e 41 72 67 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
29890 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
298a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
298b0 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f    n = (nArg>=2 ?
298c0 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
298d0 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  1]) : 0);.  if( 
298e0 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  n<1 || sqlite3_s
298f0 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d  trnicmp(azArg[1]
29900 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  , "fkey-indexes"
29910 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67  , n) ) goto usag
29920 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74  e;.  return lint
29930 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61  FkeyIndexes(pSta
29940 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  te, azArg, nArg)
29950 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77  ;.. usage:.  raw
29960 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29970 22 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f  "Usage %s sub-co
29980 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e  mmand ?switches.
29990 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  ..?\n", azArg[0]
299a0 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  );.  raw_printf(
299b0 73 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73  stderr, "Where s
299c0 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a  ub-commands are:
299d0 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  \n");.  raw_prin
299e0 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20  tf(stderr, "    
299f0 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29  fkey-indexes\n")
29a00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29a10 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20  E_ERROR;.}..#if 
29a20 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f  !defined SQLITE_
29a30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
29a40 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  E.static void sh
29a50 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71  ellPrepare(.  sq
29a60 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
29a70 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74  t *pRc, .  const
29a80 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
29a90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
29aa0 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
29ab0 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
29ac0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
29ad0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
29ae0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
29af0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
29b00 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
29b10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29b20 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
29b30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
29b40 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29  l error: %s (%d)
29b50 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
29b60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
29b70 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63  b), sqlite3_errc
29b80 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b  ode(db).      );
29b90 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63  .      *pRc = rc
29ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
29bb0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 70 72  *.** Create a pr
29bc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
29bd0 20 75 73 69 6e 67 20 70 72 69 6e 74 66 2d 73 74   using printf-st
29be0 79 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f  yle arguments fo
29bf0 72 20 74 68 65 20 53 51 4c 2e 0a 2a 2a 0a 2a 2a  r the SQL..**.**
29c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29c10 20 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64   could be marked
29c20 20 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20   "static".  But 
29c30 69 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73  it is not always
29c40 20 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64   used,.** depend
29c50 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74  ing on compile-t
29c60 69 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79  ime options.  By
29c70 20 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73   omitting the "s
29c80 74 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64  tatic", we avoid
29c90 0a 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d  .** nuisance com
29ca0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
29cb0 62 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75  bout "defined bu
29cc0 74 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a  t not used"..*/.
29cd0 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
29ce0 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
29cf0 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
29d00 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
29d10 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
29d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
29d30 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
29d40 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
29d50 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
29d60 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
29d70 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
29d80 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
29d90 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
29da0 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
29db0 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
29dc0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
29dd0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
29de0 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
29df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
29e00 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
29e10 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
29e20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
29e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29e40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29e50 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
29e60 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
29e70 6e 74 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  nt created using
29e80 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
29e90 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntf()..**.** Thi
29ea0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75  s routine is cou
29eb0 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74  ld be marked "st
29ec0 61 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69  atic".  But it i
29ed0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65  s not always use
29ee0 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20  d,.** depending 
29ef0 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  on compile-time 
29f00 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69  options.  By omi
29f10 74 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69  tting the "stati
29f20 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20  c", we avoid.** 
29f30 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
29f40 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
29f50 20 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f   "defined but no
29f60 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64  t used"..*/.void
29f70 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a   shellFinalize(.
29f80 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
29f90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
29fa0 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d  mt.){.  if( pStm
29fb0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
29fc0 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
29fd0 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
29fe0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
29ff0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2a000 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a  Stmt);.    if( *
2a010 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2a020 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
2a030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a040 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a050 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
2a060 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2a070 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
2a080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
2a090 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
2a0a0 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 74   }.}../* Reset t
2a0b0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
2a0c0 65 6d 65 6e 74 20 63 72 65 61 74 65 64 20 75 73  ement created us
2a0d0 69 6e 67 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ing shellPrepare
2a0e0 50 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  Printf()..**.** 
2a0f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a100 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20  could be marked 
2a110 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20 69  "static".  But i
2a120 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  t is not always 
2a130 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  used,.** dependi
2a140 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69  ng on compile-ti
2a150 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20  me options.  By 
2a160 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73 74  omitting the "st
2a170 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a  atic", we avoid.
2a180 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70  ** nuisance comp
2a190 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
2a1a0 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75 74  out "defined but
2a1b0 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76   not used"..*/.v
2a1c0 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a  oid shellReset(.
2a1d0 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
2a1e0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2a1f0 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mt.){.  int rc =
2a200 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2a210 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52  Stmt);.  if( *pR
2a220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2a250 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2a260 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
2a270 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61 77  Stmt);.      raw
2a280 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a290 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
2a2a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2a2b0 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g(db));.    }.  
2a2c0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d    *pRc = rc;.  }
2a2d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
2a2e0 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
2a2f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2a300 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
2a310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a320 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2a330 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2a340 5f 5a 4c 49 42 29 0a 2f 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 2a 0a 2a 2a 20 54 68 65  *********.** The
2a3a0 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22   ".archive" or "
2a3b0 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
2a3c0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
2a3d0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20   representing a 
2a3e0 73 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d  single ".ar" com
2a3f0 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  mand..*/.typedef
2a400 20 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e   struct ArComman
2a410 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72  d ArCommand;.str
2a420 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a  uct ArCommand {.
2a430 20 20 75 38 20 65 43 6d 64 3b 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 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a    /* An AR_CMD_*
2a460 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62   value */.  u8 b
2a470 56 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20  Verbose;        
2a480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a490 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65  rue if --verbose
2a4a0 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 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 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a4d0 20 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20   the archive is 
2a4e0 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44  a ZIP */.  u8 bD
2a4f0 72 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20  ryRun;          
2a500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a510 75 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20  ue if --dry-run 
2a520 2a 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b  */.  u8 bAppend;
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a550 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38  --append */.  u8
2a560 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20   fromCmdLine;   
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a580 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73   Run from -A ins
2a590 74 65 61 64 20 6f 66 20 2e 61 72 63 68 69 76 65  tead of .archive
2a5a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a5d0 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
2a5e0 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2a5f0 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20  zSrcTable;      
2a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71            /* "sq
2a610 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24  lar", "zipfile($
2a620 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20  file)" or "zip" 
2a630 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2a640 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
2a650 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61       /* --file a
2a660 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
2a670 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a680 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20   *zDir;         
2a690 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63        /* --direc
2a6a0 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f  tory argument, o
2a6b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
2a6c0 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a6e0 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
2a6f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
2a700 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20  hellState *p;   
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a720 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f  * Shell state */
2a730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
2a760 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
2a770 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chive */.};../*.
2a780 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
2a790 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
2a7a0 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
2a7b0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
2a7c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
2a7d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2a7e0 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a  Usage(FILE *f){.
2a7f0 20 20 73 68 6f 77 48 65 6c 70 28 66 2c 22 61 72    showHelp(f,"ar
2a800 63 68 69 76 65 22 29 3b 0a 20 20 72 65 74 75 72  chive");.  retur
2a810 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2a820 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
2a830 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2a840 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
2a850 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
2a860 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  d return .** SQL
2a870 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
2a880 61 74 69 63 20 69 6e 74 20 61 72 45 72 72 6f 72  atic int arError
2a890 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  Msg(ArCommand *p
2a8a0 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ar, const char *
2a8b0 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zFmt, ...){.  va
2a8c0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
2a8d0 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   *z;.  va_start(
2a8e0 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d  ap, zFmt);.  z =
2a8f0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
2a900 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
2a910 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
2a920 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a930 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2a940 7a 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 66  z);.  if( pAr->f
2a950 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20  romCmdLine ){.  
2a960 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a970 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c  derr, "Use \"-A\
2a980 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
2a990 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
2a9a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a9b0 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2e 61 72  derr, "Use \".ar
2a9c0 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66  chive --help\" f
2a9d0 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
2a9e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2a9f0 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
2aa00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2aa10 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  }../*.** Values 
2aa20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43  for ArCommand.eC
2aa30 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  md..*/.#define A
2aa40 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20  R_CMD_CREATE    
2aa50 20 20 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f     1.#define AR_
2aa60 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20  CMD_UPDATE      
2aa70 20 32 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   2.#define AR_CM
2aa80 44 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 33  D_INSERT       3
2aa90 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
2aaa0 45 58 54 52 41 43 54 20 20 20 20 20 20 34 0a 23  EXTRACT      4.#
2aab0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
2aac0 53 54 20 20 20 20 20 20 20 20 20 35 0a 23 64 65  ST         5.#de
2aad0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  fine AR_CMD_HELP
2aae0 20 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a           6../*.*
2aaf0 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d  * Other (non-com
2ab00 6d 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a  mand) switches..
2ab10 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  */.#define AR_SW
2ab20 49 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20  ITCH_VERBOSE    
2ab30 20 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   7.#define AR_SW
2ab40 49 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20  ITCH_FILE       
2ab50 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   8.#define AR_SW
2ab60 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20  ITCH_DIRECTORY  
2ab70 20 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   9.#define AR_SW
2ab80 49 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20  ITCH_APPEND     
2ab90 31 30 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  10.#define AR_SW
2aba0 49 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20  ITCH_DRYRUN     
2abb0 31 31 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  11..static int a
2abc0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
2abd0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
2abe0 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
2abf0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
2ac00 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
2ac10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
2ac20 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
2ac30 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
2ac40 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
2ac50 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
2ac60 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
2ac70 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
2ac80 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 63  MD_INSERT:.    c
2ac90 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a  ase AR_CMD_HELP:
2aca0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
2acb0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eCmd ){.        
2acc0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2acd0 67 28 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65  g(pAr, "multiple
2ace0 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73   command options
2acf0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
2ad00 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53    pAr->eCmd = eS
2ad10 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65  witch;.      bre
2ad20 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52  ak;..    case AR
2ad30 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a  _SWITCH_DRYRUN:.
2ad40 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52        pAr->bDryR
2ad50 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  un = 1;.      br
2ad60 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
2ad70 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a  _SWITCH_VERBOSE:
2ad80 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72  .      pAr->bVer
2ad90 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  bose = 1;.      
2ada0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2adb0 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
2adc0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70  :.      pAr->bAp
2add0 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  pend = 1;.      
2ade0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74  /* Fall thru int
2adf0 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20  o --file */.    
2ae00 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46  case AR_SWITCH_F
2ae10 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ILE:.      pAr->
2ae20 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  zFile = zArg;.  
2ae30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2ae40 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ase AR_SWITCH_DI
2ae50 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70  RECTORY:.      p
2ae60 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b  Ar->zDir = zArg;
2ae70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ae80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2ae90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2aea0 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
2aeb0 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e  d line for an ".
2aec0 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  ar" command. The
2aed0 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
2aee0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72  tten into.** str
2aef0 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53  ucture (*pAr). S
2af00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2af10 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d  rned if the comm
2af20 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73  and line is pars
2af30 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  ed.** successful
2af40 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ly, otherwise an
2af50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2af60 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64  s written to std
2af70 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  err and .** SQLI
2af80 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65  TE_ERROR returne
2af90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2afa0 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
2afb0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
2afe0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
2aff0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
2b000 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b030 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
2b040 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61  g[] */.  ArComma
2b050 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
2b060 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
2b070 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
2b080 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2b090 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63  ArSwitch {.    c
2b0a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67  onst char *zLong
2b0b0 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72  ;.    char cShor
2b0c0 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63  t;.    u8 eSwitc
2b0d0 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a  h;.    u8 bArg;.
2b0e0 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20    } aSwitch[] = 
2b0f0 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22  {.    { "create"
2b100 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44  ,    'c', AR_CMD
2b110 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30  _CREATE,       0
2b120 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61   },.    { "extra
2b130 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43  ct",   'x', AR_C
2b140 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20  MD_EXTRACT,     
2b150 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73   0 },.    { "ins
2b160 65 72 74 22 2c 20 20 20 20 27 69 27 2c 20 41 52  ert",    'i', AR
2b170 5f 43 4d 44 5f 49 4e 53 45 52 54 2c 20 20 20 20  _CMD_INSERT,    
2b180 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
2b190 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
2b1a0 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
2b1b0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
2b1c0 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
2b1d0 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
2b1e0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
2b1f0 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
2b200 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
2b210 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
2b220 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
2b230 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
2b240 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
2b250 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
2b260 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
2b270 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
2b280 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
2b290 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
2b2a0 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
2b2b0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
2b2c0 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
2b2d0 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
2b2e0 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
2b2f0 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
2b300 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
2b310 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
2b320 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
2b330 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
2b340 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
2b350 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
2b360 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
2b370 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
2b380 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
2b390 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  <=1 ){.    utf8_
2b3a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b3b0 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
2b3c0 61 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67  arguments.  Usag
2b3d0 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  e:\n");.    retu
2b3e0 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
2b3f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2b400 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
2b410 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [1];.    if( z[0
2b420 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
2b430 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73  /* Traditional s
2b440 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63  tyle [tar] invoc
2b450 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2b460 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
2b470 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  iArg = 2;.      
2b480 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
2b490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
2b4a0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
2b4b0 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  0;.        struc
2b4c0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
2b4d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f  ;.        for(pO
2b4e0 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
2b4f0 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
2b500 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b510 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
2b520 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
2b530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b540 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29  if( pOpt==pEnd )
2b550 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b560 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2b570 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
2b580 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
2b590 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
2b5a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
2b5b0 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
2b5c0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
2b5d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
2b5e0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2b5f0 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
2b600 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
2b610 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
2b620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b630 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
2b640 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20  Arg[iArg++];.   
2b650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b660 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
2b670 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53  ch(pAr, pOpt->eS
2b680 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
2b690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2b6a0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2b6b0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
2b6c0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69  rg-iArg;.      i
2b6d0 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29  f( pAr->nArg>0 )
2b6e0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  {.        pAr->a
2b6f0 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
2b700 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg];.      }.   
2b710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2b720 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c   Non-traditional
2b730 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
2b740 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20       int iArg;. 
2b750 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b       for(iArg=1;
2b760 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67   iArg<nArg; iArg
2b770 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2b780 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   n;.        z = 
2b790 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
2b7a0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
2b7b0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
2b7c0 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  /* All remaining
2b7d0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f   command line wo
2b7e0 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20  rds are command 
2b7f0 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
2b800 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
2b810 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
2b820 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  ];.          pAr
2b830 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
2b840 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  rg;.          br
2b850 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2b860 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
2b870 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20  n30(z);..       
2b880 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29   if( z[1]!='-' )
2b890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2b8a0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;.          /* 
2b8b0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72  One or more shor
2b8c0 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
2b8d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2b8e0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
2b8f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b900 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
2b910 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2b920 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
2b930 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2b940 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
2b950 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
2b960 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
2b970 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
2b980 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
2b990 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2b9a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2b9b0 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b9d0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2b9e0 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a  pAr, "unrecogniz
2b9f0 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20  ed option: %c", 
2ba00 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ba20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
2ba30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ba40 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
2ba90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bab0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
2bac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bad0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2bae0 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
2baf0 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
2bb00 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
2bb10 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2bb20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bb30 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
2bb40 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
2bb50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bb60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb70 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
2bb80 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
2bb90 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
2bba0 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
2bbb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2bbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bbd0 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27  else if( z[2]=='
2bbe0 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \0' ){.         
2bbf0 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c   /* A -- option,
2bc00 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2bc10 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   all remaining c
2bc20 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
2bc30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2bc40 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
2bc50 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
2bc60 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2bc70 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b   &azArg[iArg+1];
2bc80 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
2bc90 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
2bca0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
2bcb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
2bcc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2bcd0 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a   A long option *
2bce0 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
2bcf0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
2bd00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bd10 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70   Argument for op
2bd20 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  tion, if any */.
2bd30 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2bd40 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63   ArSwitch *pMatc
2bd50 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  h = 0;      /* M
2bd60 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a  atching option *
2bd70 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  /.          stru
2bd80 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
2bd90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2bda0 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   Iterator */.   
2bdb0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2bdc0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2bdd0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2bde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2bdf0 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d  st char *zLong =
2be00 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20   pOpt->zLong;.  
2be10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
2be20 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c  -2)<=strlen30(zL
2be30 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
2be40 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
2be50 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
2be60 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2be70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2be80 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2be90 6f 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69  orMsg(pAr, "ambi
2bea0 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
2beb0 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
2bec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bed0 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
2bee0 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
2bef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
2bf20 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2bf40 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2bf50 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
2bf60 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29   option: %s", z)
2bf70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bf80 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74          if( pMat
2bf90 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  ch->bArg ){.    
2bfa0 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2bfb0 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2bfd0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2bfe0 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
2bff0 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
2c000 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
2c010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c020 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2c030 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
2c040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c050 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2c060 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
2c070 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2c080 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c090 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2c0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c0b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2c0c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2c0e0 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
2c0f0 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
2c100 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
2c110 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
2c120 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
2c130 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
2c140 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
2c150 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
2c160 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
2c170 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
2c180 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
2c190 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
2c1a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
2c1b0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
2c1c0 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
2c1d0 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
2c1e0 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
2c1f0 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
2c200 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2c210 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
2c220 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
2c230 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2c240 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
2c250 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2c260 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2c270 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
2c280 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
2c290 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
2c2a0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
2c2b0 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
2c2c0 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
2c2d0 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
2c2e0 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
2c2f0 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
2c300 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
2c310 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
2c320 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
2c330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c340 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
2c350 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
2c360 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
2c370 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
2c380 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
2c390 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
2c3a0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
2c3b0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2c3c0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
2c3d0 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
2c3e0 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
2c3f0 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
2c400 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
2c410 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
2c420 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
2c430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c440 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
2c450 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
2c460 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
2c470 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
2c480 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
2c490 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
2c4a0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
2c4b0 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
2c4c0 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
2c4d0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
2c4e0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
2c4f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2c500 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
2c510 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2c520 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
2c530 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2c540 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
2c550 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
2c560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
2c570 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
2c580 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
2c590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c5a0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
2c5b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2c5c0 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
2c5d0 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
2c5e0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
2c5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2c600 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2c610 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2c620 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
2c630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
2c650 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
2c660 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
2c670 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
2c680 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
2c690 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
2c6a0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
2c6b0 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
2c6c0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2c6d0 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
2c6e0 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
2c6f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
2c700 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
2c710 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
2c720 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2c730 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
2c740 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
2c750 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
2c760 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
2c770 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
2c780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2c790 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
2c7a0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
2c7b0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2c7c0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
2c7d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2c7e0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
2c7f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
2c800 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
2c810 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2c820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c830 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
2c840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
2c850 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
2c860 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
2c870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2c880 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
2c890 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
2c8a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2c8b0 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
2c8c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2c8d0 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
2c8e0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2c8f0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
2c900 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2c910 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
2c920 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
2c930 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
2c940 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
2c950 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
2c960 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
2c970 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
2c980 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
2c990 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c9a0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2c9b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2c9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c9d0 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
2c9e0 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
2c9f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
2ca00 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
2ca10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2ca20 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
2ca30 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
2ca40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2ca50 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
2ca60 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
2ca70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
2ca80 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
2ca90 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
2caa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
2cab0 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
2cac0 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
2cad0 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
2cae0 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
2caf0 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
2cb00 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
2cb10 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
2cb20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
2cb30 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
2cb40 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
2cb50 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2cb60 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2cb70 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2cb80 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
2cb90 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
2cba0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
2cbb0 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
2cbc0 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cbe0 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2cbf0 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
2cc00 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
2cc10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2cc20 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2cc30 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
2cc40 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
2cc50 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2cc60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
2cc70 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2cc80 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
2cc90 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
2cca0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
2ccb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2ccc0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
2ccd0 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ccf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2cd00 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
2cd10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2cd20 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
2cd30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
2cd40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2cd50 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
2cd60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cd70 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2cd80 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
2cd90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cda0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2cdb0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2cdc0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2cdd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2cde0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
2cdf0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
2ce00 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2ce10 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ql);.  sqlite3_f
2ce20 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
2ce30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ce40 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2ce50 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
2ce60 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
2ce70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
2ce80 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
2ce90 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
2cea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2ceb0 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
2cec0 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
2ced0 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
2cee0 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
2cef0 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
2cf00 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
2cf10 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
2cf20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
2cf30 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
2cf40 6c 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41  ly = 0)".    " A
2cf50 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42  ND name NOT GLOB
2cf60 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a   '*..[/\\]*'";..
2cf70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
2cf80 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a  ExtraArg[] = { .
2cf90 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d      "sqlar_uncom
2cfa0 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22  press(data, sz)"
2cfb0 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d  ,.    "data".  }
2cfc0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ;..  sqlite3_stm
2cfd0 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69  t *pSql = 0;.  i
2cfe0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cff0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20  K;.  char *zDir 
2d000 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68  = 0;.  char *zWh
2d010 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ere = 0;.  int i
2d020 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  , j;..  /* If ar
2d030 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
2d040 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61  ified, check tha
2d050 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20  t they actually 
2d060 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a  exist within.  *
2d070 2a 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65  * the archive be
2d080 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
2d090 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61   And formulate a
2d0a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2d0b0 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d  .  ** match them
2d0c0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43  .  */.  rc = arC
2d0d0 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29  heckEntries(pAr)
2d0e0 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73  ;.  arWhereClaus
2d0f0 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68  e(&rc, pAr, &zWh
2d100 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ere);..  if( rc=
2d110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d120 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20    if( pAr->zDir 
2d130 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  ){.      zDir = 
2d140 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2d150 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72  "%s/", pAr->zDir
2d160 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d170 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
2d180 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a  e3_mprintf("");.
2d190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2d1a0 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ir==0 ) rc = SQL
2d1b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2d1c0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2d1d0 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2d1e0 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c  c, &pSql, zSql1,
2d1f0 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41   .      azExtraA
2d200 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70  rg[pAr->bZip], p
2d210 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2d220 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66  Where.  );..  if
2d230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d240 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  ){.    j = sqlit
2d250 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
2d260 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24  r_index(pSql, "$
2d270 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  dir");.    sqlit
2d280 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71  e3_bind_text(pSq
2d290 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20  l, j, zDir, -1, 
2d2a0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
2d2b0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
2d2c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d2d0 20 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73   twice. The firs
2d2e0 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c  t time, writefil
2d2f0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  e() is called.  
2d300 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63    ** for all arc
2d310 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61  hive members tha
2d320 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72  t should be extr
2d330 61 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e  acted. The secon
2d340 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f  d time,.    ** o
2d350 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65  nly for the dire
2d360 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73  ctories. This is
2d370 20 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d   because the tim
2d380 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20  estamps for.    
2d390 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72  ** extracted dir
2d3a0 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65  ectories must be
2d3b0 20 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65   reset after the
2d3c0 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  y are populated 
2d3d0 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  (as.    ** popul
2d3e0 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67  ating them chang
2d3f0 65 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  es the timestamp
2d400 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ).  */.    for(i
2d410 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
2d420 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33       j = sqlite3
2d430 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2d440 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69  index(pSql, "$di
2d450 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73  rOnly");.      s
2d460 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
2d470 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20  pSql, j, i);.   
2d480 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79     if( pAr->bDry
2d490 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2d4a0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2d4b0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2d4c0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
2d4d0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2d4e0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2d4f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d500 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2d510 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
2d520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d530 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56   i==0 && pAr->bV
2d540 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
2d550 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d560 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2d570 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
2d580 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2d590 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
2d5a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d5b0 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2d5c0 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b  eset(&rc, pSql);
2d5d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
2d5e0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2d5f0 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ql);.  }..  sqli
2d600 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a  te3_free(zDir);.
2d610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d620 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
2d630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
2d640 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
2d650 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72  ent in zSql.  Or
2d660 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72   if doing a --dr
2d670 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69  yrun, merely pri
2d680 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74  nt it out..*/.st
2d690 61 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53  atic int arExecS
2d6a0 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  ql(ArCommand *pA
2d6b0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
2d6c0 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Sql){.  int rc;.
2d6d0 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
2d6e0 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  un ){.    utf8_p
2d6f0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2d700 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
2d710 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2d720 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d730 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
2d740 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
2d750 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
2d760 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  , zSql, 0, 0, &z
2d770 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Err);.    if( zE
2d780 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
2d790 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
2d7a0 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a  "ERROR: %s\n", z
2d7b0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
2d7c0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
2d7d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d7e0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d7f0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2d800 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c  of .ar "create",
2d810 20 22 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22   "insert", and "
2d820 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
2d830 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61  ..**.**     crea
2d840 74 65 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65  te    ->     Cre
2d850 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72  ate a new SQL ar
2d860 63 68 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73  chive.**     ins
2d870 65 72 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e  ert    ->     In
2d880 73 65 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74  sert or reinsert
2d890 20 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65   all files liste
2d8a0 64 0a 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20  d.**     update 
2d8b0 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74     ->     Insert
2d8c0 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
2d8d0 20 63 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74   changed or that
2d8e0 20 77 65 72 65 20 6e 6f 74 0a 2a 2a 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 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20    previously in 
2d910 74 68 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a  the archive.**.*
2d920 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
2d930 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
2d940 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
2d950 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2d960 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
2d970 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
2d980 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
2d990 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
2d9a0 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
2d9b0 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
2d9c0 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
2d9d0 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
2d9e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
2d9f0 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
2da00 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
2da10 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
2da20 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
2da30 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
2da40 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
2da50 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
2da60 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
2da70 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
2da80 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
2da90 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65   beginning.  The
2daa0 20 22 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e   "insert" comman
2dab0 64 0a 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72  d.** always over
2dac0 77 72 69 74 65 73 20 65 76 65 72 79 20 66 69 6c  writes every fil
2dad0 65 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  e named on the c
2dae0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65  ommand-line, whe
2daf0 72 65 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65  re as.** "update
2db00 22 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  " only overwrite
2db10 73 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72  s if the size or
2db20 20 6d 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68   mtime or mode h
2db30 61 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73  as changed..*/.s
2db40 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
2db50 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2db60 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
2db70 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
2db80 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
2db90 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
2dba0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
2dbb0 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  Update,         
2dbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2dbd0 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
2dbe0 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c  e. */.  int bOnl
2dbf0 79 49 66 43 68 61 6e 67 65 64 20 20 20 20 20 20  yIfChanged      
2dc00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2dc10 75 70 64 61 74 65 20 69 66 20 66 69 6c 65 20 68  update if file h
2dc20 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b  as changed */.){
2dc30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2dc40 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20  Create = .      
2dc50 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2dc60 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61   NOT EXISTS sqla
2dc70 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e  r(\n".      "  n
2dc80 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59  ame TEXT PRIMARY
2dc90 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f   KEY,  -- name o
2dca0 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20  f the file\n".  
2dcb0 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c      "  mode INT,
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2dcd0 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  - access permiss
2dce0 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20  ions\n".      " 
2dcf0 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20   mtime INT,     
2dd00 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74           -- last
2dd10 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
2dd20 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73  me\n".      "  s
2dd30 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  z INT,          
2dd40 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e         -- origin
2dd50 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a  al file size\n".
2dd60 20 20 20 20 20 20 22 20 20 64 61 74 61 20 42 4c        "  data BL
2dd70 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
2dd80 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63   -- compressed c
2dd90 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20  ontent\n".      
2dda0 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ")";.  const cha
2ddb0 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50  r *zDrop = "DROP
2ddc0 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2ddd0 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74   sqlar";.  const
2dde0 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d   char *zInsertFm
2ddf0 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52  t[2] = {.     "R
2de00 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e  EPLACE INTO %s(n
2de10 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73  ame,mode,mtime,s
2de20 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  z,data)\n".     
2de30 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
2de40 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
2de50 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
2de60 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
2de70 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43  ,\n".     "    C
2de80 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64  ASE substr(lsmod
2de90 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a  e(mode),1,1)\n".
2dea0 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e       "      WHEN
2deb0 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68   '-' THEN length
2dec0 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
2ded0 20 20 20 20 20 20 57 48 45 4e 20 27 64 27 20 54        WHEN 'd' T
2dee0 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20  HEN 0\n".     " 
2def0 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44       ELSE -1 END
2df00 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73  ,\n".     "    s
2df10 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61  qlar_compress(da
2df20 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ta)\n".     "  F
2df30 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
2df40 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20   AS disk\n".    
2df50 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2df60 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2df70 27 3f 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c  '?%%'%s;".     ,
2df80 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
2df90 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65  NTO %s(name,mode
2dfa0 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a  ,mtime,data)\n".
2dfb0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e       "  SELECT\n
2dfc0 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c  ".     "    %s,\
2dfd0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64  n".     "    mod
2dfe0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2dff0 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22  mtime,\n".     "
2e000 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20      data\n".    
2e010 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25   "  FROM fsdir(%
2e020 51 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22  Q,%Q) AS disk\n"
2e030 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c  .     "  WHERE l
2e040 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20  smode(mode) NOT 
2e050 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20  LIKE '?%%'%s;". 
2e060 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 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 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
2e090 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
2e0a0 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
2e0b0 20 72 63 3b 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 20 2f 2a 20               /* 
2e0d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2e0f0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2e100 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e   /* SQL table in
2e110 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
2e120 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  rt */.  char *zS
2e130 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  ql;.  char zTemp
2e140 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45  [50];.  char *zE
2e150 78 69 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72  xists = 0;..  ar
2e160 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52  ExecSql(pAr, "PR
2e170 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35  AGMA page_size=5
2e180 31 32 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45  12");.  rc = arE
2e190 78 65 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56  xecSql(pAr, "SAV
2e1a0 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20  EPOINT ar;");.  
2e1b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e1c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2e1d0 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a   zTemp[0] = 0; .
2e1e0 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2e1f0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
2e200 6c 69 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65  lize the zipfile
2e210 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2e220 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
2e230 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69      if( pAr->zFi
2e240 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
2e250 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20  te3_uint64 r;.  
2e260 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2e270 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
2e280 2c 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,&r);.      sqli
2e290 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2e2a0 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70  eof(zTemp),zTemp
2e2b0 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29  ,"zip%016llx",r)
2e2c0 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a  ;.      zTab = z
2e2d0 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Temp;.      zSql
2e2e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e2f0 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
2e300 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2e310 4c 45 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47  LE temp.%s USING
2e320 20 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20   zipfile(%Q)",. 
2e330 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41          zTab, pA
2e340 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29  r->zFile.      )
2e350 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45  ;.      rc = arE
2e360 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2e370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e380 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2e390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
2e3a0 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20  ab = "zip";.    
2e3b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2e3c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2e3d0 20 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51   table for an SQ
2e3e0 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20  LAR */.    zTab 
2e3f0 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69  = "sqlar";.    i
2e400 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b  f( bUpdate==0 ){
2e410 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78  .      rc = arEx
2e420 65 63 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70  ecSql(pAr, zDrop
2e430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2e440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2e450 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  o end_ar_transac
2e460 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tion;.    }.    
2e470 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2e480 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20  Ar, zCreate);.  
2e490 7d 0a 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43  }.  if( bOnlyIfC
2e4a0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45  hanged ){.    zE
2e4b0 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  xists = sqlite3_
2e4c0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
2e4d0 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28   AND NOT EXISTS(
2e4e0 22 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ".          "SEL
2e4f0 45 43 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53  ECT 1 FROM %s AS
2e500 20 6d 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20   mem".          
2e510 22 20 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65  " WHERE mem.name
2e520 3d 64 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20  =disk.name".    
2e530 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e        " AND mem.
2e540 6d 74 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65  mtime=disk.mtime
2e550 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e  ".          " AN
2e560 44 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e  D mem.mode=disk.
2e570 6d 6f 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20  mode)", zTab);. 
2e580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69   }else{.    zExi
2e590 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sts = sqlite3_mp
2e5a0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20  rintf("");.  }. 
2e5b0 20 69 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20   if( zExists==0 
2e5c0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
2e5d0 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  MEM;.  for(i=0; 
2e5e0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
2e5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
2e600 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
2e610 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
2e620 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
2e630 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
2e640 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
2e650 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
2e660 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
2e670 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
2e680 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
2e690 20 70 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69   pAr->zDir, zExi
2e6a0 73 74 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  sts);.    rc = a
2e6b0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2e6c0 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ql2);.    sqlite
2e6d0 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20  3_free(zSql2);. 
2e6e0 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61   }.end_ar_transa
2e6f0 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21  ction:.  if( rc!
2e700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e710 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2e720 41 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Ar->db, "ROLLBAC
2e730 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
2e740 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b   ar;", 0, 0, 0);
2e750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2e760 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2e770 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29  , "RELEASE ar;")
2e780 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
2e790 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c  Zip && pAr->zFil
2e7a0 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  e ){.      zSql 
2e7b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e7c0 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73  f("DROP TABLE %s
2e7d0 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ", zTemp);.     
2e7e0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2e7f0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
2e800 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2e810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2e820 69 74 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74  ite3_free(zExist
2e830 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  s);.  return rc;
2e840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2e850 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72  entation of ".ar
2e860 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
2e870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44  /.static int arD
2e880 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
2e890 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e8b0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
2e8c0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ol state */.  in
2e8d0 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20  t fromCmdLine,  
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8f0 20 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d   True if -A comm
2e900 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c  and-line option,
2e910 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a   not .ar cmd */.
2e920 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
2e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e940 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
2e950 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
2e960 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
2e970 0a 20 20 69 6e 74 20 6e 41 72 67 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e9a0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
2e9b0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d  [] */.){.  ArCom
2e9c0 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20  mand cmd;.  int 
2e9d0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d  rc;.  memset(&cm
2e9e0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64  d, 0, sizeof(cmd
2e9f0 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d  ));.  cmd.fromCm
2ea00 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c  dLine = fromCmdL
2ea10 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61  ine;.  rc = arPa
2ea20 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67  rseCommand(azArg
2ea30 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20  , nArg, &cmd);. 
2ea40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ea50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44  OK ){.    int eD
2ea60 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
2ea70 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63  EN_UNSPEC;.    c
2ea80 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20  md.p = pState;. 
2ea90 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61     cmd.db = pSta
2eaa0 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  te->db;.    if( 
2eab0 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
2eac0 20 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64     eDbType = ded
2ead0 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
2eae0 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20  cmd.zFile, 1);. 
2eaf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb00 65 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65  eDbType = pState
2eb10 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20  ->openMode;.    
2eb20 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70  }.    if( eDbTyp
2eb30 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
2eb40 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  PFILE ){.      i
2eb50 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
2eb60 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63  CMD_EXTRACT || c
2eb70 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2eb80 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LIST ){.        
2eb90 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30  if( cmd.zFile==0
2eba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d   ){.          cm
2ebb0 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2ebc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2ebd0 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ip");.        }e
2ebe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2ebf0 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2ec00 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2ec10 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d  zipfile(%Q)", cm
2ec20 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d.zFile);.      
2ec30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ec40 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a    cmd.bZip = 1;.
2ec50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d      }else if( cm
2ec60 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
2ec70 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20   int flags;.    
2ec80 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e    if( cmd.bAppen
2ec90 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48  d ) eDbType = SH
2eca0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
2ecb0 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  FS;.      if( cm
2ecc0 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43  d.eCmd==AR_CMD_C
2ecd0 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d  REATE || cmd.eCm
2ece0 64 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54  d==AR_CMD_INSERT
2ecf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
2ed00 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2ed10 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
2ed20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
2ed30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2ed40 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2ed50 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
2ed60 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2ed70 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2ed80 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  ADONLY;.      }.
2ed90 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30        cmd.db = 0
2eda0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2edb0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
2edc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2edd0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20  State->out, "-- 
2ede0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25  open database '%
2edf0 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69  s'%s\n", cmd.zFi
2ee00 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2ee10 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2ee20 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2ee30 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66   " using 'apndvf
2ee40 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  s'" : "");.     
2ee50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2ee60 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d  lite3_open_v2(cm
2ee70 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62  d.zFile, &cmd.db
2ee80 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20  , flags, .      
2ee90 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d         eDbType==
2eea0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2eeb0 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22  DVFS ? "apndvfs"
2eec0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28   : 0);.      if(
2eed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eee0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2eef0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
2ef00 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2ef10 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %s (%s)\n", .  
2ef20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46            cmd.zF
2ef30 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ile, sqlite3_err
2ef40 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20  msg(cmd.db).    
2ef50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67      );.        g
2ef60 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2ef70 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2ef80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f    sqlite3_fileio
2ef90 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c  _init(cmd.db, 0,
2efa0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2efb0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d  e3_sqlar_init(cm
2efc0 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d.db, 0, 0);.   
2efd0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
2efe0 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64  e_function(cmd.d
2eff0 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
2f000 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
2f010 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20  8, 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 20 73 68 65 6c 6c 50 75 74          shellPut
2f040 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  sFunc, 0, 0);.. 
2f050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64     }.    if( cmd
2f060 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26  .zSrcTable==0 &&
2f070 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20   cmd.bZip==0 && 
2f080 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2f090 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69  _HELP ){.      i
2f0a0 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  f( cmd.eCmd!=AR_
2f0b0 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20  CMD_CREATE.     
2f0c0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62    && sqlite3_tab
2f0d0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
2f0e0 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c  ta(cmd.db,0,"sql
2f0f0 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30  ar","name",0,0,0
2f100 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  ,0,0).      ){. 
2f110 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f120 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61  tf(stderr, "data
2f130 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  base does not co
2f140 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27  ntain an 'sqlar'
2f150 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20   table\n");.    
2f160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f170 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
2f180 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2f190 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2f1a0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2f1b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f1c0 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20  f("sqlar");.    
2f1d0 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
2f1e0 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
2f1f0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
2f200 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
2f210 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2f220 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2f230 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  0, 0);.        b
2f240 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f250 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2f260 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2f270 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28  rExtractCommand(
2f280 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
2f290 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f2a0 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20  e AR_CMD_LIST:. 
2f2b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69         rc = arLi
2f2c0 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  stCommand(&cmd);
2f2d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2f2e0 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2f2f0 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20  MD_HELP:.       
2f300 20 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d   arUsage(pState-
2f310 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62  >out);.        b
2f320 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f330 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a  e AR_CMD_INSERT:
2f340 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2f350 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2f360 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30  mmand(&cmd, 1, 0
2f370 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2f380 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
2f390 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
2f3a0 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2f3b0 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20  MD_UPDATE );.   
2f3c0 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2f3d0 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2f3e0 64 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20  d(&cmd, 1, 1);. 
2f3f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f400 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63    }.  }.end_ar_c
2f410 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d  ommand:.  if( cm
2f420 64 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62  d.db!=pState->db
2f430 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62   ){.    close_db
2f440 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20  (cmd.db);.  }.  
2f450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64  sqlite3_free(cmd
2f460 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20  .zSrcTable);..  
2f470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
2f480 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63  End of the ".arc
2f490 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
2f4a0 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a  ommand 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 2a 2f  ***************/
2f500 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2f510 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f520 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
2f530 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f540 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 23  HAVE_ZLIB) */..#
2f550 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2f560 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f570 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
2f580 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44  (SQLITE_ENABLE_D
2f590 42 50 41 47 45 5f 56 54 41 42 29 0a 2f 2a 0a 2a  BPAGE_VTAB)./*.*
2f5a0 2a 20 49 66 20 28 2a 70 52 63 29 20 69 73 20 6e  * If (*pRc) is n
2f5b0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
2f5c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f5d0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2f5e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
2f5f0 65 72 77 69 73 65 2c 20 74 68 65 20 53 51 4c 20  erwise, the SQL 
2f600 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61  statement or sta
2f610 74 65 6d 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20  tements in zSql 
2f620 61 72 65 20 65 78 65 63 75 74 65 64 20 75 73 69  are executed usi
2f630 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ng.** database c
2f640 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 6e 64  onnection db and
2f650 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
2f660 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 63 20  written to *pRc 
2f670 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66  before.** this f
2f680 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2f690 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f6a0 73 68 65 6c 6c 45 78 65 63 28 73 71 6c 69 74 65  shellExec(sqlite
2f6b0 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c  3 *db, int *pRc,
2f6c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2f6d0 6c 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a  l){.  int rc = *
2f6e0 70 52 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pRc;.  if( rc==S
2f6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f700 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2f710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f720 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2f730 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20  0, 0, &zErr);.  
2f740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
2f760 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f770 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
2f780 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ", zErr);.    }.
2f790 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
2f7a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65   }.}../*.** Like
2f7b0 20 73 68 65 6c 6c 45 78 65 63 28 29 2c 20 65 78   shellExec(), ex
2f7c0 63 65 70 74 20 74 68 61 74 20 7a 46 6d 74 20 69  cept that zFmt i
2f7d0 73 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79  s a printf() sty
2f7e0 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  le format string
2f7f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f800 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66   shellExecPrintf
2f810 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2f820 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
2f830 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
2f840 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
2f850 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
2f860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c  E_OK ){.    va_l
2f870 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73  ist ap;.    va_s
2f880 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2f890 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
2f8a0 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
2f8b0 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2f8c0 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  p);.    if( z==0
2f8d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
2f8e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f8f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f900 73 68 65 6c 6c 45 78 65 63 28 64 62 2c 20 70 52  shellExec(db, pR
2f910 63 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  c, z);.    }.   
2f920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2f930 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
2f940 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2f950 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2f960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f970 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2f980 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
2f990 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
2f9a0 20 6d 61 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   made to allocat
2f9b0 65 2c 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  e, zero and retu
2f9c0 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
2f9d0 74 6f 20 61 20 62 75 66 66 65 72 20 6e 42 79 74  to a buffer nByt
2f9e0 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  e bytes in size.
2f9f0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
2fa00 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73   occurs, *pRc is
2fa10 20 73 65 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54   set.** to SQLIT
2fa20 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c  E_NOMEM and NULL
2fa30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2fa40 61 74 69 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c  atic void *shell
2fa50 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c  Malloc(int *pRc,
2fa60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
2fa70 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Byte){.  void *p
2fa80 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  Ret = 0;.  if( *
2fa90 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2faa0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
2fab0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
2fac0 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
2fad0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  et==0 ){.      *
2fae0 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2faf0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2fb00 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
2fb10 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
2fb20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2fb30 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
2fb40 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2fb50 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2fb60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2fb70 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2fb80 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
2fb90 65 2c 20 7a 46 6d 74 20 69 73 20 74 72 65 61 74  e, zFmt is treat
2fba0 65 64 20 61 73 20 61 20 70 72 69 6e 74 66 28 29  ed as a printf()
2fbb0 20 73 74 79 6c 65 20 73 74 72 69 6e 67 2e 20 54   style string. T
2fbc0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2fbd0 66 6f 72 6d 61 74 74 69 6e 67 20 69 74 20 61 6c  formatting it al
2fbe0 6f 6e 67 20 77 69 74 68 20 61 6e 79 20 74 72 61  ong with any tra
2fbf0 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  iling arguments 
2fc00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2fc10 61 20 0a 2a 2a 20 62 75 66 66 65 72 20 6f 62 74  a .** buffer obt
2fc20 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2fc30 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64  e3_malloc(), and
2fc40 20 70 6f 69 6e 74 65 72 20 74 6f 20 77 68 69 63   pointer to whic
2fc50 68 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  h is returned..*
2fc60 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
2fc70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2fc80 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
2fc90 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
2fca0 20 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67   buffer.** using
2fcb0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2fcc0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a  e3_free()..** .*
2fcd0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
2fce0 72 20 6f 63 63 75 72 73 2c 20 28 2a 70 52 63 29  r occurs, (*pRc)
2fcf0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
2fd00 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55  E_NOMEM and a NU
2fd10 4c 4c 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72  LL .** pointer r
2fd20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2fd30 69 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50  ic char *shellMP
2fd40 72 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20  rintf(int *pRc, 
2fd50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
2fd60 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
2fd70 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  z = 0;.  if( *pR
2fd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd90 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
2fda0 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
2fdb0 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20   zFmt);.    z = 
2fdc0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2fdd0 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
2fde0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
2fdf0 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2fe00 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2fe10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2fe20 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 73  .  return z;.}.s
2fe30 74 61 74 69 63 20 69 6e 74 20 73 68 61 72 65 64  tatic int shared
2fe40 53 63 68 65 6d 61 46 69 78 28 53 68 65 6c 6c 53  SchemaFix(ShellS
2fe50 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 63 6f  tate *pState, co
2fe60 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69  nst char *zDb, i
2fe70 6e 74 20 65 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt eFix){.  int 
2fe80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2fe90 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 30 3b    i64 iLast = 0;
2fea0 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d  .  int iCookie =
2feb0 20 30 3b 0a 20 20 69 6e 74 20 69 41 75 74 6f 56   0;.  int iAutoV
2fec0 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  acuum = 0;.  sql
2fed0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2fee0 20 3d 20 30 3b 0a 0a 20 20 73 68 65 6c 6c 45 78   = 0;..  shellEx
2fef0 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
2ff00 3e 64 62 2c 20 26 72 63 2c 20 22 41 54 54 41 43  >db, &rc, "ATTAC
2ff10 48 20 27 25 71 27 20 41 53 20 5f 73 68 61 72 65  H '%q' AS _share
2ff20 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c 20 7a  d_schema_tmp", z
2ff30 44 62 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63  Db);.  shellExec
2ff40 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64  Printf(pState->d
2ff50 62 2c 20 26 72 63 2c 20 22 50 52 41 47 4d 41 20  b, &rc, "PRAGMA 
2ff60 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
2ff70 3d 20 31 22 29 3b 0a 20 20 73 68 65 6c 6c 45 78  = 1");.  shellEx
2ff80 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
2ff90 3e 64 62 2c 20 26 72 63 2c 20 22 42 45 47 49 4e  >db, &rc, "BEGIN
2ffa0 22 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  ");.  shellPrepa
2ffb0 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
2ffc0 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
2ffd0 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
2ffe0 20 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d   max(rowid) FROM
2fff0 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f   _shared_schema_
30000 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  tmp.sqlite_maste
30010 72 22 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  r".  );.  sqlite
30020 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
30030 20 69 4c 61 73 74 20 3d 20 73 71 6c 69 74 65 33   iLast = sqlite3
30040 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
30050 74 6d 74 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c  tmt, 0);.  shell
30060 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
30070 74 6d 74 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65  tmt);.  shellPre
30080 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74  parePrintf(pStat
30090 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74  e->db, &rc, &pSt
300a0 6d 74 2c 0a 20 20 20 20 20 20 22 49 4e 53 45 52  mt,.      "INSER
300b0 54 20 49 4e 54 4f 20 5f 73 68 61 72 65 64 5f 73  T INTO _shared_s
300c0 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65  chema_tmp.sqlite
300d0 5f 6d 61 73 74 65 72 20 53 45 4c 45 43 54 20 22  _master SELECT "
300e0 0a 20 20 20 20 20 20 22 20 20 74 79 70 65 2c 20  .      "  type, 
300f0 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20  name, tbl_name, 
30100 28 22 0a 20 20 20 20 20 20 22 20 20 20 20 53 45  (".      "    SE
30110 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
30120 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d  OM _shared_schem
30130 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73  a_tmp.sqlite_mas
30140 74 65 72 20 57 48 45 52 45 20 22 0a 20 20 20 20  ter WHERE ".    
30150 20 20 22 20 20 20 20 20 20 74 79 70 65 20 49 53    "      type IS
30160 20 6f 2e 74 79 70 65 20 41 4e 44 20 6e 61 6d 65   o.type AND name
30170 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 72   IS o.name AND r
30180 6f 77 69 64 3c 3d 3f 22 0a 20 20 20 20 20 20 22  owid<=?".      "
30190 20 20 29 2c 20 73 71 6c 20 46 52 4f 4d 20 6d 61    ), sql FROM ma
301a0 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  in.sqlite_master
301b0 20 41 53 20 6f 22 0a 20 20 29 3b 0a 20 20 73 71   AS o".  );.  sq
301c0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
301d0 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 61 73 74  (pStmt, 1, iLast
301e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  );.  sqlite3_ste
301f0 70 28 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c  p(pStmt);.  shel
30200 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
30210 53 74 6d 74 29 3b 0a 0a 20 20 73 68 65 6c 6c 45  Stmt);..  shellE
30220 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65  xecPrintf(pState
30230 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20  ->db, &rc,.     
30240 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5f 73   "DELETE FROM _s
30250 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
30260 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57  .sqlite_master W
30270 48 45 52 45 20 72 6f 77 69 64 3c 3d 25 6c 6c 64  HERE rowid<=%lld
30280 22 2c 0a 20 20 20 20 20 20 69 4c 61 73 74 0a 20  ",.      iLast. 
30290 20 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50   );.  shellExecP
302a0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
302b0 2c 20 26 72 63 2c 20 22 43 4f 4d 4d 49 54 22 29  , &rc, "COMMIT")
302c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
302d0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 50 52  (pState->db, "PR
302e0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
302f0 68 65 6d 61 20 3d 20 30 22 2c 20 30 2c 20 30 2c  hema = 0", 0, 0,
30300 20 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20   0);..  /* Copy 
30310 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
30320 73 65 74 74 69 6e 67 20 66 72 6f 6d 20 6d 61 69  setting from mai
30330 6e 20 74 6f 20 74 68 65 20 74 61 72 67 65 74 20  n to the target 
30340 64 62 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65  db */.  shellPre
30350 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74  parePrintf(pStat
30360 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74  e->db, &rc, &pSt
30370 6d 74 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e  mt, "PRAGMA main
30380 2e 61 75 74 6f 5f 76 61 63 75 75 6d 22 29 3b 0a  .auto_vacuum");.
30390 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
303a0 53 74 6d 74 29 3b 0a 20 20 69 41 75 74 6f 56 61  Stmt);.  iAutoVa
303b0 63 75 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  cuum = sqlite3_c
303c0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
303d0 20 30 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61   0);.  shellFina
303e0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
303f0 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69  ;.  shellExecPri
30400 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
30410 26 72 63 2c 20 0a 20 20 20 20 20 20 22 50 52 41  &rc, .      "PRA
30420 47 4d 41 20 5f 73 68 61 72 65 64 5f 73 63 68 65  GMA _shared_sche
30430 6d 61 5f 74 6d 70 2e 61 75 74 6f 5f 76 61 63 75  ma_tmp.auto_vacu
30440 75 6d 20 3d 20 25 64 22 2c 20 69 41 75 74 6f 56  um = %d", iAutoV
30450 61 63 75 75 6d 0a 20 20 29 3b 0a 0a 20 20 2f 2a  acuum.  );..  /*
30460 20 56 61 63 75 75 6d 20 74 68 65 20 64 62 20 69   Vacuum the db i
30470 6e 20 6f 72 64 65 72 20 74 6f 20 73 74 61 6e 64  n order to stand
30480 61 72 64 69 7a 65 20 74 68 65 20 72 6f 6f 74 70  ardize the rootp
30490 61 67 65 20 6e 75 6d 62 65 72 73 2e 20 2a 2f 0a  age numbers. */.
304a0 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74    shellExecPrint
304b0 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  f(pState->db, &r
304c0 63 2c 20 22 56 41 43 55 55 4d 20 5f 73 68 61 72  c, "VACUUM _shar
304d0 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 29 3b  ed_schema_tmp");
304e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73  ..  /* Set the s
304f0 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 76 61 6c  chema-cookie val
30500 75 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 61  ue to the same a
30510 73 20 64 61 74 61 62 61 73 65 20 22 6d 61 69 6e  s database "main
30520 22 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  " */.  shellPrep
30530 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
30540 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d  ->db, &rc, &pStm
30550 74 2c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  t, "PRAGMA main.
30560 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 29  schema_version")
30570 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
30580 28 70 53 74 6d 74 29 3b 0a 20 20 69 43 6f 6f 6b  (pStmt);.  iCook
30590 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ie = sqlite3_col
305a0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
305b0 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  );.  shellFinali
305c0 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
305d0 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74    shellExecPrint
305e0 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  f(pState->db, &r
305f0 63 2c 20 0a 20 20 20 20 20 20 22 50 52 41 47 4d  c, .      "PRAGM
30600 41 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61  A _shared_schema
30610 5f 74 6d 70 2e 73 63 68 65 6d 61 5f 76 65 72 73  _tmp.schema_vers
30620 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f 6f 6b  ion = %d", iCook
30630 69 65 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ie.  );..  sqlit
30640 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d 3e  e3_exec(pState->
30650 64 62 2c 20 22 44 45 54 41 43 48 20 5f 73 68 61  db, "DETACH _sha
30660 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c  red_schema_tmp",
30670 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74   0, 0, 0);.  ret
30680 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
30690 63 20 69 6e 74 20 73 68 61 72 65 64 53 63 68 65  c int sharedSche
306a0 6d 61 43 68 65 63 6b 28 53 68 65 6c 6c 53 74 61  maCheck(ShellSta
306b0 74 65 20 2a 70 53 74 61 74 65 2c 20 63 6f 6e 73  te *pState, cons
306c0 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69 6e 74  t char *zDb, int
306d0 20 2a 70 65 46 69 78 29 7b 0a 20 20 69 6e 74 20   *peFix){.  int 
306e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
306f0 20 20 69 6e 74 20 62 46 61 69 6c 65 64 20 3d 20    int bFailed = 
30700 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
30710 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  t *pStmt = 0;.. 
30720 20 69 66 28 20 70 65 46 69 78 20 29 20 2a 70 65   if( peFix ) *pe
30730 46 69 78 20 3d 20 30 3b 0a 20 20 73 68 65 6c 6c  Fix = 0;.  shell
30740 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74  ExecPrintf(pStat
30750 65 2d 3e 64 62 2c 20 26 72 63 2c 20 22 41 54 54  e->db, &rc, "ATT
30760 41 43 48 20 27 25 71 27 20 41 53 20 5f 73 68 61  ACH '%q' AS _sha
30770 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c  red_schema_tmp",
30780 20 7a 44 62 29 3b 0a 0a 20 20 2f 2a 20 43 68 65   zDb);..  /* Che
30790 63 6b 20 69 66 20 74 68 69 73 20 64 61 74 61 62  ck if this datab
307a0 61 73 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ase has the same
307b0 20 73 65 74 20 6f 66 20 6f 62 6a 65 63 74 73 20   set of objects 
307c0 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  as the current d
307d0 62 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  b */.  shellPrep
307e0 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
307f0 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d  ->db, &rc, &pStm
30800 74 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20  t, .    "SELECT 
30810 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20  type, name FROM 
30820 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74  _shared_schema_t
30830 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  mp.sqlite_master
30840 20 41 53 20 6f 20 22 0a 20 20 20 20 22 57 48 45   AS o ".    "WHE
30850 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20 28 22  RE NOT EXISTS ("
30860 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 31  .    "  SELECT 1
30870 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74   FROM main.sqlit
30880 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 22  e_master ".    "
30890 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65 20 49      WHERE name I
308a0 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70  S o.name AND typ
308b0 65 20 49 53 20 6f 2e 74 79 70 65 22 0a 20 20 20  e IS o.type".   
308c0 20 22 29 22 0a 20 20 20 20 22 20 55 4e 49 4f 4e   ")".    " UNION
308d0 20 41 4c 4c 20 22 0a 20 20 20 20 22 53 45 4c 45   ALL ".    "SELE
308e0 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52  CT type, name FR
308f0 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  OM main.sqlite_m
30900 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20 20 20  aster AS o ".   
30910 20 22 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53   "WHERE NOT EXIS
30920 54 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  TS (".    "  SEL
30930 45 43 54 20 31 20 46 52 4f 4d 20 5f 73 68 61 72  ECT 1 FROM _shar
30940 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71  ed_schema_tmp.sq
30950 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
30960 20 20 22 20 20 20 20 57 48 45 52 45 20 6e 61 6d    "    WHERE nam
30970 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20  e IS o.name AND 
30980 74 79 70 65 20 49 53 20 6f 2e 74 79 70 65 22 0a  type IS o.type".
30990 20 20 20 20 22 29 22 0a 20 20 29 3b 0a 20 20 69      ")".  );.  i
309a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
309b0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
309c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
309d0 6d 74 29 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  mt) ){.    utf8_
309e0 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
309f0 75 74 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63  ut, "%s is NOT c
30a00 6f 6d 70 61 74 69 62 6c 65 20 28 6f 62 6a 65 63  ompatible (objec
30a10 74 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20 20  ts)\n", zDb);.  
30a20 20 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20    bFailed = 1;. 
30a30 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69   }.  shellFinali
30a40 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
30a50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
30a60 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 73  his database has
30a70 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
30a80 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
30a90 61 73 20 74 68 65 20 0a 20 20 2a 2a 20 63 75 72  as the .  ** cur
30aa0 72 65 6e 74 20 64 62 2e 20 2a 2f 0a 20 20 69 66  rent db. */.  if
30ab0 28 20 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  ( bFailed==0 ){.
30ac0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
30ad0 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64  Printf(pState->d
30ae0 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20  b, &rc, &pStmt, 
30af0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
30b00 20 31 20 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f   1 FROM _shared_
30b10 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74  schema_tmp.sqlit
30b20 65 5f 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a  e_master AS o ".
30b30 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
30b40 71 6c 20 49 53 20 4e 4f 54 20 28 22 0a 20 20 20  ql IS NOT (".   
30b50 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73       "  SELECT s
30b60 71 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c  ql FROM main.sql
30b70 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
30b80 20 20 20 20 20 22 20 20 20 20 57 48 45 52 45 20       "    WHERE 
30b90 6e 61 6d 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41  name IS o.name A
30ba0 4e 44 20 74 79 70 65 20 49 53 20 6f 2e 74 79 70  ND type IS o.typ
30bb0 65 22 0a 20 20 20 20 20 20 20 20 22 29 22 0a 20  e".        ")". 
30bc0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
30bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
30be0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
30bf0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
30c00 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30c10 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
30c20 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70   "%s is NOT comp
30c30 61 74 69 62 6c 65 20 28 53 51 4c 29 5c 6e 22 2c  atible (SQL)\n",
30c40 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 62 46 61   zDb);.      bFa
30c50 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
30c60 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
30c70 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
30c80 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
30c90 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
30ca0 68 61 73 20 74 68 65 20 73 61 6d 65 20 73 65 74  has the same set
30cb0 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 61   of root pages a
30cc0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  s the current . 
30cd0 20 2a 2a 20 64 62 2e 20 2a 2f 0a 20 20 69 66 28   ** db. */.  if(
30ce0 20 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20   bFailed==0 ){. 
30cf0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
30d00 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
30d10 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
30d20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
30d30 31 20 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73  1 FROM _shared_s
30d40 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65  chema_tmp.sqlite
30d50 5f 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20  _master AS o ". 
30d60 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
30d70 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20 28 22  otpage IS NOT ("
30d80 0a 20 20 20 20 20 20 20 20 22 20 20 53 45 4c 45  .        "  SELE
30d90 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d  CT rootpage FROM
30da0 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73   main.sqlite_mas
30db0 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 20  ter ".        " 
30dc0 20 20 20 57 48 45 52 45 20 6e 61 6d 65 20 49 53     WHERE name IS
30dd0 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79 70 65   o.name AND type
30de0 20 49 53 20 6f 2e 74 79 70 65 22 0a 20 20 20 20   IS o.type".    
30df0 20 20 20 20 22 29 22 0a 20 20 20 20 29 3b 0a 20      ")".    );. 
30e00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30e10 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
30e20 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
30e30 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
30e40 20 69 66 28 20 70 65 46 69 78 3d 3d 30 20 29 7b   if( peFix==0 ){
30e50 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30e60 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
30e70 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f 6d  , "%s is NOT com
30e80 70 61 74 69 62 6c 65 20 28 72 6f 6f 74 20 70 61  patible (root pa
30e90 67 65 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a 20  ges)\n", zDb);. 
30ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 46 61       }.      bFa
30eb0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
30ec0 69 66 28 20 70 65 46 69 78 20 29 20 2a 70 65 46  if( peFix ) *peF
30ed0 69 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ix = 1;.    }.  
30ee0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
30ef0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
30f00 0a 0a 20 20 69 66 28 20 62 46 61 69 6c 65 64 3d  ..  if( bFailed=
30f10 3d 30 20 29 7b 0a 20 20 20 20 73 68 65 6c 6c 50  =0 ){.    shellP
30f20 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74  reparePrintf(pSt
30f30 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  ate->db, &rc, &p
30f40 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20 20 22  Stmt, .        "
30f50 53 45 4c 45 43 54 20 31 20 57 48 45 52 45 20 28  SELECT 1 WHERE (
30f60 22 0a 20 20 20 20 20 20 20 20 22 20 20 53 45 4c  ".        "  SEL
30f70 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
30f80 28 72 6f 6f 74 70 61 67 65 20 7c 7c 20 27 2e 27  (rootpage || '.'
30f90 20 7c 7c 20 6e 61 6d 65 20 7c 7c 20 27 2e 27 20   || name || '.' 
30fa0 7c 7c 20 73 71 6c 2c 20 27 2e 27 29 20 22 0a 20  || sql, '.') ". 
30fb0 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 5f         "  FROM _
30fc0 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d  shared_schema_tm
30fd0 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  p.sqlite_master"
30fe0 0a 20 20 20 20 20 20 20 20 22 29 20 49 53 20 4e  .        ") IS N
30ff0 4f 54 20 28 22 0a 20 20 20 20 20 20 20 20 22 20  OT (".        " 
31000 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f   SELECT group_co
31010 6e 63 61 74 28 72 6f 6f 74 70 61 67 65 20 7c 7c  ncat(rootpage ||
31020 20 27 2e 27 20 7c 7c 20 6e 61 6d 65 20 7c 7c 20   '.' || name || 
31030 27 2e 27 20 7c 7c 20 73 71 6c 2c 20 27 2e 27 29  '.' || sql, '.')
31040 20 22 0a 20 20 20 20 20 20 20 20 22 20 20 46 52   ".        "  FR
31050 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  OM main.sqlite_m
31060 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 22  aster".        "
31070 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  )".    );.    if
31080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31090 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
310a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
310b0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
310c0 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  peFix==0 ){.    
310d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
310e0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
310f0 20 20 20 20 20 20 20 20 20 20 22 25 73 20 69 73            "%s is
31100 20 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c 65 20   NOT compatible 
31110 28 6f 72 64 65 72 20 6f 66 20 73 71 6c 69 74 65  (order of sqlite
31120 5f 6d 61 73 74 65 72 20 72 6f 77 73 29 5c 6e 22  _master rows)\n"
31130 2c 20 7a 44 62 0a 20 20 20 20 20 20 20 20 29 3b  , zDb.        );
31140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
31150 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
31160 20 20 69 66 28 20 70 65 46 69 78 20 29 20 2a 70    if( peFix ) *p
31170 65 46 69 78 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  eFix = 2;.    }.
31180 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
31190 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
311a0 20 7d 0a 0a 20 20 69 66 28 20 62 46 61 69 6c 65   }..  if( bFaile
311b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  d==0 ){.    int 
311c0 69 4d 61 69 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  iMain = -1;.    
311d0 69 6e 74 20 69 4e 65 77 20 3d 20 2b 31 3b 0a 20  int iNew = +1;. 
311e0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
311f0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
31200 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a  , &rc, &pStmt, .
31210 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20          "PRAGMA 
31220 6d 61 69 6e 2e 73 63 68 65 6d 61 5f 76 65 72 73  main.schema_vers
31230 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ion".    );.    
31240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31250 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
31260 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
31270 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 4d  tmt) ){.      iM
31280 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ain = sqlite3_co
31290 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
312a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  0);.    }.    sh
312b0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
312c0 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 68 65   pStmt);.    she
312d0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
312e0 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
312f0 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20   &pStmt, .      
31300 20 20 22 50 52 41 47 4d 41 20 5f 73 68 61 72 65    "PRAGMA _share
31310 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 63 68  d_schema_tmp.sch
31320 65 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20 20 20  ema_version".   
31330 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
31340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
31350 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
31360 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
31370 20 20 20 20 20 20 69 4e 65 77 20 3d 20 73 71 6c        iNew = sql
31380 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
31390 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
313a0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
313b0 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a  ze(&rc, pStmt);.
313c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
313d0 54 45 5f 4f 4b 20 26 26 20 69 4d 61 69 6e 21 3d  TE_OK && iMain!=
313e0 69 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  iNew ){.      if
313f0 28 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20  ( peFix==0 ){.  
31400 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31410 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a  f(pState->out, .
31420 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20              "%s 
31430 69 73 20 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c  is NOT compatibl
31440 65 20 28 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  e (schema cookie
31450 29 5c 6e 22 2c 20 7a 44 62 0a 20 20 20 20 20 20  )\n", zDb.      
31460 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
31470 20 20 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a     bFailed = 1;.
31480 20 20 20 20 20 20 69 66 28 20 70 65 46 69 78 20        if( peFix 
31490 29 20 2a 70 65 46 69 78 20 3d 20 33 3b 0a 20 20  ) *peFix = 3;.  
314a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
314b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
314c0 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  bFailed==0 ){.  
314d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53    utf8_printf(pS
314e0 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 20 69  tate->out, "%s i
314f0 73 20 63 6f 6d 70 61 74 69 62 6c 65 5c 6e 22 2c  s compatible\n",
31500 20 7a 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 73 71   zDb);.  }..  sq
31510 6c 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74  lite3_exec(pStat
31520 65 2d 3e 64 62 2c 20 22 44 45 54 41 43 48 20 5f  e->db, "DETACH _
31530 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d  shared_schema_tm
31540 70 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  p", 0, 0, 0);.  
31550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31560 0a 2a 2a 20 2e 73 68 61 72 65 64 2d 73 63 68 65  .** .shared-sche
31570 6d 61 20 63 68 65 63 6b 7c 66 69 78 20 44 42 31  ma check|fix DB1
31580 20 44 42 32 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69   DB2....*/.stati
31590 63 20 69 6e 74 20 73 68 61 72 65 64 53 63 68 65  c int sharedSche
315a0 6d 61 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  maDotCommand(.  
315b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
315c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
315d0 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
315e0 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
315f0 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31610 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
31620 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
31630 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
31640 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
31670 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
31680 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ] */.){.  int rc
31690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
316a0 69 6e 74 20 62 46 69 78 20 3d 20 30 3b 20 20 20  int bFix = 0;   
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316c0 2f 2a 20 46 69 78 20 64 61 74 61 62 61 73 65 73  /* Fix databases
316d0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
316e0 20 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20    int n1;.  int 
316f0 69 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 33 20  i;.  if( nArg<3 
31700 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 68 61 72  ){.    goto shar
31710 65 64 5f 73 63 68 65 6d 61 5f 75 73 61 67 65 3b  ed_schema_usage;
31720 0a 20 20 7d 0a 0a 20 20 6e 31 20 3d 20 28 69 6e  .  }..  n1 = (in
31730 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 31  t)strlen(azArg[1
31740 5d 29 3b 0a 20 20 69 66 28 20 6e 31 3e 30 20 26  ]);.  if( n1>0 &
31750 26 20 6e 31 3c 3d 33 20 26 26 20 6d 65 6d 63 6d  & n1<=3 && memcm
31760 70 28 22 66 69 78 22 2c 20 61 7a 41 72 67 5b 31  p("fix", azArg[1
31770 5d 2c 20 6e 31 29 3d 3d 30 20 29 7b 0a 20 20 20  ], n1)==0 ){.   
31780 20 62 46 69 78 20 3d 20 31 3b 0a 20 20 7d 65 6c   bFix = 1;.  }el
31790 73 65 20 69 66 28 20 6e 31 3d 3d 30 20 7c 7c 20  se if( n1==0 || 
317a0 6e 31 3e 35 20 7c 7c 20 6d 65 6d 63 6d 70 28 22  n1>5 || memcmp("
317b0 63 68 65 63 6b 22 2c 20 61 7a 41 72 67 5b 31 5d  check", azArg[1]
317c0 2c 20 6e 31 29 20 29 7b 0a 20 20 20 20 67 6f 74  , n1) ){.    got
317d0 6f 20 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f  o shared_schema_
317e0 75 73 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 66 6f  usage;.  }..  fo
317f0 72 28 69 3d 32 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=2; rc==SQLIT
31800 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20  E_OK && i<nArg; 
31810 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 65 46  i++){.    int eF
31820 69 78 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ix = 0;.    rc =
31830 20 73 68 61 72 65 64 53 63 68 65 6d 61 43 68 65   sharedSchemaChe
31840 63 6b 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67  ck(pState, azArg
31850 5b 69 5d 2c 20 62 46 69 78 20 3f 20 26 65 46 69  [i], bFix ? &eFi
31860 78 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  x : 0);.    if( 
31870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31880 20 62 46 69 78 20 26 26 20 65 46 69 78 20 29 7b   bFix && eFix ){
31890 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
318a0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
318b0 22 46 69 78 69 6e 67 20 25 73 2e 2e 2e 20 22 2c  "Fixing %s... ",
318c0 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
318d0 20 20 66 66 6c 75 73 68 28 70 53 74 61 74 65 2d    fflush(pState-
318e0 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 63 20  >out);.      rc 
318f0 3d 20 73 68 61 72 65 64 53 63 68 65 6d 61 46 69  = sharedSchemaFi
31900 78 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b  x(pState, azArg[
31910 69 5d 2c 20 65 46 69 78 29 3b 0a 20 20 20 20 20  i], eFix);.     
31920 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
31940 20 3d 20 73 68 61 72 65 64 53 63 68 65 6d 61 43   = sharedSchemaC
31950 68 65 63 6b 28 70 53 74 61 74 65 2c 20 61 7a 41  heck(pState, azA
31960 72 67 5b 69 5d 2c 20 26 65 46 69 78 29 3b 0a 20  rg[i], &eFix);. 
31970 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
31980 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 78  QLITE_OK && eFix
31990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
319a0 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  f8_printf(pState
319b0 2d 3e 6f 75 74 2c 20 22 56 41 43 55 55 4d 69 6e  ->out, "VACUUMin
319c0 67 20 6d 61 69 6e 2e 2e 2e 20 22 29 3b 0a 20 20  g main... ");.  
319d0 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 70          fflush(p
319e0 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20  State->out);.   
319f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31a00 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65 2d  te3_exec(pState-
31a10 3e 64 62 2c 20 22 56 41 43 55 55 4d 20 6d 61 69  >db, "VACUUM mai
31a20 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  n", 0, 0, 0);.  
31a30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68           rc = sh
31a60 61 72 65 64 53 63 68 65 6d 61 43 68 65 63 6b 28  aredSchemaCheck(
31a70 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b 69 5d  pState, azArg[i]
31a80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
31a90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31aa0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 73 68 61   return rc;. sha
31ac0 72 65 64 5f 73 63 68 65 6d 61 5f 75 73 61 67 65  red_schema_usage
31ad0 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  :.  raw_printf(s
31ae0 74 64 65 72 72 2c 20 22 75 73 61 67 65 3a 20 2e  tderr, "usage: .
31af0 73 68 61 72 65 64 2d 73 63 68 65 6d 61 20 63 68  shared-schema ch
31b00 65 63 6b 7c 66 69 78 20 44 42 31 20 44 42 32 2e  eck|fix DB1 DB2.
31b10 2e 2e 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e  ..\n");.  return
31b20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
31b30 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e  ../*.** When run
31b40 6e 69 6e 67 20 74 68 65 20 22 2e 72 65 63 6f 76  ning the ".recov
31b50 65 72 22 20 63 6f 6d 6d 61 6e 64 2c 20 65 61 63  er" command, eac
31b60 68 20 6f 75 74 70 75 74 20 74 61 62 6c 65 2c 20  h output table, 
31b70 61 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c 0a  and the special.
31b80 2a 2a 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 20  ** orphaned row 
31b90 74 61 62 6c 65 20 69 66 20 69 74 20 69 73 20 72  table if it is r
31ba0 65 71 75 69 72 65 64 2c 20 69 73 20 72 65 70 72  equired, is repr
31bb0 65 73 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e  esented by an in
31bc0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  stance.** of the
31bd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
31be0 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
31bf0 72 75 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c  ruct RecoverTabl
31c00 65 20 52 65 63 6f 76 65 72 54 61 62 6c 65 3b 0a  e RecoverTable;.
31c10 73 74 72 75 63 74 20 52 65 63 6f 76 65 72 54 61  struct RecoverTa
31c20 62 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a 51  ble {.  char *zQ
31c30 75 6f 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  uoted;          
31c40 20 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65          /* Quote
31c50 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 61 62  d version of tab
31c60 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  le name */.  int
31c70 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c90 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
31ca0 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  s in table */.  
31cb0 63 68 61 72 20 2a 2a 61 7a 6c 43 6f 6c 3b 20 20  char **azlCol;  
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75  /* Array of colu
31ce0 6d 6e 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e  mn lists */.  in
31cf0 74 20 69 50 6b 3b 20 20 20 20 20 20 20 20 20 20  t iPk;          
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d10 20 49 6e 64 65 78 20 6f 66 20 49 50 4b 20 63 6f   Index of IPK co
31d20 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  lumn */.};../*.*
31d30 2a 20 46 72 65 65 20 61 20 52 65 63 6f 76 65 72  * Free a Recover
31d40 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 6c 6c  Table object all
31d50 6f 63 61 74 65 64 20 62 79 20 72 65 63 6f 76 65  ocated by recove
31d60 72 46 69 6e 64 54 61 62 6c 65 28 29 20 6f 72 0a  rFindTable() or.
31d70 2a 2a 20 72 65 63 6f 76 65 72 4f 72 70 68 61 6e  ** recoverOrphan
31d80 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  Table()..*/.stat
31d90 69 63 20 76 6f 69 64 20 72 65 63 6f 76 65 72 46  ic void recoverF
31da0 72 65 65 54 61 62 6c 65 28 52 65 63 6f 76 65 72  reeTable(Recover
31db0 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
31dc0 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
31dd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
31de0 62 2d 3e 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  b->zQuoted);.   
31df0 20 69 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43 6f   if( pTab->azlCo
31e00 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  l ){.      int i
31e10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
31e20 20 69 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20   i<=pTab->nCol; 
31e30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
31e40 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d  lite3_free(pTab-
31e50 3e 61 7a 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  >azlCol[i]);.   
31e60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31e70 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a  e3_free(pTab->az
31e80 6c 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lCol);.    }.   
31e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
31ea0 61 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ab);.  }.}../*.*
31eb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31ec0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 28 2a  is a no-op if (*
31ed0 70 52 63 29 20 69 73 20 6e 6f 74 20 53 51 4c 49  pRc) is not SQLI
31ee0 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73  TE_OK when it is
31ef0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65   called..** Othe
31f00 72 77 69 73 65 2c 20 69 74 20 61 6c 6c 6f 63 61  rwise, it alloca
31f10 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
31f20 61 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f  a RecoverTable o
31f30 62 6a 65 63 74 20 62 61 73 65 64 20 6f 6e 20 74  bject based on t
31f40 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 66 6f 75 72  he.** final four
31f50 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
31f60 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
31f70 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  on. It is the re
31f80 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
31f90 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
31fa0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
31fb0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
31fc0 6a 65 63 74 20 75 73 69 6e 67 0a 2a 2a 20 72 65  ject using.** re
31fd0 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 29  coverFreeTable()
31fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f  ..*/.static Reco
31ff0 76 65 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65  verTable *recove
32000 72 4e 65 77 54 61 62 6c 65 28 0a 20 20 69 6e 74  rNewTable(.  int
32010 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
32020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32030 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
32040 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
32050 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
32060 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
32070 6f 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  of table */.  co
32080 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
32090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
320a0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
320b0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
320c0 20 62 49 6e 74 6b 65 79 2c 20 0a 20 20 69 6e 74   bIntkey, .  int
320d0 20 6e 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69 74   nCol.){.  sqlit
320e0 65 33 20 2a 64 62 74 6d 70 20 3d 20 30 3b 20 20  e3 *dbtmp = 0;  
320f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
32100 6c 69 74 65 33 20 68 61 6e 64 6c 65 20 66 6f 72  lite3 handle for
32110 20 74 65 73 74 69 6e 67 20 43 52 45 41 54 45 20   testing CREATE 
32120 54 41 42 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 72  TABLE */.  int r
32130 63 20 3d 20 2a 70 52 63 3b 0a 20 20 52 65 63 6f  c = *pRc;.  Reco
32140 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  verTable *pTab =
32150 20 30 3b 0a 0a 20 20 70 54 61 62 20 3d 20 28 52   0;..  pTab = (R
32160 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65  ecoverTable*)she
32170 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69  llMalloc(&rc, si
32180 7a 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c  zeof(RecoverTabl
32190 65 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  e));.  if( rc==S
321a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
321b0 69 6e 74 20 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b  int nSqlCol = 0;
321c0 0a 20 20 20 20 69 6e 74 20 62 53 71 6c 49 6e 74  .    int bSqlInt
321d0 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  key = 0;.    sql
321e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
321f0 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 72   = 0;.    .    r
32200 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
32210 28 22 22 2c 20 26 64 62 74 6d 70 29 3b 0a 20 20  ("", &dbtmp);.  
32220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
32240 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
32250 62 74 6d 70 2c 20 22 50 52 41 47 4d 41 20 77 72  btmp, "PRAGMA wr
32260 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d 20  itable_schema = 
32270 6f 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  on", 0, 0, 0);. 
32280 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
32290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
322a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
322b0 5f 65 78 65 63 28 64 62 74 6d 70 2c 20 7a 53 71  _exec(dbtmp, zSq
322c0 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
322d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
322e0 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  E_ERROR ){.     
322f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
32300 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
32310 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20  finished;.      
32320 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  }.    }.    shel
32330 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 64  lPreparePrintf(d
32340 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d  btmp, &rc, &pStm
32350 74 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  t, .        "SEL
32360 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
32370 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69  M pragma_table_i
32380 6e 66 6f 28 25 51 29 22 2c 20 7a 4e 61 6d 65 0a  nfo(%Q)", zName.
32390 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
323a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
323b0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
323c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
323d0 29 7b 0a 20 20 20 20 20 20 6e 53 71 6c 43 6f 6c  ){.      nSqlCol
323e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
323f0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
32400 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
32410 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
32420 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  tmt);..    if( r
32430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32440 6e 53 71 6c 43 6f 6c 3c 6e 43 6f 6c 20 29 7b 0a  nSqlCol<nCol ){.
32450 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
32460 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  hed;.    }..    
32470 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
32480 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26  tf(dbtmp, &rc, &
32490 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 22 53  pStmt, .      "S
324a0 45 4c 45 43 54 20 28 22 0a 20 20 20 20 20 20 22  ELECT (".      "
324b0 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28    SELECT substr(
324c0 64 61 74 61 2c 31 2c 31 29 3d 3d 58 27 30 44 27  data,1,1)==X'0D'
324d0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
324e0 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 72  age WHERE pgno=r
324f0 6f 6f 74 70 61 67 65 22 0a 20 20 20 20 20 20 22  ootpage".      "
32500 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
32510 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 20  ster WHERE name 
32520 3d 20 25 51 22 2c 20 7a 4e 61 6d 65 0a 20 20 20  = %Q", zName.   
32530 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
32540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
32550 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
32560 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
32570 20 20 20 20 20 20 62 53 71 6c 49 6e 74 6b 65 79        bSqlIntkey
32580 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
32590 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
325a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
325b0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
325c0 74 6d 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 62  tmt);..    if( b
325d0 49 6e 74 6b 65 79 3d 3d 62 53 71 6c 49 6e 74 6b  Intkey==bSqlIntk
325e0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ey ){.      int 
325f0 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
32600 68 61 72 20 2a 7a 50 6b 20 3d 20 22 5f 72 6f 77  har *zPk = "_row
32610 69 64 5f 22 3b 0a 20 20 20 20 20 20 73 71 6c 69  id_";.      sqli
32620 74 65 33 5f 73 74 6d 74 20 2a 70 50 6b 46 69 6e  te3_stmt *pPkFin
32630 64 65 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  der = 0;..      
32640 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
32650 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 61 6e   intkey table an
32660 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  d there is an IN
32670 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
32680 59 2c 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  Y,.      ** set 
32690 7a 50 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  zPk to the name 
326a0 6f 66 20 74 68 65 20 50 4b 20 63 6f 6c 75 6d 6e  of the PK column
326b0 2c 20 61 6e 64 20 70 54 61 62 2d 3e 69 50 6b 20  , and pTab->iPk 
326c0 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  to the index.   
326d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 6f 6c     ** of the col
326e0 75 6d 6e 2c 20 77 68 65 72 65 20 63 6f 6c 75 6d  umn, where colum
326f0 6e 73 20 61 72 65 20 30 2d 6e 75 6d 62 65 72 65  ns are 0-numbere
32700 64 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  d from left to r
32710 69 67 68 74 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ight..      ** O
32720 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
32730 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
32740 62 6c 65 20 6f 72 20 69 66 20 74 68 65 72 65 20  ble or if there 
32750 69 73 20 6e 6f 20 49 50 4b 20 63 6f 6c 75 6d 6e  is no IPK column
32760 2c 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  ,.      ** leave
32770 20 7a 50 6b 20 61 73 20 22 5f 72 6f 77 69 64 5f   zPk as "_rowid_
32780 22 20 61 6e 64 20 70 54 61 62 2d 3e 69 50 6b 20  " and pTab->iPk 
32790 61 74 20 2d 32 2e 20 20 2a 2f 0a 20 20 20 20 20  at -2.  */.     
327a0 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b   pTab->iPk = -2;
327b0 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 74 6b  .      if( bIntk
327c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 68  ey ){.        sh
327d0 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
327e0 28 64 62 74 6d 70 2c 20 26 72 63 2c 20 26 70 50  (dbtmp, &rc, &pP
327f0 6b 46 69 6e 64 65 72 2c 20 0a 20 20 20 20 20 20  kFinder, .      
32800 20 20 20 20 22 53 45 4c 45 43 54 20 63 69 64 2c      "SELECT cid,
32810 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d   name FROM pragm
32820 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
32830 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20   ".          "  
32840 57 48 45 52 45 20 70 6b 3d 31 20 41 4e 44 20 74  WHERE pk=1 AND t
32850 79 70 65 3d 27 69 6e 74 65 67 65 72 27 20 43 4f  ype='integer' CO
32860 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20  LLATE nocase".  
32870 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 4e          "  AND N
32880 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43  OT EXISTS (SELEC
32890 54 20 63 69 64 20 46 52 4f 4d 20 70 72 61 67 6d  T cid FROM pragm
328a0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
328b0 20 57 48 45 52 45 20 70 6b 3d 32 29 22 0a 20 20   WHERE pk=2)".  
328c0 20 20 20 20 20 20 20 20 2c 20 7a 4e 61 6d 65 2c          , zName,
328d0 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29   zName.        )
328e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
328f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
32900 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
32910 65 33 5f 73 74 65 70 28 70 50 6b 46 69 6e 64 65  e3_step(pPkFinde
32920 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
32930 70 54 61 62 2d 3e 69 50 6b 20 3d 20 73 71 6c 69  pTab->iPk = sqli
32940 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
32950 50 6b 46 69 6e 64 65 72 2c 20 30 29 3b 0a 20 20  PkFinder, 0);.  
32960 20 20 20 20 20 20 20 20 7a 50 6b 20 3d 20 28 63          zPk = (c
32970 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
32980 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
32990 50 6b 46 69 6e 64 65 72 2c 20 31 29 3b 0a 20 20  PkFinder, 1);.  
329a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
329b0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 51 75  .      pTab->zQu
329c0 6f 74 65 64 20 3d 20 73 68 65 6c 6c 4d 50 72 69  oted = shellMPri
329d0 6e 74 66 28 26 72 63 2c 20 22 25 51 22 2c 20 7a  ntf(&rc, "%Q", z
329e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 54 61  Name);.      pTa
329f0 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61  b->azlCol = (cha
32a00 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28  r**)shellMalloc(
32a10 26 72 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  &rc, sizeof(char
32a20 2a 29 20 2a 20 28 6e 53 71 6c 43 6f 6c 2b 31 29  *) * (nSqlCol+1)
32a30 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  );.      pTab->n
32a40 43 6f 6c 20 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a  Col = nSqlCol;..
32a50 20 20 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65        if( bIntke
32a60 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  y ){.        pTa
32a70 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73  b->azlCol[0] = s
32a80 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c  hellMPrintf(&rc,
32a90 20 22 25 51 22 2c 20 7a 50 6b 29 3b 0a 20 20 20   "%Q", zPk);.   
32aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ab0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30    pTab->azlCol[0
32ac0 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
32ad0 28 26 72 63 2c 20 22 22 29 3b 0a 20 20 20 20 20  (&rc, "");.     
32ae0 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 31 3b 0a   }.      i = 1;.
32af0 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
32b00 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20  rePrintf(dbtmp, 
32b10 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20  &rc, &pStmt, .  
32b20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
32b30 25 51 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  %Q || group_conc
32b40 61 74 28 71 75 6f 74 65 28 6e 61 6d 65 29 2c 20  at(quote(name), 
32b50 27 2c 20 27 29 20 22 0a 20 20 20 20 20 20 20 20  ', ') ".        
32b60 20 20 22 20 20 46 49 4c 54 45 52 20 28 57 48 45    "  FILTER (WHE
32b70 52 45 20 63 69 64 21 3d 25 64 29 20 4f 56 45 52  RE cid!=%d) OVER
32b80 20 28 4f 52 44 45 52 20 42 59 20 25 73 20 63 69   (ORDER BY %s ci
32b90 64 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  d) ".          "
32ba0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c  FROM pragma_tabl
32bb0 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20 20  e_info(%Q)", .  
32bc0 20 20 20 20 20 20 20 20 62 49 6e 74 6b 65 79 20          bIntkey 
32bd0 3f 20 22 2c 20 22 20 3a 20 22 22 2c 20 70 54 61  ? ", " : "", pTa
32be0 62 2d 3e 69 50 6b 2c 20 0a 20 20 20 20 20 20 20  b->iPk, .       
32bf0 20 20 20 62 49 6e 74 6b 65 79 20 3f 20 22 22 20     bIntkey ? "" 
32c00 3a 20 22 28 43 41 53 45 20 57 48 45 4e 20 70 6b  : "(CASE WHEN pk
32c10 3d 30 20 54 48 45 4e 20 31 30 30 30 30 30 30 20  =0 THEN 1000000 
32c20 45 4c 53 45 20 70 6b 20 45 4e 44 29 2c 20 22 2c  ELSE pk END), ",
32c30 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  .          zName
32c40 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
32c50 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
32c60 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
32c70 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
32c80 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  (pStmt) ){.     
32c90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32ca0 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  Text = (const ch
32cb0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
32cc0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
32cd0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  );.        pTab-
32ce0 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d 20 73 68 65  >azlCol[i] = she
32cf0 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22  llMPrintf(&rc, "
32d00 25 73 25 73 22 2c 20 70 54 61 62 2d 3e 61 7a 6c  %s%s", pTab->azl
32d10 43 6f 6c 5b 30 5d 2c 20 7a 54 65 78 74 29 3b 0a  Col[0], zText);.
32d20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
32d30 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c     }.      shell
32d40 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
32d50 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 73 68 65  tmt);..      she
32d60 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
32d70 70 50 6b 46 69 6e 64 65 72 29 3b 0a 20 20 20 20  pPkFinder);.    
32d80 7d 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64  }.  }.. finished
32d90 3a 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  :.  sqlite3_clos
32da0 65 28 64 62 74 6d 70 29 3b 0a 20 20 2a 70 52 63  e(dbtmp);.  *pRc
32db0 20 3d 20 72 63 3b 0a 20 20 69 66 28 20 72 63 21   = rc;.  if( rc!
32dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
32dd0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 7a 51 75  Tab && pTab->zQu
32de0 6f 74 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 20  oted==0) ){.    
32df0 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65  recoverFreeTable
32e00 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62  (pTab);.    pTab
32e10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
32e20 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
32e30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32e40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 73 65 61  is called to sea
32e50 72 63 68 20 74 68 65 20 73 63 68 65 6d 61 20 72  rch the schema r
32e60 65 63 6f 76 65 72 65 64 20 66 72 6f 6d 20 74 68  ecovered from th
32e70 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  e.** sqlite_mast
32e80 65 72 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  er table of the 
32e90 28 70 6f 73 73 69 62 6c 79 29 20 63 6f 72 72 75  (possibly) corru
32ea0 70 74 20 64 61 74 61 62 61 73 65 20 61 73 20 70  pt database as p
32eb0 61 72 74 0a 2a 2a 20 6f 66 20 61 20 22 2e 72 65  art.** of a ".re
32ec0 63 6f 76 65 72 22 20 63 6f 6d 6d 61 6e 64 2e 20  cover" command. 
32ed0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 66 6f  Specifically, fo
32ee0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  r a table with r
32ef0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 52 6f 6f  oot page.** iRoo
32f00 74 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6e  t and at least n
32f10 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 20 41 64 64  Col columns. Add
32f20 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 62 49  itionally, if bI
32f30 6e 74 6b 65 79 20 69 73 20 30 2c 20 74 68 65 0a  ntkey is 0, the.
32f40 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ** table must be
32f50 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
32f60 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 20 6e 6f   table, or if no
32f70 6e 2d 7a 65 72 6f 2c 20 6e 6f 74 20 6f 6e 65 20  n-zero, not one 
32f80 6f 66 0a 2a 2a 20 74 68 6f 73 65 2e 0a 2a 2a 0a  of.** those..**.
32f90 2a 2a 20 49 66 20 61 20 74 61 62 6c 65 20 69 73  ** If a table is
32fa0 20 66 6f 75 6e 64 2c 20 61 20 28 52 65 63 6f 76   found, a (Recov
32fb0 65 72 54 61 62 6c 65 2a 29 20 6f 62 6a 65 63 74  erTable*) object
32fc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
32fd0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
32fe0 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20  table is found, 
32ff0 62 75 74 20 62 49 6e 74 6b 65 79 20 69 73 20 66  but bIntkey is f
33000 61 6c 73 65 20 61 6e 64 20 69 52 6f 6f 74 20 69  alse and iRoot i
33010 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 20 70  s the .** root p
33020 61 67 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  age of an index 
33030 69 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65 64  in the recovered
33040 20 73 63 68 65 6d 61 2c 20 74 68 65 6e 20 28 2a   schema, then (*
33050 70 62 4e 6f 6f 70 29 20 69 73 0a 2a 2a 20 73 65  pbNoop) is.** se
33060 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 4e 55  t to true and NU
33070 4c 4c 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  LL returned. Or,
33080 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
33090 73 75 63 68 20 74 61 62 6c 65 20 6f 72 0a 2a 2a  such table or.**
330a0 20 69 6e 64 65 78 2c 20 4e 55 4c 4c 20 69 73 20   index, NULL is 
330b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28 2a 70  returned and (*p
330c0 62 4e 6f 6f 70 29 20 73 65 74 20 74 6f 20 30 2c  bNoop) set to 0,
330d0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
330e0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 73  .** the caller s
330f0 68 6f 75 6c 64 20 77 72 69 74 65 20 64 61 74 61  hould write data
33100 20 74 6f 20 74 68 65 20 6f 72 70 68 61 6e 73 20   to the orphans 
33110 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
33120 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72   RecoverTable *r
33130 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28  ecoverFindTable(
33140 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
33150 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
33160 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
33170 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
33180 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
331a0 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
331b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  ode */.  int iRo
331c0 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
331d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
331e0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a   page of table *
331f0 2f 0a 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 2c  /.  int bIntkey,
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
33220 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  an intkey table 
33230 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33250 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33260 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  f columns in tab
33270 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  le */.  int *pbN
33280 6f 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  oop             
33290 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
332a0 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
332b0 20 72 6f 6f 74 20 6f 66 20 69 6e 64 65 78 20 2a   root of index *
332c0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
332d0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
332e0 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a    RecoverTable *
332f0 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pRet = 0;.  int 
33300 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 63 6f 6e  bNoop = 0;.  con
33310 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
33320 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
33330 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f  *zName = 0;..  /
33340 2a 20 53 65 61 72 63 68 20 74 68 65 20 72 65 63  * Search the rec
33350 6f 76 65 72 65 64 20 73 63 68 65 6d 61 20 66 6f  overed schema fo
33360 72 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68  r an object with
33370 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
33380 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  . */.  shellPrep
33390 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
333a0 2d 3e 64 62 2c 20 70 52 63 2c 20 26 70 53 74 6d  ->db, pRc, &pStm
333b0 74 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  t,.      "SELECT
333c0 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 73 71 6c   type, name, sql
333d0 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73   FROM recovery.s
333e0 63 68 65 6d 61 20 57 48 45 52 45 20 72 6f 6f 74  chema WHERE root
333f0 70 61 67 65 3d 25 64 22 2c 20 69 52 6f 6f 74 0a  page=%d", iRoot.
33400 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70    );.  while( *p
33410 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  Rc==SQLITE_OK &&
33420 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
33430 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
33440 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
33450 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
33460 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
33470 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
33480 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
33490 62 49 6e 74 6b 65 79 3d 3d 30 20 26 26 20 73 71  bIntkey==0 && sq
334a0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
334b0 79 70 65 2c 20 22 69 6e 64 65 78 22 29 3d 3d 30  ype, "index")==0
334c0 20 29 7b 0a 20 20 20 20 20 20 62 4e 6f 6f 70 20   ){.      bNoop 
334d0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
334e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
334f0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
33500 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d  zType, "table")=
33510 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  =0 ){.      zNam
33520 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
33530 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33540 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
33550 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f        zSql = (co
33560 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
33570 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
33580 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 70  tmt, 2);.      p
33590 52 65 74 20 3d 20 72 65 63 6f 76 65 72 4e 65 77  Ret = recoverNew
335a0 54 61 62 6c 65 28 70 52 63 2c 20 7a 4e 61 6d 65  Table(pRc, zName
335b0 2c 20 7a 53 71 6c 2c 20 62 49 6e 74 6b 65 79 2c  , zSql, bIntkey,
335c0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72   nCol);.      br
335d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
335e0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
335f0 70 52 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 2a  pRc, pStmt);.  *
33600 70 62 4e 6f 6f 70 20 3d 20 62 4e 6f 6f 70 3b 0a  pbNoop = bNoop;.
33610 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
33620 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
33630 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62   RecoverTable ob
33640 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
33650 67 20 74 68 65 20 6f 72 70 68 61 6e 73 20 74 61  g the orphans ta
33660 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ble..*/.static R
33670 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63  ecoverTable *rec
33680 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28  overOrphanTable(
33690 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
336a0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
336b0 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
336c0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
336d0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
336f0 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
33700 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
33710 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75  har *zLostAndFou
33720 6e 64 2c 20 20 20 20 20 20 2f 2a 20 42 61 73 65  nd,      /* Base
33730 20 6e 61 6d 65 20 66 6f 72 20 6f 72 70 68 61 6e   name for orphan
33740 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
33750 20 6e 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   nCol           
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33770 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64  Number of user d
33780 61 74 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29  ata columns */.)
33790 7b 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65  {.  RecoverTable
337a0 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 66   *pTab = 0;.  if
337b0 28 20 6e 43 6f 6c 3e 3d 30 20 26 26 20 2a 70 52  ( nCol>=0 && *pR
337c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
337d0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
337e0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
337f0 74 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d  termines the nam
33800 65 20 6f 66 20 74 68 65 20 6f 72 70 68 61 6e 20  e of the orphan 
33810 74 61 62 6c 65 2e 20 54 68 65 20 70 72 65 66 65  table. The prefe
33820 72 65 64 0a 20 20 20 20 2a 2a 20 6e 61 6d 65 20  red.    ** name 
33830 69 73 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64  is zLostAndFound
33840 2e 20 42 75 74 20 69 66 20 74 68 61 74 20 63 6c  . But if that cl
33850 61 73 68 65 73 20 77 69 74 68 20 61 6e 6f 74 68  ashes with anoth
33860 65 72 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 69  er name.    ** i
33870 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65 64 20  n the recovered 
33880 73 63 68 65 6d 61 2c 20 74 72 79 20 7a 4c 6f 73  schema, try zLos
33890 74 41 6e 64 46 6f 75 6e 64 5f 30 2c 20 7a 4c 6f  tAndFound_0, zLo
338a0 73 74 41 6e 64 46 6f 75 6e 64 5f 31 0a 20 20 20  stAndFound_1.   
338b0 20 2a 2a 20 61 6e 64 20 73 6f 20 6f 6e 20 75 6e   ** and so on un
338c0 74 69 6c 20 61 20 6e 6f 6e 2d 63 6c 61 73 68 69  til a non-clashi
338d0 6e 67 20 6e 61 6d 65 20 69 73 20 66 6f 75 6e 64  ng name is found
338e0 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54  .  */.    int iT
338f0 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  ab = 0;.    char
33900 20 2a 7a 54 61 62 20 3d 20 73 68 65 6c 6c 4d 50   *zTab = shellMP
33910 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73 22 2c  rintf(pRc, "%s",
33920 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 29 3b   zLostAndFound);
33930 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
33940 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 20 20  t *pTest = 0;.  
33950 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
33960 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c 0a  State->db, pRc,.
33970 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
33980 31 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  1 FROM recovery.
33990 73 63 68 65 6d 61 20 57 48 45 52 45 20 6e 61 6d  schema WHERE nam
339a0 65 3d 3f 22 2c 20 26 70 54 65 73 74 0a 20 20 20  e=?", &pTest.   
339b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73   );.    if( pTes
339c0 74 20 29 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  t ) sqlite3_bind
339d0 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c 20  _text(pTest, 1, 
339e0 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zTab, -1, SQLITE
339f0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
33a00 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51   while( *pRc==SQ
33a10 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
33a20 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
33a30 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
33a40 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 70      shellReset(p
33a50 52 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20  Rc, pTest);.    
33a60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
33a70 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 54 61 62  Tab);.      zTab
33a80 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
33a90 70 52 63 2c 20 22 25 73 5f 25 64 22 2c 20 7a 4c  pRc, "%s_%d", zL
33aa0 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 69 54 61  ostAndFound, iTa
33ab0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  b++);.      sqli
33ac0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
33ad0 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d 31  est, 1, zTab, -1
33ae0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
33af0 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  NT);.    }.    s
33b00 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63  hellFinalize(pRc
33b10 2c 20 70 54 65 73 74 29 3b 0a 0a 20 20 20 20 70  , pTest);..    p
33b20 54 61 62 20 3d 20 28 52 65 63 6f 76 65 72 54 61  Tab = (RecoverTa
33b30 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63  ble*)shellMalloc
33b40 28 70 52 63 2c 20 73 69 7a 65 6f 66 28 52 65 63  (pRc, sizeof(Rec
33b50 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a 20 20 20  overTable));.   
33b60 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
33b70 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64     pTab->zQuoted
33b80 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
33b90 70 52 63 2c 20 22 25 51 22 2c 20 7a 54 61 62 29  pRc, "%Q", zTab)
33ba0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
33bb0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
33bc0 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b   pTab->iPk = -2;
33bd0 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  .      if( nCol>
33be0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
33bf0 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61  b->azlCol = (cha
33c00 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28  r**)shellMalloc(
33c10 70 52 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  pRc, sizeof(char
33c20 2a 29 20 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a  *) * (nCol+1));.
33c30 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
33c40 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  ->azlCol ){.    
33c50 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43        pTab->azlC
33c60 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c  ol[nCol] = shell
33c70 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 22 29  MPrintf(pRc, "")
33c80 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
33c90 69 3d 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20  i=nCol-1; i>=0; 
33ca0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i--){.          
33cb0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69    pTab->azlCol[i
33cc0 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
33cd0 28 70 52 63 2c 20 22 25 73 2c 20 4e 55 4c 4c 22  (pRc, "%s, NULL"
33ce0 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69  , pTab->azlCol[i
33cf0 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1]);.          
33d00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33d10 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 2a    }..      if( *
33d20 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc!=SQLITE_OK )
33d30 7b 0a 20 20 20 20 20 20 20 20 72 65 63 6f 76 65  {.        recove
33d40 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
33d50 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
33d60 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
33d70 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
33d80 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
33d90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
33da0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 72  REATE TABLE %s(r
33db0 6f 6f 74 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c  ootpgno INTEGER,
33dc0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
33dd0 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 6e 66  pgno INTEGER, nf
33de0 69 65 6c 64 20 49 4e 54 45 47 45 52 2c 20 69 64  ield INTEGER, id
33df0 20 49 4e 54 45 47 45 52 22 2c 20 70 54 61 62 2d   INTEGER", pTab-
33e00 3e 7a 51 75 6f 74 65 64 0a 20 20 20 20 20 20 20  >zQuoted.       
33e10 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
33e20 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
33e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
33e40 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
33e50 6f 75 74 2c 20 22 2c 20 63 25 64 22 2c 20 69 29  out, ", c%d", i)
33e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33e70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
33e80 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c  State->out, ");\
33e90 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
33ea0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
33eb0 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20  ree(zTab);.  }. 
33ec0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
33ed0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33ee0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
33ef0 6f 20 72 65 63 6f 76 65 72 20 64 61 74 61 20 66  o recover data f
33f00 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33f10 2e 20 41 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f  . A script.** to
33f20 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
33f30 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
33f40 6e 69 6e 67 20 61 6c 6c 20 72 65 63 6f 76 65 72  ning all recover
33f50 65 64 20 64 61 74 61 20 69 73 20 6f 75 74 70 75  ed data is outpu
33f60 74 0a 2a 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70  t.** on stream p
33f70 53 74 61 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73  State->out..*/.s
33f80 74 61 74 69 63 20 69 6e 74 20 72 65 63 6f 76 65  tatic int recove
33f90 72 44 61 74 61 62 61 73 65 43 6d 64 28 53 68 65  rDatabaseCmd(She
33fa0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
33fb0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
33fc0 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  **azArg){.  int 
33fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33fe0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
33ff0 70 4c 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  pLoop = 0;      
34000 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
34010 68 20 61 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73  h all root pages
34020 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
34030 6d 74 20 2a 70 50 61 67 65 73 20 3d 20 30 3b 20  mt *pPages = 0; 
34040 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
34050 72 6f 75 67 68 20 61 6c 6c 20 70 61 67 65 73 20  rough all pages 
34060 69 6e 20 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20  in a group */.  
34070 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43  sqlite3_stmt *pC
34080 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
34090 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
340a0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 20 70  all cells in a p
340b0 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  age */.  const c
340c0 68 61 72 20 2a 7a 52 65 63 6f 76 65 72 79 44 62  har *zRecoveryDb
340d0 20 3d 20 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65   = "";   /* Name
340e0 20 6f 66 20 22 72 65 63 6f 76 65 72 79 22 20 64   of "recovery" d
340f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
34100 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e  st char *zLostAn
34110 64 46 6f 75 6e 64 20 3d 20 22 6c 6f 73 74 5f 61  dFound = "lost_a
34120 6e 64 5f 66 6f 75 6e 64 22 3b 0a 20 20 69 6e 74  nd_found";.  int
34130 20 69 3b 0a 20 20 69 6e 74 20 6e 4f 72 70 68 61   i;.  int nOrpha
34140 6e 20 3d 20 2d 31 3b 0a 20 20 52 65 63 6f 76 65  n = -1;.  Recove
34150 72 54 61 62 6c 65 20 2a 70 4f 72 70 68 61 6e 20  rTable *pOrphan 
34160 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 46 72 65  = 0;..  int bFre
34170 65 6c 69 73 74 20 3d 20 31 3b 20 20 20 20 20 20  elist = 1;      
34180 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66 20          /* 0 if 
34190 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75  --freelist-corru
341a0 70 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  pt is specified 
341b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
341c0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
341d0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
341e0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  i];.    int n;. 
341f0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
34200 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
34210 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  z++;.    n = str
34220 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66  len30(z);.    if
34230 28 20 6e 3c 3d 31 37 20 26 26 20 6d 65 6d 63 6d  ( n<=17 && memcm
34240 70 28 22 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72  p("-freelist-cor
34250 72 75 70 74 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20  rupt", z, n)==0 
34260 29 7b 0a 20 20 20 20 20 20 62 46 72 65 65 6c 69  ){.      bFreeli
34270 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  st = 0;.    }els
34280 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31 32 20  e.    if( n<=12 
34290 26 26 20 6d 65 6d 63 6d 70 28 22 2d 72 65 63 6f  && memcmp("-reco
342a0 76 65 72 79 2d 64 62 22 2c 20 7a 2c 20 6e 29 3d  very-db", z, n)=
342b0 3d 30 20 26 26 20 69 3c 28 6e 41 72 67 2d 31 29  =0 && i<(nArg-1)
342c0 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
342d0 20 20 20 20 20 7a 52 65 63 6f 76 65 72 79 44 62       zRecoveryDb
342e0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
342f0 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6e   }else.    if( n
34300 3c 3d 31 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  <=15 && memcmp("
34310 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 22  -lost-and-found"
34320 2c 20 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c  , z, n)==0 && i<
34330 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20  (nArg-1) ){.    
34340 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 4c 6f    i++;.      zLo
34350 73 74 41 6e 64 46 6f 75 6e 64 20 3d 20 61 7a 41  stAndFound = azA
34360 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  rg[i];.    }.   
34370 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77   else{.      raw
34380 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
34390 22 75 6e 65 78 70 65 63 74 65 64 20 6f 70 74 69  "unexpected opti
343a0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  on: %s\n", azArg
343b0 5b 69 5d 29 3b 20 0a 20 20 20 20 20 20 72 61 77  [i]); .      raw
343c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
343d0 22 6f 70 74 69 6f 6e 73 20 61 72 65 3a 5c 6e 22  "options are:\n"
343e0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
343f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
34400 20 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72   --freelist-corr
34410 75 70 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  upt\n");.      r
34420 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34430 2c 20 22 20 20 20 20 2d 2d 72 65 63 6f 76 65 72  , "    --recover
34440 79 2d 64 62 20 44 41 54 41 42 41 53 45 5c 6e 22  y-db DATABASE\n"
34450 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
34460 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
34470 20 2d 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e   --lost-and-foun
34480 64 20 54 41 42 4c 45 2d 4e 41 4d 45 5c 6e 22 29  d TABLE-NAME\n")
34490 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
344a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
344b0 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 70  hellExecPrintf(p
344c0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
344d0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 61 6e      /* Attach an
344e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
344f0 61 73 65 20 6e 61 6d 65 64 20 27 72 65 63 6f 76  ase named 'recov
34500 65 72 79 27 2e 20 43 72 65 61 74 65 20 61 6e 20  ery'. Create an 
34510 69 6e 64 65 78 65 64 20 0a 20 20 20 20 2a 2a 20  indexed .    ** 
34520 63 61 63 68 65 20 6f 66 20 74 68 65 20 73 71 6c  cache of the sql
34530 69 74 65 5f 64 62 70 74 72 20 76 69 72 74 75 61  ite_dbptr virtua
34540 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  l table. */.    
34550 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
34560 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 3b 22 0a 20  _schema = on;". 
34570 20 20 20 22 41 54 54 41 43 48 20 25 51 20 41 53     "ATTACH %Q AS
34580 20 72 65 63 6f 76 65 72 79 3b 22 0a 20 20 20 20   recovery;".    
34590 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
345a0 58 49 53 54 53 20 72 65 63 6f 76 65 72 79 2e 64  XISTS recovery.d
345b0 62 70 74 72 3b 22 0a 20 20 20 20 22 44 52 4f 50  bptr;".    "DROP
345c0 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
345d0 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69   recovery.freeli
345e0 73 74 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54  st;".    "DROP T
345f0 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 72  ABLE IF EXISTS r
34600 65 63 6f 76 65 72 79 2e 6d 61 70 3b 22 0a 20 20  ecovery.map;".  
34610 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46    "DROP TABLE IF
34620 20 45 58 49 53 54 53 20 72 65 63 6f 76 65 72 79   EXISTS recovery
34630 2e 73 63 68 65 6d 61 3b 22 0a 20 20 20 20 22 43  .schema;".    "C
34640 52 45 41 54 45 20 54 41 42 4c 45 20 72 65 63 6f  REATE TABLE reco
34650 76 65 72 79 2e 66 72 65 65 6c 69 73 74 28 70 67  very.freelist(pg
34660 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
34670 52 59 20 4b 45 59 29 3b 22 2c 20 7a 52 65 63 6f  RY KEY);", zReco
34680 76 65 72 79 44 62 0a 20 20 29 3b 0a 0a 20 20 69  veryDb.  );..  i
34690 66 28 20 62 46 72 65 65 6c 69 73 74 20 29 7b 0a  f( bFreelist ){.
346a0 20 20 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53      shellExec(pS
346b0 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20  tate->db, &rc,. 
346c0 20 20 20 20 20 22 57 49 54 48 20 74 72 75 6e 6b       "WITH trunk
346d0 28 70 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20  (pgno) AS (".   
346e0 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 68 65     "  SELECT she
346f0 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20  ll_int32(".     
34700 20 22 20 20 20 20 20 20 28 53 45 4c 45 43 54 20   "      (SELECT 
34710 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65  data FROM sqlite
34720 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67  _dbpage WHERE pg
34730 6e 6f 3d 31 29 2c 20 38 29 20 41 53 20 78 20 22  no=1), 8) AS x "
34740 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 57 48  .      "      WH
34750 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22  ERE x>0".      "
34760 20 20 20 20 55 4e 49 4f 4e 22 0a 20 20 20 20 20      UNION".     
34770 20 22 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c   "  SELECT shell
34780 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22  _int32(".      "
34790 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 64 61        (SELECT da
347a0 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
347b0 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f  bpage WHERE pgno
347c0 3d 74 72 75 6e 6b 2e 70 67 6e 6f 29 2c 20 30 29  =trunk.pgno), 0)
347d0 20 41 53 20 78 20 22 0a 20 20 20 20 20 20 22 20   AS x ".      " 
347e0 20 20 20 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20       FROM trunk 
347f0 57 48 45 52 45 20 78 3e 30 22 0a 20 20 20 20 20  WHERE x>0".     
34800 20 22 29 2c 22 0a 20 20 20 20 20 20 22 66 72 65   "),".      "fre
34810 65 6c 69 73 74 28 64 61 74 61 2c 20 6e 2c 20 66  elist(data, n, f
34820 72 65 65 70 67 6e 6f 29 20 41 53 20 28 22 0a 20  reepgno) AS (". 
34830 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 64       "  SELECT d
34840 61 74 61 2c 20 6d 69 6e 28 31 36 33 38 34 2c 20  ata, min(16384, 
34850 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61  shell_int32(data
34860 2c 20 31 29 2d 31 29 2c 20 74 2e 70 67 6e 6f 20  , 1)-1), t.pgno 
34870 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46  ".      "      F
34880 52 4f 4d 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c  ROM trunk t, sql
34890 69 74 65 5f 64 62 70 61 67 65 20 73 20 57 48 45  ite_dbpage s WHE
348a0 52 45 20 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f  RE s.pgno=t.pgno
348b0 22 0a 20 20 20 20 20 20 22 20 20 20 20 55 4e 49  ".      "    UNI
348c0 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 22 20  ON ALL".      " 
348d0 20 53 45 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d   SELECT data, n-
348e0 31 2c 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64  1, shell_int32(d
348f0 61 74 61 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20  ata, 2+n) ".    
34900 20 20 22 20 20 20 20 20 20 46 52 4f 4d 20 66 72    "      FROM fr
34910 65 65 6c 69 73 74 20 57 48 45 52 45 20 6e 3e 3d  eelist WHERE n>=
34920 30 22 0a 20 20 20 20 20 20 22 29 22 0a 20 20 20  0".      ")".   
34930 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
34940 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69   recovery.freeli
34950 73 74 20 53 45 4c 45 43 54 20 66 72 65 65 70 67  st SELECT freepg
34960 6e 6f 20 46 52 4f 4d 20 66 72 65 65 6c 69 73 74  no FROM freelist
34970 3b 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  ;".    );.  }.. 
34980 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
34990 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
349a0 74 61 62 61 73 65 2c 20 61 64 64 20 61 6c 6c 20  tabase, add all 
349b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
349c0 73 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 72  s to.  ** the fr
349d0 65 65 6c 69 73 74 20 74 61 62 6c 65 2e 20 44 6f  eelist table. Do
349e0 20 74 68 69 73 20 72 65 67 61 72 64 6c 65 73 73   this regardless
349f0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
34a00 6f 74 20 0a 20 20 2a 2a 20 2d 2d 66 72 65 65 6c  ot .  ** --freel
34a10 69 73 74 2d 63 6f 72 72 75 70 74 20 77 61 73 20  ist-corrupt was 
34a20 73 70 65 63 69 66 69 65 64 2e 20 20 2a 2f 0a 20  specified.  */. 
34a30 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74   shellExec(pStat
34a40 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
34a50 20 22 57 49 54 48 20 70 74 72 6d 61 70 28 70 67   "WITH ptrmap(pg
34a60 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 22 20  no) AS (".    " 
34a70 20 53 45 4c 45 43 54 20 32 20 57 48 45 52 45 20   SELECT 2 WHERE 
34a80 73 68 65 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20  shell_int32(".  
34a90 20 20 22 20 20 20 20 28 53 45 4c 45 43 54 20 64    "    (SELECT d
34aa0 61 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ata FROM sqlite_
34ab0 64 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e  dbpage WHERE pgn
34ac0 6f 3d 31 29 2c 20 31 33 22 0a 20 20 20 20 22 20  o=1), 13".    " 
34ad0 20 29 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49   )".    "    UNI
34ae0 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 22 20 20  ON ALL ".    "  
34af0 53 45 4c 45 43 54 20 70 67 6e 6f 2b 31 2b 28 53  SELECT pgno+1+(S
34b00 45 4c 45 43 54 20 70 61 67 65 5f 73 69 7a 65 20  ELECT page_size 
34b10 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67 65  FROM pragma_page
34b20 5f 73 69 7a 65 29 2f 35 20 41 53 20 70 70 20 22  _size)/5 AS pp "
34b30 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 70 74 72  .    "  FROM ptr
34b40 6d 61 70 20 57 48 45 52 45 20 70 70 3c 3d 28 53  map WHERE pp<=(S
34b50 45 4c 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74  ELECT page_count
34b60 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67   FROM pragma_pag
34b70 65 5f 63 6f 75 6e 74 29 22 0a 20 20 20 20 22 29  e_count)".    ")
34b80 22 0a 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  ".    "REPLACE I
34b90 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e 66 72 65  NTO recovery.fre
34ba0 65 6c 69 73 74 20 53 45 4c 45 43 54 20 70 67 6e  elist SELECT pgn
34bb0 6f 20 46 52 4f 4d 20 70 74 72 6d 61 70 22 0a 20  o FROM ptrmap". 
34bc0 20 29 3b 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63   );..  shellExec
34bd0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
34be0 2c 20 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  , .    "CREATE T
34bf0 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 64 62  ABLE recovery.db
34c00 70 74 72 28 22 0a 20 20 20 20 22 20 20 20 20 20  ptr(".    "     
34c10 20 70 67 6e 6f 2c 20 63 68 69 6c 64 2c 20 50 52   pgno, child, PR
34c20 49 4d 41 52 59 20 4b 45 59 28 63 68 69 6c 64 2c  IMARY KEY(child,
34c30 20 70 67 6e 6f 29 22 0a 20 20 20 20 22 29 20 57   pgno)".    ") W
34c40 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20  ITHOUT ROWID;". 
34c50 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
34c60 4e 4f 52 45 20 49 4e 54 4f 20 72 65 63 6f 76 65  NORE INTO recove
34c70 72 79 2e 64 62 70 74 72 28 70 67 6e 6f 2c 20 63  ry.dbptr(pgno, c
34c80 68 69 6c 64 29 20 22 0a 20 20 20 20 22 20 20 20  hild) ".    "   
34c90 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
34ca0 71 6c 69 74 65 5f 64 62 70 74 72 22 0a 20 20 20  qlite_dbptr".   
34cb0 20 22 20 20 20 20 20 20 57 48 45 52 45 20 70 67   "      WHERE pg
34cc0 6e 6f 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69  no NOT IN freeli
34cd0 73 74 20 41 4e 44 20 63 68 69 6c 64 20 4e 4f 54  st AND child NOT
34ce0 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 0a   IN freelist;"..
34cf0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e      /* Delete an
34d00 79 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  y pointer to pag
34d10 65 20 31 2e 20 54 68 69 73 20 65 6e 73 75 72 65  e 1. This ensure
34d20 73 20 74 68 61 74 20 70 61 67 65 20 31 20 69 73  s that page 1 is
34d30 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20   considered.    
34d40 2a 2a 20 61 20 72 6f 6f 74 20 70 61 67 65 2c 20  ** a root page, 
34d50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 68 6f  regardless of ho
34d60 77 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 62  w corrupt the db
34d70 20 69 73 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c   is. */.    "DEL
34d80 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  ETE FROM recover
34d90 79 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68  y.dbptr WHERE ch
34da0 69 6c 64 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f  ild = 1;"..    /
34db0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69  * Delete all poi
34dc0 6e 74 65 72 73 20 74 6f 20 61 6e 79 20 70 61 67  nters to any pag
34dd0 65 73 20 74 68 61 74 20 68 61 76 65 20 6d 6f 72  es that have mor
34de0 65 20 74 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74  e than one point
34df0 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  er.    ** to the
34e00 6d 2e 20 53 75 63 68 20 70 61 67 65 73 20 77 69  m. Such pages wi
34e10 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
34e20 20 72 6f 6f 74 20 70 61 67 65 73 20 77 68 65 6e   root pages when
34e30 20 72 65 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   recovering.    
34e40 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20  ** data.  */.   
34e50 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65   "DELETE FROM re
34e60 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48 45  covery.dbptr WHE
34e70 52 45 20 63 68 69 6c 64 20 49 4e 20 28 22 0a 20  RE child IN (". 
34e80 20 20 20 22 20 20 53 45 4c 45 43 54 20 63 68 69     "  SELECT chi
34e90 6c 64 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  ld FROM recovery
34ea0 2e 64 62 70 74 72 20 47 52 4f 55 50 20 42 59 20  .dbptr GROUP BY 
34eb0 63 68 69 6c 64 20 48 41 56 49 4e 47 20 63 6f 75  child HAVING cou
34ec0 6e 74 28 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b  nt(*)>1".    ");
34ed0 22 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  "..    /* Create
34ee0 20 74 68 65 20 22 6d 61 70 22 20 74 61 62 6c 65   the "map" table
34ef0 20 74 68 61 74 20 77 69 6c 6c 20 28 65 76 65 6e   that will (even
34f00 74 75 61 6c 6c 79 29 20 63 6f 6e 74 61 69 6e 20  tually) contain 
34f10 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20  instructions.   
34f20 20 2a 2a 20 66 6f 72 20 64 65 61 6c 69 6e 67 20   ** for dealing 
34f30 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 69  with each page i
34f40 6e 20 74 68 65 20 64 62 20 74 68 61 74 20 63 6f  n the db that co
34f50 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
34f60 72 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  re .    ** recor
34f70 64 73 2e 20 2a 2f 0a 20 20 20 20 22 43 52 45 41  ds. */.    "CREA
34f80 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72  TE TABLE recover
34f90 79 2e 6d 61 70 28 22 0a 20 20 20 20 20 20 22 70  y.map(".      "p
34fa0 67 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  gno INTEGER PRIM
34fb0 41 52 59 20 4b 45 59 2c 20 6d 61 78 6c 65 6e 20  ARY KEY, maxlen 
34fc0 49 4e 54 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f  INT, intkey, roo
34fd0 74 20 49 4e 54 22 0a 20 20 20 20 22 29 3b 22 0a  t INT".    ");".
34fe0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
34ff0 20 74 61 62 6c 65 20 5b 6d 61 70 5d 2e 20 49 66   table [map]. If
35000 20 74 68 65 72 65 20 61 72 65 20 63 69 72 63 75   there are circu
35010 6c 61 72 20 6c 6f 6f 70 73 20 6f 66 20 70 61 67  lar loops of pag
35020 65 73 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  es in the.    **
35030 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
35040 6f 6c 6c 6f 77 69 6e 67 20 61 64 64 73 20 61 6c  ollowing adds al
35050 6c 20 70 61 67 65 73 20 69 6e 20 73 75 63 68 20  l pages in such 
35060 61 20 6c 6f 6f 70 20 74 6f 20 74 68 65 20 6d 61  a loop to the ma
35070 70 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 69  p.    ** as indi
35080 76 69 64 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  vidual root page
35090 73 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  s. This could be
350a0 20 68 61 6e 64 6c 65 64 20 62 65 74 74 65 72 2e   handled better.
350b0 20 20 2a 2f 0a 20 20 20 20 22 57 49 54 48 20 70    */.    "WITH p
350c0 61 67 65 73 28 69 2c 20 6d 61 78 6c 65 6e 29 20  ages(i, maxlen) 
350d0 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45 4c  AS (".    "  SEL
350e0 45 43 54 20 70 61 67 65 5f 63 6f 75 6e 74 2c 20  ECT page_count, 
350f0 28 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  (".    "    SELE
35100 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31 29 20  CT max(field+1) 
35110 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64 61  FROM sqlite_dbda
35120 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d 70 61  ta WHERE pgno=pa
35130 67 65 5f 63 6f 75 6e 74 22 0a 20 20 20 20 22 20  ge_count".    " 
35140 20 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70   ) FROM pragma_p
35150 61 67 65 5f 63 6f 75 6e 74 20 57 48 45 52 45 20  age_count WHERE 
35160 70 61 67 65 5f 63 6f 75 6e 74 3e 30 22 0a 20 20  page_count>0".  
35170 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c    "    UNION ALL
35180 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
35190 69 2d 31 2c 20 28 22 0a 20 20 20 20 22 20 20 20  i-1, (".    "   
351a0 20 53 45 4c 45 43 54 20 6d 61 78 28 66 69 65 6c   SELECT max(fiel
351b0 64 2b 31 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  d+1) FROM sqlite
351c0 5f 64 62 64 61 74 61 20 57 48 45 52 45 20 70 67  _dbdata WHERE pg
351d0 6e 6f 3d 69 2d 31 22 0a 20 20 20 20 22 20 20 29  no=i-1".    "  )
351e0 20 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45 52   FROM pages WHER
351f0 45 20 69 3e 3d 32 22 0a 20 20 20 20 22 29 22 0a  E i>=2".    ")".
35200 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
35210 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 70 67   recovery.map(pg
35220 6e 6f 2c 20 6d 61 78 6c 65 6e 2c 20 69 6e 74 6b  no, maxlen, intk
35230 65 79 2c 20 72 6f 6f 74 29 20 22 0a 20 20 20 20  ey, root) ".    
35240 22 20 20 53 45 4c 45 43 54 20 69 2c 20 6d 61 78  "  SELECT i, max
35250 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 28 22 0a 20 20  len, NULL, (".  
35260 20 20 22 20 20 20 20 57 49 54 48 20 70 28 6f 72    "    WITH p(or
35270 69 67 2c 20 70 67 6e 6f 2c 20 70 61 72 65 6e 74  ig, pgno, parent
35280 29 20 41 53 20 28 22 0a 20 20 20 20 22 20 20 20  ) AS (".    "   
35290 20 20 20 53 45 4c 45 43 54 20 30 2c 20 69 2c 20     SELECT 0, i, 
352a0 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f  (SELECT pgno FRO
352b0 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  M recovery.dbptr
352c0 20 57 48 45 52 45 20 63 68 69 6c 64 3d 69 29 22   WHERE child=i)"
352d0 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 55 4e  .    "        UN
352e0 49 4f 4e 20 22 0a 20 20 20 20 22 20 20 20 20 20  ION ".    "     
352f0 20 53 45 4c 45 43 54 20 69 2c 20 70 2e 70 61 72   SELECT i, p.par
35300 65 6e 74 2c 20 22 0a 20 20 20 20 22 20 20 20 20  ent, ".    "    
35310 20 20 20 20 28 53 45 4c 45 43 54 20 70 67 6e 6f      (SELECT pgno
35320 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
35330 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
35340 3d 70 2e 70 61 72 65 6e 74 29 20 46 52 4f 4d 20  =p.parent) FROM 
35350 70 22 0a 20 20 20 20 22 20 20 20 20 29 22 0a 20  p".    "    )". 
35360 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 70     "    SELECT p
35370 67 6e 6f 20 46 52 4f 4d 20 70 20 57 48 45 52 45  gno FROM p WHERE
35380 20 28 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c   (parent IS NULL
35390 20 4f 52 20 70 67 6e 6f 20 3d 20 6f 72 69 67 29   OR pgno = orig)
353a0 22 0a 20 20 20 20 22 29 20 22 0a 20 20 20 20 22  ".    ") ".    "
353b0 46 52 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45  FROM pages WHERE
353c0 20 6d 61 78 6c 65 6e 20 3e 20 30 20 41 4e 44 20   maxlen > 0 AND 
353d0 69 20 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69 73  i NOT IN freelis
353e0 74 3b 22 0a 20 20 20 20 22 55 50 44 41 54 45 20  t;".    "UPDATE 
353f0 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 41 53 20  recovery.map AS 
35400 6f 20 53 45 54 20 69 6e 74 6b 65 79 20 3d 20 28  o SET intkey = (
35410 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
35420 73 75 62 73 74 72 28 64 61 74 61 2c 20 31 2c 20  substr(data, 1, 
35430 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73  1)==X'0D' FROM s
35440 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45  qlite_dbpage WHE
35450 52 45 20 70 67 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a  RE pgno=o.pgno".
35460 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a      ");"..    /*
35470 20 45 78 74 72 61 63 74 20 64 61 74 61 20 66 72   Extract data fr
35480 6f 6d 20 70 61 67 65 20 31 20 61 6e 64 20 61 6e  om page 1 and an
35490 79 20 6c 69 6e 6b 65 64 20 70 61 67 65 73 20 69  y linked pages i
354a0 6e 74 6f 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  nto table.    **
354b0 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
354c0 2e 20 57 69 74 68 20 74 68 65 20 73 61 6d 65 20  . With the same 
354d0 73 63 68 65 6d 61 20 61 73 20 61 6e 20 73 71 6c  schema as an sql
354e0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
354f0 2e 20 20 2a 2f 0a 20 20 20 20 22 43 52 45 41 54  .  */.    "CREAT
35500 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79  E TABLE recovery
35510 2e 73 63 68 65 6d 61 28 74 79 70 65 2c 20 6e 61  .schema(type, na
35520 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f  me, tbl_name, ro
35530 6f 74 70 61 67 65 2c 20 73 71 6c 29 3b 22 0a 20  otpage, sql);". 
35540 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
35550 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
35560 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
35570 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69  max(CASE WHEN fi
35580 65 6c 64 3d 30 20 54 48 45 4e 20 76 61 6c 75 65  eld=0 THEN value
35590 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c   ELSE NULL END),
355a0 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53  ".    "  max(CAS
355b0 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 31 20 54  E WHEN field=1 T
355c0 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e  HEN value ELSE N
355d0 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22  ULL END),".    "
355e0 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20    max(CASE WHEN 
355f0 66 69 65 6c 64 3d 32 20 54 48 45 4e 20 76 61 6c  field=2 THEN val
35600 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44  ue ELSE NULL END
35610 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  ),".    "  max(C
35620 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 33  ASE WHEN field=3
35630 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
35640 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20   NULL END),".   
35650 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
35660 4e 20 66 69 65 6c 64 3d 34 20 54 48 45 4e 20 76  N field=4 THEN v
35670 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
35680 4e 44 29 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  ND)".    "FROM s
35690 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45  qlite_dbdata WHE
356a0 52 45 20 70 67 6e 6f 20 49 4e 20 28 22 0a 20 20  RE pgno IN (".  
356b0 20 20 22 20 20 53 45 4c 45 43 54 20 70 67 6e 6f    "  SELECT pgno
356c0 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d   FROM recovery.m
356d0 61 70 20 57 48 45 52 45 20 72 6f 6f 74 3d 31 22  ap WHERE root=1"
356e0 0a 20 20 20 20 22 29 22 0a 20 20 20 20 22 47 52  .    ")".    "GR
356f0 4f 55 50 20 42 59 20 70 67 6e 6f 2c 20 63 65 6c  OUP BY pgno, cel
35700 6c 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  l;".    "CREATE 
35710 49 4e 44 45 58 20 72 65 63 6f 76 65 72 79 2e 73  INDEX recovery.s
35720 63 68 65 6d 61 5f 72 6f 6f 74 70 61 67 65 20 4f  chema_rootpage O
35730 4e 20 73 63 68 65 6d 61 28 72 6f 6f 74 70 61 67  N schema(rootpag
35740 65 29 3b 22 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  e);".  );..  /* 
35750 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
35760 6f 6e 2c 20 74 68 65 6e 20 70 72 69 6e 74 20 6f  on, then print o
35770 75 74 20 61 6c 6c 20 6e 6f 6e 2d 76 69 72 74 75  ut all non-virtu
35780 61 6c 2c 20 6e 6f 6e 2d 22 73 71 6c 69 74 65 5f  al, non-"sqlite_
35790 25 22 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  %" .  ** CREATE 
357a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
357b0 20 74 68 61 74 20 65 78 74 72 61 63 74 65 64 20   that extracted 
357c0 66 72 6f 6d 20 74 68 65 20 65 78 69 73 74 69 6e  from the existin
357d0 67 20 73 63 68 65 6d 61 2e 20 20 2a 2f 0a 20 20  g schema.  */.  
357e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
357f0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
35800 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
35810 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
35820 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 42  (pState->out, "B
35830 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 72  EGIN;\n");.    r
35840 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
35850 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
35860 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 3d  ritable_schema =
35870 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 73 68   on;\n");.    sh
35880 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
35890 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20  e->db, &rc,.    
358a0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
358b0 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63  FROM recovery.sc
358c0 68 65 6d 61 20 22 0a 20 20 20 20 20 20 20 20 22  hema ".        "
358d0 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
358e0 65 27 20 41 4e 44 20 73 71 6c 20 4c 49 4b 45 20  e' AND sql LIKE 
358f0 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27 22  'create table%'"
35900 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a  , &pStmt.    );.
35910 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
35920 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
35930 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
35940 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
35950 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
35960 2a 7a 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  *zCreateTable = 
35970 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
35980 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
35990 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
359a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
359b0 61 74 65 2d 3e 6f 75 74 2c 20 22 43 52 45 41 54  ate->out, "CREAT
359c0 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
359d0 58 49 53 54 53 20 25 73 3b 5c 6e 22 2c 20 0a 20  XISTS %s;\n", . 
359e0 20 20 20 20 20 20 20 20 20 26 7a 43 72 65 61 74           &zCreat
359f0 65 54 61 62 6c 65 5b 31 32 5d 0a 20 20 20 20 20  eTable[12].     
35a00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68   );.    }.    sh
35a10 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
35a20 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20   pStmt);.  }..  
35a30 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
35a40 20 61 6e 20 6f 72 70 68 61 6e 20 74 61 62 6c 65   an orphan table
35a50 20 77 69 6c 6c 20 62 65 20 72 65 71 75 69 72 65   will be require
35a60 64 2e 20 41 6e 64 20 69 66 20 73 6f 2c 20 68 6f  d. And if so, ho
35a70 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 75 73 65 72  w many.  ** user
35a80 20 63 6f 6c 75 6d 6e 73 20 69 74 20 73 68 6f 75   columns it shou
35a90 6c 64 20 63 6f 6e 74 61 69 6e 20 2a 2f 0a 20 20  ld contain */.  
35aa0 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74  shellPrepare(pSt
35ab0 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20  ate->db, &rc, . 
35ac0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 61       "SELECT coa
35ad0 6c 65 73 63 65 28 6d 61 78 28 6d 61 78 6c 65 6e  lesce(max(maxlen
35ae0 29 2c 20 2d 32 29 20 46 52 4f 4d 20 72 65 63 6f  ), -2) FROM reco
35af0 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72  very.map WHERE r
35b00 6f 6f 74 3e 31 22 0a 20 20 20 20 20 20 2c 20 26  oot>1".      , &
35b10 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20 20 69 66 28  pLoop.  );.  if(
35b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
35b30 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
35b40 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70  lite3_step(pLoop
35b50 29 20 29 7b 0a 20 20 20 20 6e 4f 72 70 68 61 6e  ) ){.    nOrphan
35b60 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
35b70 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b  n_int(pLoop, 0);
35b80 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
35b90 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70 29  lize(&rc, pLoop)
35ba0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 30 3b 0a 0a  ;.  pLoop = 0;..
35bb0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
35bc0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
35bd0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67        "SELECT pg
35be0 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  no FROM recovery
35bf0 2e 6d 61 70 20 57 48 45 52 45 20 72 6f 6f 74 3d  .map WHERE root=
35c00 3f 22 2c 20 26 70 50 61 67 65 73 0a 20 20 29 3b  ?", &pPages.  );
35c10 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  .  shellPrepare(
35c20 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
35c30 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d  .      "SELECT m
35c40 61 78 28 66 69 65 6c 64 29 2c 20 67 72 6f 75 70  ax(field), group
35c50 5f 63 6f 6e 63 61 74 28 73 68 65 6c 6c 5f 65 73  _concat(shell_es
35c60 63 61 70 65 5f 63 72 6e 6c 28 71 75 6f 74 65 28  cape_crnl(quote(
35c70 76 61 6c 75 65 29 29 2c 20 27 2c 20 27 29 22 0a  value)), ', ')".
35c80 20 20 20 20 20 20 22 2c 20 6d 69 6e 28 66 69 65        ", min(fie
35c90 6c 64 29 20 22 0a 20 20 20 20 20 20 22 46 52 4f  ld) ".      "FRO
35ca0 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20  M sqlite_dbdata 
35cb0 57 48 45 52 45 20 70 67 6e 6f 20 3d 20 3f 20 41  WHERE pgno = ? A
35cc0 4e 44 20 66 69 65 6c 64 20 21 3d 20 3f 22 0a 20  ND field != ?". 
35cd0 20 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 63       "GROUP BY c
35ce0 65 6c 6c 22 2c 20 26 70 43 65 6c 6c 73 0a 20 20  ell", &pCells.  
35cf0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  );..  /* Loop th
35d00 72 6f 75 67 68 20 65 61 63 68 20 72 6f 6f 74 20  rough each root 
35d10 70 61 67 65 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c  page. */.  shell
35d20 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e  Prepare(pState->
35d30 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20  db, &rc, .      
35d40 22 53 45 4c 45 43 54 20 72 6f 6f 74 2c 20 69 6e  "SELECT root, in
35d50 74 6b 65 79 2c 20 6d 61 78 28 6d 61 78 6c 65 6e  tkey, max(maxlen
35d60 29 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  ) FROM recovery.
35d70 6d 61 70 22 20 0a 20 20 20 20 20 20 22 20 57 48  map" .      " WH
35d80 45 52 45 20 72 6f 6f 74 3e 31 20 47 52 4f 55 50  ERE root>1 GROUP
35d90 20 42 59 20 72 6f 6f 74 2c 20 69 6e 74 6b 65 79   BY root, intkey
35da0 20 4f 52 44 45 52 20 42 59 20 72 6f 6f 74 3d 28   ORDER BY root=(
35db0 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
35dc0 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
35dd0 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
35de0 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c 69  WHERE name='sqli
35df0 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
35e00 20 20 20 20 22 29 22 2c 20 26 70 4c 6f 6f 70 0a      ")", &pLoop.
35e10 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63    );.  while( rc
35e20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
35e30 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
35e40 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20 29  e3_step(pLoop) )
35e50 7b 0a 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20  {.    int iRoot 
35e60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
35e70 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 30 29 3b 0a  _int(pLoop, 0);.
35e80 20 20 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 20      int bIntkey 
35e90 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
35ea0 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 31 29 3b 0a  _int(pLoop, 1);.
35eb0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
35ec0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
35ed0 74 28 70 4c 6f 6f 70 2c 20 32 29 3b 0a 20 20 20  t(pLoop, 2);.   
35ee0 20 69 6e 74 20 62 4e 6f 6f 70 20 3d 20 30 3b 0a   int bNoop = 0;.
35ef0 20 20 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65      RecoverTable
35f00 20 2a 70 54 61 62 3b 0a 0a 20 20 20 20 61 73 73   *pTab;..    ass
35f10 65 72 74 28 20 62 49 6e 74 6b 65 79 3d 3d 30 20  ert( bIntkey==0 
35f20 7c 7c 20 62 49 6e 74 6b 65 79 3d 3d 31 20 29 3b  || bIntkey==1 );
35f30 0a 20 20 20 20 70 54 61 62 20 3d 20 72 65 63 6f  .    pTab = reco
35f40 76 65 72 46 69 6e 64 54 61 62 6c 65 28 70 53 74  verFindTable(pSt
35f50 61 74 65 2c 20 26 72 63 2c 20 69 52 6f 6f 74 2c  ate, &rc, iRoot,
35f60 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 2c 20   bIntkey, nCol, 
35f70 26 62 4e 6f 6f 70 29 3b 0a 20 20 20 20 69 66 28  &bNoop);.    if(
35f80 20 62 4e 6f 6f 70 20 7c 7c 20 72 63 20 29 20 63   bNoop || rc ) c
35f90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
35fa0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
35fb0 20 20 69 66 28 20 70 4f 72 70 68 61 6e 3d 3d 30    if( pOrphan==0
35fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 70   ){.        pOrp
35fd0 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72 70  han = recoverOrp
35fe0 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65 2c  hanTable(pState,
35ff0 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f   &rc, zLostAndFo
36000 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a 20  und, nOrphan);. 
36010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61       }.      pTa
36020 62 20 3d 20 70 4f 72 70 68 61 6e 3b 0a 20 20 20  b = pOrphan;.   
36030 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
36040 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
36050 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
36060 33 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d 3e  3_stricmp(pTab->
36070 7a 51 75 6f 74 65 64 2c 20 22 27 73 71 6c 69 74  zQuoted, "'sqlit
36080 65 5f 73 65 71 75 65 6e 63 65 27 22 29 20 29 7b  e_sequence'") ){
36090 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
360a0 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
360b0 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69  DELETE FROM sqli
360c0 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29  te_sequence;\n")
360d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
360e0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 50 61  te3_bind_int(pPa
360f0 67 65 73 2c 20 31 2c 20 69 52 6f 6f 74 29 3b 0a  ges, 1, iRoot);.
36100 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
36110 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20 32 2c 20  _int(pCells, 2, 
36120 70 54 61 62 2d 3e 69 50 6b 29 3b 0a 0a 20 20 20  pTab->iPk);..   
36130 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
36140 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
36150 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
36160 70 28 70 50 61 67 65 73 29 20 29 7b 0a 20 20 20  p(pPages) ){.   
36170 20 20 20 69 6e 74 20 69 50 67 6e 6f 20 3d 20 73     int iPgno = s
36180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
36190 74 28 70 50 61 67 65 73 2c 20 30 29 3b 0a 20 20  t(pPages, 0);.  
361a0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
361b0 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20 31 2c 20  _int(pCells, 1, 
361c0 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 77 68  iPgno);.      wh
361d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
361e0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
361f0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
36200 43 65 6c 6c 73 29 20 29 7b 0a 20 20 20 20 20 20  Cells) ){.      
36210 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 73    int nField = s
36220 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
36230 74 28 70 43 65 6c 6c 73 2c 20 30 29 3b 0a 20 20  t(pCells, 0);.  
36240 20 20 20 20 20 20 69 6e 74 20 69 4d 69 6e 20 3d        int iMin =
36250 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
36260 69 6e 74 28 70 43 65 6c 6c 73 2c 20 32 29 3b 0a  int(pCells, 2);.
36270 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
36280 61 72 20 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73  ar *zVal = (cons
36290 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
362a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 65 6c  column_text(pCel
362b0 6c 73 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 20  ls, 1);..       
362c0 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70   RecoverTable *p
362d0 54 61 62 32 20 3d 20 70 54 61 62 3b 0a 20 20 20  Tab2 = pTab;.   
362e0 20 20 20 20 20 69 66 28 20 70 54 61 62 21 3d 70       if( pTab!=p
362f0 4f 72 70 68 61 6e 20 26 26 20 28 69 4d 69 6e 3c  Orphan && (iMin<
36300 30 29 21 3d 62 49 6e 74 6b 65 79 20 29 7b 0a 20  0)!=bIntkey ){. 
36310 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72           if( pOr
36320 70 68 61 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  phan==0 ){.     
36330 20 20 20 20 20 20 20 70 4f 72 70 68 61 6e 20 3d         pOrphan =
36340 20 72 65 63 6f 76 65 72 4f 72 70 68 61 6e 54 61   recoverOrphanTa
36350 62 6c 65 28 70 53 74 61 74 65 2c 20 26 72 63 2c  ble(pState, &rc,
36360 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20   zLostAndFound, 
36370 6e 4f 72 70 68 61 6e 29 3b 0a 20 20 20 20 20 20  nOrphan);.      
36380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36390 70 54 61 62 32 20 3d 20 70 4f 72 70 68 61 6e 3b  pTab2 = pOrphan;
363a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
363b0 54 61 62 32 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tab2==0 ) break;
363c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
363d0 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 6e 46 69      nField = nFi
363e0 65 6c 64 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  eld+1;.        i
363f0 66 28 20 70 54 61 62 32 3d 3d 70 4f 72 70 68 61  f( pTab2==pOrpha
36400 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
36410 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
36420 2d 3e 6f 75 74 2c 20 0a 20 20 20 20 20 20 20 20  ->out, .        
36430 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
36440 54 4f 20 25 73 20 56 41 4c 55 45 53 28 25 64 2c  TO %s VALUES(%d,
36450 20 25 64 2c 20 25 64 2c 20 25 73 25 73 25 73 29   %d, %d, %s%s%s)
36460 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ;\n",.          
36470 20 20 20 20 70 54 61 62 32 2d 3e 7a 51 75 6f 74      pTab2->zQuot
36480 65 64 2c 20 69 52 6f 6f 74 2c 20 69 50 67 6e 6f  ed, iRoot, iPgno
36490 2c 20 6e 46 69 65 6c 64 2c 0a 20 20 20 20 20 20  , nField,.      
364a0 20 20 20 20 20 20 20 20 69 4d 69 6e 3c 30 20 3f          iMin<0 ?
364b0 20 22 22 20 3a 20 22 4e 55 4c 4c 2c 20 22 2c 20   "" : "NULL, ", 
364c0 7a 56 61 6c 2c 20 70 54 61 62 32 2d 3e 61 7a 6c  zVal, pTab2->azl
364d0 43 6f 6c 5b 6e 46 69 65 6c 64 5d 0a 20 20 20 20  Col[nField].    
364e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
364f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36500 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
36510 61 74 65 2d 3e 6f 75 74 2c 20 22 49 4e 53 45 52  ate->out, "INSER
36520 54 20 49 4e 54 4f 20 25 73 28 25 73 29 20 56 41  T INTO %s(%s) VA
36530 4c 55 45 53 28 20 25 73 20 29 3b 5c 6e 22 2c 20  LUES( %s );\n", 
36540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
36550 54 61 62 32 2d 3e 7a 51 75 6f 74 65 64 2c 20 70  Tab2->zQuoted, p
36560 54 61 62 32 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69  Tab2->azlCol[nFi
36570 65 6c 64 5d 2c 20 7a 56 61 6c 0a 20 20 20 20 20  eld], zVal.     
36580 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
36590 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
365a0 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20  shellReset(&rc, 
365b0 70 43 65 6c 6c 73 29 3b 0a 20 20 20 20 7d 0a 20  pCells);.    }. 
365c0 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72     shellReset(&r
365d0 63 2c 20 70 50 61 67 65 73 29 3b 0a 20 20 20 20  c, pPages);.    
365e0 69 66 28 20 70 54 61 62 21 3d 70 4f 72 70 68 61  if( pTab!=pOrpha
365f0 6e 20 29 20 72 65 63 6f 76 65 72 46 72 65 65 54  n ) recoverFreeT
36600 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a  able(pTab);.  }.
36610 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
36620 26 72 63 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 73  &rc, pLoop);.  s
36630 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
36640 2c 20 70 50 61 67 65 73 29 3b 0a 20 20 73 68 65  , pPages);.  she
36650 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
36660 70 43 65 6c 6c 73 29 3b 0a 20 20 72 65 63 6f 76  pCells);.  recov
36670 65 72 46 72 65 65 54 61 62 6c 65 28 70 4f 72 70  erFreeTable(pOrp
36680 68 61 6e 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  han);..  /* The 
36690 72 65 73 74 20 6f 66 20 74 68 65 20 73 63 68 65  rest of the sche
366a0 6d 61 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ma */.  if( rc==
366b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
366c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
366d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73 68  Stmt = 0;.    sh
366e0 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61 74  ellPrepare(pStat
366f0 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20  e->db, &rc, .   
36700 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
36710 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 72 65 63 6f  , name FROM reco
36720 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a 20 20  very.schema ".  
36730 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c        "WHERE sql
36740 20 4e 4f 54 20 4c 49 4b 45 20 27 63 72 65 61 74   NOT LIKE 'creat
36750 65 20 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74  e table%'", &pSt
36760 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68  mt.    );.    wh
36770 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
36780 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
36790 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
367a0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
367b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
367c0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
367d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
367e0 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
367f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
36800 73 74 72 6e 69 63 6d 70 28 7a 53 71 6c 2c 20 22  strnicmp(zSql, "
36810 63 72 65 61 74 65 20 76 69 72 74 22 2c 20 31 31  create virt", 11
36820 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
36830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
36840 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
36850 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
36860 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
36870 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50          char *zP
36880 72 69 6e 74 20 3d 20 73 68 65 6c 6c 4d 50 72 69  rint = shellMPri
36890 6e 74 66 28 26 72 63 2c 20 0a 20 20 20 20 20 20  ntf(&rc, .      
368a0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
368b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 56   sqlite_master V
368c0 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 20 25  ALUES('table', %
368d0 51 2c 20 25 51 2c 20 30 2c 20 25 51 29 22 2c 0a  Q, %Q, 0, %Q)",.
368e0 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
368f0 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 0a 20 20 20   zName, zSql.   
36900 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
36910 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74  raw_printf(pStat
36920 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  e->out, "%s;\n",
36930 20 7a 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20   zPrint);.      
36940 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
36950 50 72 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 65  Print);.      }e
36960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77  lse{.        raw
36970 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
36980 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53  out, "%s;\n", zS
36990 71 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ql);.      }.   
369a0 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
369b0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
369c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
369d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
369e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
369f0 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d  ate->out, "PRAGM
36a00 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
36a10 61 20 3d 20 6f 66 66 3b 5c 6e 22 29 3b 0a 20 20  a = off;\n");.  
36a20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74    raw_printf(pSt
36a30 61 74 65 2d 3e 6f 75 74 2c 20 22 43 4f 4d 4d 49  ate->out, "COMMI
36a40 54 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73 71  T;\n");.  }.  sq
36a50 6c 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74  lite3_exec(pStat
36a60 65 2d 3e 64 62 2c 20 22 44 45 54 41 43 48 20 72  e->db, "DETACH r
36a70 65 63 6f 76 65 72 79 22 2c 20 30 2c 20 30 2c 20  ecovery", 0, 0, 
36a80 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
36a90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 28 53  .}.#endif /* !(S
36aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36ab0 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
36ac0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
36ad0 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 20 2a  E_DBPAGE_VTAB) *
36ae0 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  /.../*.** If an 
36af0 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69 6e  input line begin
36b00 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e 20  s with "." then 
36b10 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
36b20 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73  ine to.** proces
36b30 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  s that line..**.
36b40 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
36b50 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
36b60 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
36b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36b80 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28  do_meta_command(
36b90 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65  char *zLine, She
36ba0 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
36bb0 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nt h = 1;.  int 
36bc0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nArg = 0;.  int 
36bd0 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d  n, c;.  int rc =
36be0 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72   0;.  char *azAr
36bf0 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20  g[50];..#ifndef 
36c00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36c10 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
36c20 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
36c30 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46 69   ){.    expertFi
36c40 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20  nish(p, 1, 0);. 
36c50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
36c60 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
36c70 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73  line into tokens
36c80 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
36c90 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67  zLine[h] && nArg
36ca0 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72 67  <ArraySize(azArg
36cb0 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
36cc0 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
36cd0 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
36ce0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20  if( zLine[h]==0 
36cf0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
36d00 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20   zLine[h]=='\'' 
36d10 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27  || zLine[h]=='"'
36d20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65   ){.      int de
36d30 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d  lim = zLine[h++]
36d40 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  ;.      azArg[nA
36d50 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
36d60 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
36d70 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e  zLine[h] && zLin
36d80 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]!=delim ){. 
36d90 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
36da0 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c  [h]=='\\' && del
36db0 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65  im=='"' && zLine
36dc0 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a  [h+1]!=0 ) h++;.
36dd0 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20          h++;.   
36de0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
36df0 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29  Line[h]==delim )
36e00 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  {.        zLine[
36e10 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
36e20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 69  }.      if( deli
36e30 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76 65  m=='"' ) resolve
36e40 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41  _backslashes(azA
36e50 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20  rg[nArg-1]);.   
36e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a   }else{.      az
36e70 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
36e80 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
36e90 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
36ea0 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  & !IsSpace(zLine
36eb0 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
36ec0 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
36ed0 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d  ] ) zLine[h++] =
36ee0 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c 76   0;.      resolv
36ef0 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
36f00 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
36f10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
36f20 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74 20  ocess the input 
36f30 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  line..  */.  if(
36f40 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72   nArg==0 ) retur
36f50 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e  n 0; /* no token
36f60 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20  s, no error */. 
36f70 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
36f80 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61  Arg[0]);.  c = a
36f90 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c  zArg[0][0];.  cl
36fa0 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a  earTempFile(p);.
36fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36fc0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
36fd0 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  ON.  if( c=='a' 
36fe0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
36ff0 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d  [0], "auth", n)=
37000 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
37010 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
37020 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
37030 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20  , "Usage: .auth 
37040 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20  ON|OFF\n");.    
37050 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
37060 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
37070 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
37080 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
37090 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  .    if( boolean
370a0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
370b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
370c0 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
370d0 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68  p->db, shellAuth
370e0 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
370f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
37100 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
37110 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
37120 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
37130 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
37140 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
37150 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
37160 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
37170 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  ZLIB).  if( c=='
37180 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
37190 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65  Arg[0], "archive
371a0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
371b0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
371c0 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
371d0 6d 61 6e 64 28 70 2c 20 30 2c 20 61 7a 41 72 67  mand(p, 0, azArg
371e0 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
371f0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28  .#endif..  if( (
37200 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
37210 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
37220 30 5d 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29  0], "backup", n)
37230 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  ==0).   || (c=='
37240 73 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  s' && n>=3 && st
37250 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37260 22 73 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20  "save", n)==0). 
37270 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
37280 61 72 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20  ar *zDestFile = 
37290 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
372a0 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20  r *zDb = 0;.    
372b0 73 71 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a  sqlite3 *pDest;.
372c0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
372d0 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
372e0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20   int j;.    int 
372f0 62 41 73 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  bAsync = 0;.    
37300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
37310 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
37320 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b  1; j<nArg; j++){
37330 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
37340 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  r *z = azArg[j];
37350 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
37360 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
37370 69 66 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20  if( z[1]=='-' ) 
37380 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  z++;.        if(
37390 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 70 70   strcmp(z, "-app
373a0 65 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  end")==0 ){.    
373b0 20 20 20 20 20 20 7a 56 66 73 20 3d 20 22 61 70        zVfs = "ap
373c0 6e 64 76 66 73 22 3b 0a 20 20 20 20 20 20 20 20  ndvfs";.        
373d0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
373e0 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 61 73  ( strcmp(z, "-as
373f0 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ync")==0 ){.    
37400 20 20 20 20 20 20 62 41 73 79 6e 63 20 3d 20 31        bAsync = 1
37410 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
37420 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
37430 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
37440 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e  stderr, "unknown
37450 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20   option: %s\n", 
37460 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20 20 20 20  azArg[j]);.     
37470 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
37480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37490 65 6c 73 65 20 69 66 28 20 7a 44 65 73 74 46 69  else if( zDestFi
374a0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
374b0 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a 41   zDestFile = azA
374c0 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  rg[j];.      }el
374d0 73 65 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  se if( zDb==0 ){
374e0 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 7a  .        zDb = z
374f0 44 65 73 74 46 69 6c 65 3b 0a 20 20 20 20 20 20  DestFile;.      
37500 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20 61 7a    zDestFile = az
37510 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 65  Arg[j];.      }e
37520 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77  lse{.        raw
37530 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
37540 22 55 73 61 67 65 3a 20 2e 62 61 63 6b 75 70 20  "Usage: .backup 
37550 3f 44 42 3f 20 3f 4f 50 54 49 4f 4e 53 3f 20 46  ?DB? ?OPTIONS? F
37560 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
37570 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
37580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
37590 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
375a0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
375b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d  rintf(stderr, "m
375c0 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20  issing FILENAME 
375d0 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63  argument on .bac
375e0 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  kup\n");.      r
375f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
37600 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20     if( zDb==0 ) 
37610 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
37620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
37630 70 65 6e 5f 76 32 28 7a 44 65 73 74 46 69 6c 65  pen_v2(zDestFile
37640 2c 20 26 70 44 65 73 74 2c 20 0a 20 20 20 20 20  , &pDest, .     
37650 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
37660 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
37670 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
37680 52 45 41 54 45 2c 20 7a 56 66 73 29 3b 0a 20 20  REATE, zVfs);.  
37690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
376a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
376b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
376c0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
376d0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
376e0 7a 44 65 73 74 46 69 6c 65 29 3b 0a 20 20 20 20  zDestFile);.    
376f0 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74    close_db(pDest
37700 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
37710 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
37720 20 62 41 73 79 6e 63 20 29 7b 0a 20 20 20 20 20   bAsync ){.     
37730 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 44   sqlite3_exec(pD
37740 65 73 74 2c 20 22 50 52 41 47 4d 41 20 73 79 6e  est, "PRAGMA syn
37750 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 3b 20 50 52  chronous=OFF; PR
37760 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
37770 65 3d 4f 46 46 3b 22 2c 0a 20 20 20 20 20 20 20  e=OFF;",.       
37780 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
37790 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
377a0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
377b0 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
377c0 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
377d0 28 70 44 65 73 74 2c 20 22 6d 61 69 6e 22 2c 20  (pDest, "main", 
377e0 70 2d 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  p->db, zDb);.   
377f0 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20   if( pBackup==0 
37800 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
37810 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
37820 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
37830 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
37840 29 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f  ));.      close_
37850 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  db(pDest);.     
37860 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
37870 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
37880 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
37890 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
378a0 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
378b0 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
378c0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
378d0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
378e0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
378f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
37900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37910 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
37920 64 65 72 72 2c 20 2