/ Hex Artifact Content
Login

Artifact 5d0e2b03f977a475700c4c535df74e753171d27ec4a50e1a5ec0090357008f05:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6300: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6310: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
6320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
6330: 41 47 45 5f 56 54 41 42 29 0a 49 4e 43 4c 55 44  AGE_VTAB).INCLUD
6340: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 64 62  E ../ext/misc/db
6350: 64 61 74 61 2e 63 0a 23 65 6e 64 69 66 0a 0a 23  data.c.#endif..#
6360: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6370: 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
6380: 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e  )./*.** State in
6390: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
63a0: 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73  single open sess
63b0: 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ion.*/.typedef s
63c0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63d0: 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73  n OpenSession;.s
63e0: 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f  truct OpenSessio
63f0: 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  n {.  char *zNam
6400: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
6410: 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  * Symbolic name 
6420: 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e  for this session
6430: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65   */.  int nFilte
6440: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
6450: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c  * Number of xFil
6460: 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c  ter rejection GL
6470: 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20  OB patterns */. 
6480: 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72   char **azFilter
6490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ;         /* Arr
64a0: 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65  ay of xFilter re
64b0: 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74  jection GLOB pat
64c0: 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74  terns */.  sqlit
64d0: 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20  e3_session *p;  
64e0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
64f0: 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65  session */.};.#e
6500: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c  ndif../*.** Shel
6510: 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e  l output mode in
6520: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62  formation from b
6530: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
6540: 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f  on",.** saved so
6550: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
6560: 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78  restored by ".ex
6570: 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79  plain off".*/.ty
6580: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76  pedef struct Sav
6590: 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64  edModeInfo Saved
65a0: 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74  ModeInfo;.struct
65b0: 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b   SavedModeInfo {
65c0: 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20  .  int valid;   
65d0: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65         /* Is the
65e0: 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e  re legit data in
65f0: 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   here? */.  int 
6600: 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  mode;           
6610: 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f  /* Mode prior to
6620: 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a   ".explain on" *
6630: 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64  /.  int showHead
6640: 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22  er;     /* The "
6650: 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67  .header" setting
6660: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6670: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6680: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
6690: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68   /* Column width
66a0: 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  s prior to ".exp
66b0: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a  lain on" */.};..
66c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
66d0: 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74  xpertInfo Expert
66e0: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70  Info;.struct Exp
66f0: 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69  ertInfo {.  sqli
6700: 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65  te3expert *pExpe
6710: 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f  rt;.  int bVerbo
6720: 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e  se;.};../* A sin
6730: 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20  gle line in the 
6740: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79  EQP output */.ty
6750: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51 50  pedef struct EQP
6760: 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61 70  GraphRow EQPGrap
6770: 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50  hRow;.struct EQP
6780: 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74  GraphRow {.  int
6790: 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20 20   iEqpId;        
67a0: 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69     /* ID for thi
67b0: 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  s row */.  int i
67c0: 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20  ParentId;       
67d0: 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61   /* ID of the pa
67e0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51  rent row */.  EQ
67f0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74  PGraphRow *pNext
6800: 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20  ;   /* Next row 
6810: 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  in sequence */. 
6820: 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20   char zText[1]; 
6830: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74         /* Text t
6840: 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68  o display for th
6850: 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  is row */.};../*
6860: 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20   All EQP output 
6870: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
6880: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
6890: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
68a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
68b0: 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72 61   EQPGraph EQPGra
68c0: 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ph;.struct EQPGr
68d0: 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68  aph {.  EQPGraph
68e0: 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a  Row *pRow;    /*
68f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
6900: 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
6910: 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  EQP output */.  
6920: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61  EQPGraphRow *pLa
6930: 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c  st;   /* Last el
6940: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f  ement of the pRo
6950: 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  w list */.  char
6960: 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20   zPrefix[100];  
6970: 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69    /* Graph prefi
6980: 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  x */.};../*.** S
6990: 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tate information
69a0: 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
69b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
69c0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61  s contained in a
69d0: 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  n.** instance of
69e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70  tructure..*/.typ
6a00: 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65 6c  edef struct Shel
6a10: 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74  lState ShellStat
6a20: 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53  e;.struct ShellS
6a30: 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  tate {.  sqlite3
6a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
6a50: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
6a60: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c  */.  u8 autoExpl
6a70: 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ain;        /* A
6a80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72  utomatically tur
6a90: 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f  n on .explain mo
6aa0: 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45  de */.  u8 autoE
6ab0: 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  QP;            /
6ac0: 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55  * Run EXPLAIN QU
6ad0: 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74  ERY PLAN prior t
6ae0: 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74  o seach SQL stmt
6af0: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6b00: 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  test;        /* 
6b10: 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65  autoEQP is in te
6b20: 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20  st mode */.  u8 
6b30: 61 75 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20  autoEQPtrace;   
6b40: 20 20 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69      /* autoEQP i
6b50: 73 20 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20  s in trace mode 
6b60: 2a 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b  */.  u8 statsOn;
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6b80: 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d  rue to display m
6b90: 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f  emory stats befo
6ba0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
6bb0: 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61   */.  u8 scansta
6bc0: 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  tsOn;        /* 
6bd0: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
6be0: 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72  scan stats befor
6bf0: 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20  e each finalize 
6c00: 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65  */.  u8 openMode
6c10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
6c20: 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
6c30: 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72  , _APPENDVFS, or
6c40: 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75   _ZIPFILE */.  u
6c50: 38 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20  8 doXdgOpen;    
6c60: 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20        /* Invoke 
6c70: 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
6c80: 70 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65  pen in output_re
6c90: 73 65 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45  set() */.  u8 nE
6ca0: 71 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  qpLevel;        
6cb0: 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68    /* Depth of th
6cc0: 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72 61  e EQP output gra
6cd0: 70 68 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63  ph */.  u8 eTrac
6ce0: 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  eType;         /
6cf0: 2a 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20  * SHELL_TRACE_* 
6d00: 76 61 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f  value for type o
6d10: 66 20 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73  f trace */.  uns
6d20: 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b  igned mEqpLines;
6d30: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76      /* Mask of v
6d40: 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69  eritical lines i
6d50: 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75 74  n the EQP output
6d60: 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20   graph */.  int 
6d70: 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  outCount;       
6d80: 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20     /* Revert to 
6d90: 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63  stdout when reac
6da0: 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69  hing zero */.  i
6db0: 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20  nt cnt;         
6dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6dd0: 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c  of records displ
6de0: 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ayed so far */. 
6df0: 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20   int lineno;    
6e00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c  number of last l
6e20: 69 6e 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e  ine read from in
6e30: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20   */.  FILE *in; 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e50: 52 65 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72  Read commands fr
6e60: 6f 6d 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a  om this stream *
6e70: 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20  /.  FILE *out;  
6e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6e90: 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ite results here
6ea0: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63   */.  FILE *trac
6eb0: 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  eOut;        /* 
6ec0: 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74  Output for sqlit
6ed0: 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20  e3_trace() */.  
6ee0: 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20  int nErr;       
6ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f00: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
6f10: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6f30: 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65  n output mode se
6f40: 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d  tting */.  int m
6f50: 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20  odePrior;       
6f60: 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20    /* Saved mode 
6f70: 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20  */.  int cMode; 
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
6f90: 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20  emporary output 
6fa0: 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75 72  mode for the cur
6fb0: 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20  rent query */.  
6fc0: 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20  int normalMode; 
6fd0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6fe0: 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65   mode before ".e
6ff0: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
7000: 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68 65  int writableSche
7010: 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ma;    /* True i
7020: 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  f PRAGMA writabl
7030: 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20  e_schema=ON */. 
7040: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
7050: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7060: 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e  to show column n
7070: 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20  ames in List or 
7080: 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20  Column mode */. 
7090: 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20   int nCheck;    
70a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
70b0: 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f  r of ".check" co
70c0: 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20  mmands run */.  
70d0: 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65  unsigned nProgre
70e0: 73 73 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ss;    /* Number
70f0: 20 6f 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c   of progress cal
7100: 6c 62 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72  lbacks encounter
7110: 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
7120: 20 6d 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f   mxProgress;   /
7130: 2a 20 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65  * Maximum progre
7140: 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66  ss callbacks bef
7150: 6f 72 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20  ore failing */. 
7160: 20 75 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f   unsigned flgPro
7170: 67 72 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73  gress;  /* Flags
7180: 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73   for the progres
7190: 73 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  s callback */.  
71a0: 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c  unsigned shellFl
71b0: 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  gs;    /* Variou
71c0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  s flags */.  sql
71d0: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78  ite3_int64 szMax
71e0: 3b 20 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65  ;   /* --maxsize
71f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70   argument to .op
7200: 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  en */.  char *zD
7210: 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f  estTable;      /
7220: 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e  * Name of destin
7230: 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e  ation table when
7240: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a   MODE_Insert */.
7250: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
7260: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  e;       /* Temp
7270: 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20  orary file that 
7280: 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74  might need delet
7290: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
72a0: 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20  estcase[30];    
72b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65  /* Name of curre
72c0: 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a  nt test case */.
72d0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61    char colSepara
72e0: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75  tor[20]; /* Colu
72f0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
7300: 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72  racter for sever
7310: 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68  al modes */.  ch
7320: 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  ar rowSeparator[
7330: 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61  20]; /* Row sepa
7340: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
7350: 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a  for MODE_Ascii *
7360: 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50  /.  char colSepP
7370: 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61  rior[20];  /* Sa
7380: 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ved column separ
7390: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72  ator */.  char r
73a0: 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  owSepPrior[20]; 
73b0: 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65   /* Saved row se
73c0: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
73d0: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
73e0: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
73f0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
7400: 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f  olumn when in co
7410: 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e  lumn mode*/.  in
7420: 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30  t actualWidth[10
7430: 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77  0];  /* Actual w
7440: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7450: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75  umn */.  char nu
7460: 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20  llValue[20];    
7470: 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70  /* The text to p
7480: 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c  rint when a NULL
7490: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
74a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74b0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
74c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
74d0: 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45  har outfile[FILE
74e0: 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69  NAME_MAX]; /* Fi
74f0: 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20  lename for *out 
7500: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7510: 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20  *zDbFilename;   
7520: 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
7530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7540: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e  .  char *zFreeOn
7550: 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Close;         /
7560: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72  * Filename to fr
7570: 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ee when closing 
7580: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7590: 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *zVfs;          
75a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
75b0: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
75c0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
75d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
75e0: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20  atement if any. 
75f0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b  */.  FILE *pLog;
7600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
7610: 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20  rite log output 
7620: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  here */.  int *a
7630: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
7640: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
7650: 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44  ents used in MOD
7660: 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69  E_Explain */.  i
7670: 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt nIndent;     
7680: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7690: 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b   array aiIndent[
76a0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  ] */.  int iInde
76b0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
76c0: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
76d0: 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74  t op in aiIndent
76e0: 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68  [] */.  EQPGraph
76f0: 20 73 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f   sGraph;       /
7700: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  * Information fo
7710: 72 20 74 68 65 20 67 72 61 70 68 69 63 61 6c 20  r the graphical 
7720: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
7730: 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  AN */.#if define
7740: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
7750: 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e  SESSION).  int n
7760: 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Session;        
7770: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7780: 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e  f active session
7790: 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69  s */.  OpenSessi
77a0: 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20  on aSession[4]; 
77b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73   /* Array of ses
77c0: 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69  sions.  [0] is i
77d0: 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64  n focus. */.#end
77e0: 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20  if.  ExpertInfo 
77f0: 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f  expert;        /
7800: 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69  * Valid if previ
7810: 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  ous command was 
7820: 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22  ".expert OPT..."
7830: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f   */.};.../* Allo
7840: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53  wed values for S
7850: 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51  hellState.autoEQ
7860: 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  P.*/.#define AUT
7870: 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20  OEQP_off      0 
7880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74            /* Aut
7890: 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
78a0: 55 45 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66  UERY PLAN is off
78b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f   */.#define AUTO
78c0: 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20  EQP_on       1  
78d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f           /* Auto
78e0: 6d 61 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20  matic EQP is on 
78f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7900: 51 50 5f 74 72 69 67 67 65 72 20 20 32 20 20 20  QP_trigger  2   
7910: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e          /* On an
7920: 64 20 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e  d also show plan
7930: 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a  s for triggers *
7940: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7950: 50 5f 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20  P_full     3    
7960: 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66         /* Show f
7970: 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  ull EXPLAIN */..
7980: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7990: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
79a0: 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65  .openMode.*/.#de
79b0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
79c0: 55 4e 53 50 45 43 20 20 20 20 20 20 30 20 20 20  UNSPEC      0   
79d0: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
79e0: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
79f0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7a00: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31  EN_NORMAL      1
7a10: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
7a20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7a30: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7a40: 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20  PEN_APPENDVFS   
7a50: 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70  2      /* Use ap
7a60: 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69  pendvfs */.#defi
7a70: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  ne SHELL_OPEN_ZI
7a80: 50 46 49 4c 45 20 20 20 20 20 33 20 20 20 20 20  PFILE     3     
7a90: 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66   /* Use the zipf
7aa0: 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ile virtual tabl
7ab0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45  e */.#define SHE
7ac0: 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
7ad0: 20 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70      4      /* Op
7ae0: 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61  en a normal data
7af0: 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  base read-only *
7b00: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7b10: 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45  OPEN_DESERIALIZE
7b20: 20 35 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   5      /* Open 
7b30: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  using sqlite3_de
7b40: 73 65 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23  serialize() */.#
7b50: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7b60: 4e 5f 48 45 58 44 42 20 20 20 20 20 20 20 36 20  N_HEXDB       6 
7b70: 20 20 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74       /* Use "dbt
7b80: 6f 74 78 74 22 20 6f 75 74 70 75 74 20 61 73 20  otxt" output as 
7b90: 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a  data source */..
7ba0: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7bb0: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7bc0: 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23  .eTraceType.*/.#
7bd0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7be0: 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20  CE_PLAIN      0 
7bf0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70       /* Show inp
7c00: 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23  ut SQL text */.#
7c10: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7c20: 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20  CE_EXPANDED   1 
7c30: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70       /* Show exp
7c40: 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a  anded SQL text *
7c50: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7c60: 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
7c70: 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20   2      /* Show 
7c80: 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74  normalized SQL t
7c90: 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20  ext */../* Bits 
7ca0: 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  in the ShellStat
7cb0: 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61  e.flgProgress va
7cc0: 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  riable */.#defin
7cd0: 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  e SHELL_PROGRESS
7ce0: 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20  _QUIET 0x01  /* 
7cf0: 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20  Omit announcing 
7d00: 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20 63  every progress c
7d10: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69  allback */.#defi
7d20: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7d30: 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a  S_RESET 0x02  /*
7d40: 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
7d50: 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65   when the progre
7d60: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
7d90: 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65   limit is reache
7da0: 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  d, and for each.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7de0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
7df0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50  .#define SHELL_P
7e00: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78  ROGRESS_ONCE  0x
7e10: 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68  04  /* Cancel th
7e20: 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20  e --limit after 
7e30: 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a  firing once */..
7e40: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7e50: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7e60: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7e70: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7e80: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7e90: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7ea0: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7eb0: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7ec0: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7ed0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7ee0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ef0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7f00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7f10: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7f20: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7f30: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7f40: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7f50: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7f60: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7f70: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7f80: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7f90: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7fa0: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7fb0: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7fc0: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7fd0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7fe0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7ff0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
8000: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
8010: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
8020: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
8030: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
8040: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
8050: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
8060: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
8070: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
8080: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
8090: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
80a0: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
80b0: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
80c0: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
80d0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
80e0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
80f0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
8100: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
8110: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
8120: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
8130: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
8140: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
8150: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
8160: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
8170: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
8180: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
8190: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
81a0: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
81b0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
81c0: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
81d0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81e0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
81f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8200: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
8210: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
8220: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
8230: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
8240: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
8250: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
8260: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
8270: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
8280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8290: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
82a0: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
82b0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
82c0: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
82d0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
82e0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
82f0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
8300: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
8310: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
8320: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
8330: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
8340: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
8350: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
8360: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
8370: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
8380: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
8390: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
83a0: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
83b0: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
83c0: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
83d0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
83e0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
83f0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
8400: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
8410: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
8420: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8430: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8440: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8450: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8460: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8470: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8480: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8490: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
84a0: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
84b0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
84c0: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
84d0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
84e0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
84f0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8500: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8510: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8520: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8530: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8540: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8550: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8560: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8570: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8580: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8590: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
85a0: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
85b0: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
85c0: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
85d0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
85e0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
85f0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
8600: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
8610: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
8620: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8630: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8640: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8650: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8660: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8670: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8680: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8690: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
86a0: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
86b0: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
86c0: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
86d0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
86e0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
86f0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
8700: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
8710: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
8720: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8730: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8740: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8750: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8760: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8770: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8780: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8790: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
87a0: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
87b0: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
87c0: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
87d0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
87e0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
87f0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
8800: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
8810: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
8820: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8830: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8840: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8850: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8860: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8870: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8880: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8890: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
88a0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
88b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
88c0: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
88d0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
88e0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
88f0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
8900: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
8910: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
8920: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8930: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8940: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8950: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8960: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8970: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8980: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8990: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
89b0: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
89c0: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
89d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
89e0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
89f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
8a00: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
8a10: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
8a20: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8a30: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8a40: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8a50: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8a60: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8a70: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8a80: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8a90: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8aa0: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8ab0: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8ac0: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8ad0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8ae0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8af0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8b00: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8b10: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
8b20: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8b30: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8b40: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8b50: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8b60: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8b70: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8b80: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8b90: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8ba0: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8bb0: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8bc0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8bd0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8be0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8bf0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8c10: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
8c20: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8c30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8c40: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8c50: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8c60: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8c70: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8c80: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8c90: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8ca0: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8cc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8cd0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8ce0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8cf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8d00: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
8d20: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8d30: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8d40: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d60: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d70: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8d80: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8da0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8db0: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8dc0: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8dd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8de0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8df0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8e00: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8e10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8e20: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8e30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e40: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8e50: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8e60: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8e70: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8e80: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8e90: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8ea0: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8eb0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8ec0: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8ed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8ee0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ef0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8f00: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8f10: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8f20: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8f30: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8f40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f50: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8f60: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8f70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8f80: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8f90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8fa0: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8fb0: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8fc0: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8fd0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8fe0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8ff0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
9000: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
9010: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
9020: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
9030: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
9040: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
9050: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
9060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9080: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
9090: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
90a0: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
90b0: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
90c0: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
90d0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
90e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
90f0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
9100: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
9110: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
9120: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
9130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9140: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
9150: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9160: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9170: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
9180: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
9190: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
91a0: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
91b0: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
91c0: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
91d0: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
91e0: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
91f0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
9200: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9210: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
9220: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9230: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9240: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9250: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9260: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9270: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9280: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
9290: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
92a0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
92b0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
92c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92d0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92e0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
92f0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
9300: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9310: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
9320: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9330: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9340: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9350: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9370: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9380: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9390: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
93a0: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
93b0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
93c0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93d0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93e0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
93f0: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
9400: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
9410: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9420: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9430: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9440: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9450: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9460: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9470: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9480: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9490: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
94a0: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
94b0: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
94c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94d0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
94f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9500: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
9510: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
9520: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9530: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9540: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
9550: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
9560: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
9570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9580: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9590: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
95a0: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
95b0: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
95c0: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
95d0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
95e0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
95f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
9600: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
9610: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
9620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
9640: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
9650: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
9660: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
9670: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9680: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9690: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
96a0: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
96b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
96c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
96d0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
96e0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
96f0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
9700: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
9710: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
9720: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
9730: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
9740: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
9750: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
9760: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
9770: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9780: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9790: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
97a0: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
97b0: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
97c0: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
97d0: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
97e0: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9810: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
9820: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9830: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9840: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9850: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
9860: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
9870: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9890: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
98a0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
98b0: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
98c0: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
98d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
98e0: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
98f0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
9900: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
9910: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
9920: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9930: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9940: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9950: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9960: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9970: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9980: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9990: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
99a0: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
99b0: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
99c0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
99d0: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
99e0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
99f0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
9a00: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
9a10: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
9a20: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9a30: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9a40: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9a50: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
9a60: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
9a70: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9a80: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9a90: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9aa0: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9ab0: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9ac0: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9ae0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9af0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9b00: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9b10: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
9b20: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9b30: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9b40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b50: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
9b60: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
9b70: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b80: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9b90: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9ba0: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9bb0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9bc0: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9bd0: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9be0: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9bf0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9c00: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9c10: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
9c20: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9c30: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9c40: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9c50: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
9c60: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
9c70: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9c80: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9c90: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9ca0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9cb0: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9cf0: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9d00: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9d10: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
9d20: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9d30: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9d40: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9d50: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
9d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9d70: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9d80: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9d90: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9da0: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9db0: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9dc0: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9dd0: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9de0: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9df0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9e00: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9e10: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
9e20: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9e30: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9e40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9e50: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
9e60: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9e70: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9e80: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9e90: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9ea0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9eb0: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9ec0: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9ed0: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9ee0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ef0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9f00: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9f10: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9f20: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9f30: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9f40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9f50: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9f60: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9f70: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9f80: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9f90: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9fa0: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9fb0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9fc0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9fd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9fe0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9ff0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
a000: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
a010: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
a020: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
a030: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
a040: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
a050: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
a060: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a070: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
a080: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a090: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
a0a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a0b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a0c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
a0d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0e0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
a0f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a100: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
a110: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
a120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
a130: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
a140: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
a150: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
a160: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
a170: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
a180: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
a190: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
a1a0: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
a1b0: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
a1c0: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
a1d0: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
a1e0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
a1f0: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
a200: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
a210: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
a220: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
a230: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
a240: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
a250: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
a260: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
a270: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
a280: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
a290: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
a2a0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
a2b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a2c0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
a2d0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
a2e0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
a2f0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
a300: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
a310: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
a320: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
a330: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
a340: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
a350: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
a360: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a370: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
a380: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
a390: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
a3a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
a3b0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
a3c0: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
a3d0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
a3e0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
a3f0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
a400: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
a410: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
a420: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
a430: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a440: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a450: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
a460: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
a470: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a480: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a490: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a4a0: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a4b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a4c0: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a4d0: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a4e0: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a4f0: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a510: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a520: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a530: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a540: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a550: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a560: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a570: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a580: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a590: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a5a0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a5b0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a5c0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a5d0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a5e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5f0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a600: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a610: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a620: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a630: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a640: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a660: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a670: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a680: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a690: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a6a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a6c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a6d0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a6e0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6f0: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a700: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a710: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a720: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a730: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a740: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a750: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a760: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a770: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a780: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a790: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a7a0: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a7b0: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a7c0: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a7d0: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a7e0: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a800: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a810: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a820: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a830: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a840: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a850: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a860: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a870: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a880: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a890: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a8a0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a8b0: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a8c0: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a8d0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a8e0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a8f0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a900: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a910: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a920: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a930: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a940: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a950: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a960: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a970: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a980: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a990: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a9a0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a9b0: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a9c0: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9d0: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a9e0: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a9f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
aa00: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
aa10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aa20: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
aa30: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
aa40: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
aa50: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
aa60: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
aa70: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
aa80: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
aa90: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
aaa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aab0: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
aac0: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
aad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
aae0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
aaf0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
ab00: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
ab10: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
ab30: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
ab40: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
ab50: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab60: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
ab70: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
ab80: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
ab90: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
aba0: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
abb0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
abc0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
abd0: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
abe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
abf0: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
ac00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
ac10: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
ac20: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
ac30: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac40: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
ac50: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
ac60: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
ac70: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ac80: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
ac90: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
aca0: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
acb0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
acc0: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
acd0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
ace0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
acf0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
ad00: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
ad10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad20: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
ad30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
ad40: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
ad50: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
ad60: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
ad70: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
ad80: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
ad90: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
ada0: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
adb0: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
adc0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
add0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
ade0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adf0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
ae00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae10: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
ae20: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ae30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae40: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
ae50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
ae60: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae70: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ae80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae90: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
aea0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
aeb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aec0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aed0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aee0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aef0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
af00: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af10: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
af20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af30: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af40: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af60: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af70: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
af80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af90: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
afa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afb0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
afc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
afd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afe0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
aff0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b000: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b010: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b020: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b030: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b040: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b050: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b060: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b070: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b080: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b090: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b0a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0b0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b0c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0d0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0e0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b100: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b110: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
b120: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
b130: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
b140: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
b150: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
b160: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
b170: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
b180: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
b190: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
b1a0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
b1b0: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
b1c0: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
b1d0: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
b1e0: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
b1f0: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
b200: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
b210: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
b220: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
b230: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
b250: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
b260: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
b270: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
b280: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b290: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
b2a0: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
b2b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
b2c0: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
b2d0: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
b2e0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
b2f0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
b300: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
b310: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
b320: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
b330: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
b340: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
b350: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
b360: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
b370: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
b380: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
b390: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
b3a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
b3b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b3c0: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
b3d0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
b3e0: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
b3f0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
b400: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
b410: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
b420: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
b430: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b440: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
b450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
b460: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
b470: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b480: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b490: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b4a0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b4b0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b4c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b4d0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b4e0: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b4f0: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b500: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b510: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b520: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b530: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b540: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b550: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b560: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b570: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b580: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b590: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b5a0: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b5b0: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b5c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b5d0: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b5e0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b5f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b600: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b610: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b620: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b630: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b640: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b650: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b660: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b670: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b680: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b690: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b6a0: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b6b0: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b6c0: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b6d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b6e0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b6f0: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b700: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b710: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b720: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b730: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b740: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b750: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b760: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b770: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b780: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b790: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b7a0: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b7b0: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b7c0: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b7d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b7f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b800: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b810: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b820: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b830: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b840: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b850: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b860: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b870: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b880: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b890: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b8a0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b8b0: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b8c0: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b8d0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8e0: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b8f0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b900: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b910: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b920: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b930: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b940: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b950: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b960: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b970: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b980: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b990: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b9a0: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b9b0: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b9c0: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b9d0: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b9e0: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b9f0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
ba00: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
ba10: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
ba20: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
ba30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba40: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
ba50: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
ba60: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
ba70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ba80: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
ba90: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
baa0: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
bab0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
bac0: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
bad0: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
bae0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
baf0: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
bb00: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
bb10: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
bb30: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
bb40: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
bb50: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
bb60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
bb70: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
bb80: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
bb90: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
bba0: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
bbb0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bbc0: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
bbd0: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
bbe0: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
bbf0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
bc00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bc10: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
bc20: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
bc30: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
bc40: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
bc50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc70: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
bc80: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
bc90: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
bca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bcb0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
bcc0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
bcd0: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
bce0: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
bcf0: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
bd00: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
bd10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bd20: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
bd30: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bd40: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
bd50: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
bd60: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
bd70: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
bd80: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
bd90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bda0: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
bdb0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
bdc0: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
bdd0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
bde0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
bdf0: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
be00: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
be10: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
be20: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
be30: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
be40: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
be50: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
be60: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
be70: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
be80: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
be90: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
bea0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
beb0: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
bec0: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
bed0: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
bee0: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
bef0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
bf00: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
bf10: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
bf20: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
bf30: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
bf40: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
bf50: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
bf60: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
bf70: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
bf80: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
bf90: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
bfa0: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
bfb0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bfc0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
bfd0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
bfe0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
bff0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
c000: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
c010: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
c020: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
c030: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
c040: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
c050: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
c060: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
c070: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
c080: 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  to the EXPLAIN Q
c090: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
c0a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c0b0: 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74  p_append(ShellSt
c0c0: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c0d0: 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  Id, int p2, cons
c0e0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
c0f0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c100: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74  New;.  int nText
c110: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78   = strlen30(zTex
c120: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74  t);.  if( p->aut
c130: 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20  oEQPtest ){.    
c140: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c150: 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22  ut, "%d,%d,%s\n"
c160: 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54  , iEqpId, p2, zT
c170: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ext);.  }.  pNew
c180: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
c190: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
c1a0: 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20  w) + nText );.  
c1b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68  if( pNew==0 ) sh
c1c0: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
c1d0: 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71  y();.  pNew->iEq
c1e0: 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20  pId = iEqpId;.  
c1f0: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20  pNew->iParentId 
c200: 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70  = p2;.  memcpy(p
c210: 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78  New->zText, zTex
c220: 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70  t, nText+1);.  p
c230: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
c240: 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e    if( p->sGraph.
c250: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pLast ){.    p->
c260: 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e  sGraph.pLast->pN
c270: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65  ext = pNew;.  }e
c280: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  lse{.    p->sGra
c290: 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a  ph.pRow = pNew;.
c2a0: 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e    }.  p->sGraph.
c2b0: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a  pLast = pNew;.}.
c2c0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20  ./*.** Free and 
c2d0: 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49  reset the EXPLAI
c2e0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
c2f0: 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  a that has been 
c300: 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20  collected.** in 
c310: 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74  p->sGraph..*/.st
c320: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65  atic void eqp_re
c330: 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
c340: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
c350: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
c360: 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d  .  for(pRow = p-
c370: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52  >sGraph.pRow; pR
c380: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
c390: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
c3a0: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
c3b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
c3c0: 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  w);.  }.  memset
c3d0: 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20  (&p->sGraph, 0, 
c3e0: 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68  sizeof(p->sGraph
c3f0: 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ));.}../* Return
c400: 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49   the next EXPLAI
c410: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e  N QUERY PLAN lin
c420: 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74 68  e with iEqpId th
c430: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
c440: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
c450: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
c460: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
c470: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
c480: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
c490: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
c4a0: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45  State *p, int iE
c4b0: 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f  qpId, EQPGraphRo
c4c0: 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47  w *pOld){.  EQPG
c4d0: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c4e0: 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65  pOld ? pOld->pNe
c4f0: 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70  xt : p->sGraph.p
c500: 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  Row;.  while( pR
c510: 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72  ow && pRow->iPar
c520: 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29 20  entId!=iEqpId ) 
c530: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c540: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f  xt;.  return pRo
c550: 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20  w;.}../* Render 
c560: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c570: 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74  f the graph that
c580: 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20 69   has iEqpId as i
c590: 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c  ts parent.  Call
c5a0: 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c  ed.** recursivel
c5b0: 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c  y to render subl
c5c0: 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  evels..*/.static
c5d0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c5e0: 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74  _level(ShellStat
c5f0: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c600: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c610: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c620: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c630: 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  30(p->sGraph.zPr
c640: 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a  efix);.  char *z
c650: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65  ;.  for(pRow = e
c660: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c670: 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b  EqpId, 0); pRow;
c680: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c690: 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f      pNext = eqp_
c6a0: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c6b0: 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a  Id, pRow);.    z
c6c0: 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a   = pRow->zText;.
c6d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c6e0: 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c  p->out, "%s%s%s\
c6f0: 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n", p->sGraph.zP
c700: 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22  refix, pNext ? "
c710: 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29  |--" : "`--", z)
c720: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  ;.    if( n<(int
c730: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70  )sizeof(p->sGrap
c740: 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a  h.zPrefix)-7 ){.
c750: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
c760: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c770: 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20  n], pNext ? "|  
c780: 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20  " : "   ", 4);. 
c790: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c7a0: 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69  level(p, pRow->i
c7b0: 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d  EqpId);.      p-
c7c0: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c7d0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  n] = 0;.    }.  
c7e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  }.}../*.** Displ
c7f0: 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ay and reset the
c800: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c810: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
c820: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64  ic void eqp_rend
c830: 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  er(ShellState *p
c840: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c850: 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61   *pRow = p->sGra
c860: 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70  ph.pRow;.  if( p
c870: 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Row ){.    if( p
c880: 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  Row->zText[0]=='
c890: 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
c8a0: 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  pRow->pNext==0 )
c8b0: 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72 65  {.        eqp_re
c8c0: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c8d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c8e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c8f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
c900: 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29  , pRow->zText+3)
c910: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70  ;.      p->sGrap
c920: 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70  h.pRow = pRow->p
c930: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
c940: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c950: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c960: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c970: 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e  out, "QUERY PLAN
c980: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
c990: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c9a0: 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71  x[0] = 0;.    eq
c9b0: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70  p_render_level(p
c9c0: 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65  , 0);.    eqp_re
c9d0: 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  set(p);.  }.}..#
c9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c9f0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
ca00: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72  BACK./*.** Progr
ca10: 65 73 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ess handler call
ca20: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
ca30: 69 6e 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e  int progress_han
ca40: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65  dler(void *pClie
ca50: 6e 74 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c  ntData) {.  Shel
ca60: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
ca70: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
ca80: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67  Data;.  p->nProg
ca90: 72 65 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  ress++;.  if( p-
caa0: 3e 6e 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d  >nProgress>=p->m
cab0: 78 50 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e  xProgress && p->
cac0: 6d 78 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a  mxProgress>0 ){.
cad0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
cae0: 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73  ->out, "Progress
caf0: 20 6c 69 6d 69 74 20 72 65 61 63 68 65 64 20 28   limit reached (
cb00: 25 75 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67  %u)\n", p->nProg
cb10: 72 65 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  ress);.    if( p
cb20: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb30: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52  SHELL_PROGRESS_R
cb40: 45 53 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72  ESET ) p->nProgr
cb50: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ess = 0;.    if(
cb60: 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20   p->flgProgress 
cb70: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cb80: 5f 4f 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f  _ONCE ) p->mxPro
cb90: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72  gress = 0;.    r
cba0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
cbb0: 66 28 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65  f( (p->flgProgre
cbc0: 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52  ss & SHELL_PROGR
cbd0: 45 53 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b  ESS_QUIET)==0 ){
cbe0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
cbf0: 70 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73  p->out, "Progres
cc00: 73 20 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f  s %u\n", p->nPro
cc10: 67 72 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65  gress);.  }.  re
cc20: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
cc30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cc40: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
cc50: 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K */../*.** This
cc60: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
cc70: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
cc80: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
cc90: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
cca0: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
ccb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ccc0: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
ccd0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
cce0: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
ccf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
cd00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
cd10: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
cd20: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
cd30: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
cd40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
cd50: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
cd60: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
cd70: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
cd80: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
cd90: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
cda0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
cdb0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
cdc0: 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d  ;..  if( azArg==
cdd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cde0: 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65  switch( p->cMode
cdf0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
ce00: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
ce10: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
ce20: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
ce30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
ce40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
ce50: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
ce60: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
ce70: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
ce80: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
ce90: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
cea0: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
ceb0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
cec0: 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  +>0 ) utf8_print
ced0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
cee0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
cef0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cf00: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cf10: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
cf20: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
cf30: 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s%s", w, azCol
cf40: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
cf50: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
cf60: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
cf70: 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53  llValue, p->rowS
cf80: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
cf90: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cfa0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
cfb0: 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20  ODE_Explain:.   
cfc0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   case MODE_Colum
cfd0: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  n: {.      stati
cfe0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70  c const int aExp
cff0: 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b  lainWidths[] = {
d000: 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20  4, 13, 4, 4, 4, 
d010: 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20  13, 2, 13};.    
d020: 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c    const int *col
d030: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  Width;.      int
d040: 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20   showHdr;.      
d050: 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20  char *rowSep;.  
d060: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
d070: 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b  ==MODE_Column ){
d080: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d090: 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b  h = p->colWidth;
d0a0: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
d0b0: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
d0c0: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
d0d0: 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
d0e0: 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
d0f0: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d100: 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74  h = aExplainWidt
d110: 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77  hs;.        show
d120: 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Hdr = 1;.       
d130: 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f   rowSep = SEP_Ro
d140: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
d150: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
d160: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d170: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d180: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d190: 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   w, n;.         
d1a0: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
d1b0: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b  (p->colWidth) ){
d1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d1d0: 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20   colWidth[i];.  
d1e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d1f0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
d200: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d210: 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30          if( w==0
d220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d230: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
d240: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
d250: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
d260: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
d270: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d280: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43       n = strlenC
d290: 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41  har(azArg && azA
d2a0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
d2b0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
d2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d2d0: 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20  ( w<n ) w = n;. 
d2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d2f0: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
d300: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
d310: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d320: 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64      p->actualWid
d330: 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20  th[i] = w;.     
d340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d350: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d360: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d370: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
d380: 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  out, w, azCol[i]
d390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
d3a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d3b0: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
d3c0: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
d3d0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
d3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3f0: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
d400: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
d410: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d420: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d430: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
d440: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d450: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d460: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d470: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
d480: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
d490: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
d4a0: 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20  0 ) w = -w;.    
d4b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
d4d0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
d4e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d4f0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d500: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
d510: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
d520: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d560: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
d570: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5b0: 2d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
d5c0: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
d5d0: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
d5e0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
d5f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d600: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
d610: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
d620: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d630: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d640: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
d650: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d660: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d680: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
d690: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
d6a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d6b0: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d6c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
d6d0: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
d6e0: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
d6f0: 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28  ] && strlenChar(
d700: 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20  azArg[i])>w ){. 
d710: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
d720: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
d730: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d740: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26       if( i==1 &&
d750: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20   p->aiIndent && 
d760: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
d770: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e        if( p->iIn
d780: 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20  dent<p->nIndent 
d790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
d7a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d7b0: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
d7c0: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
d7d0: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
d7e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
d7f0: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
d800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
d810: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
d820: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67  p->out, w, azArg
d830: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d840: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d850: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d860: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d870: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
d880: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
d890: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d8a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d8b0: 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20  e MODE_Semi: {  
d8c0: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
d8d0: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70  .fullschema outp
d8e0: 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e  ut */.      prin
d8f0: 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
d900: 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b  ut, azArg[0], ";
d910: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
d920: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d930: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b  e MODE_Pretty: {
d940: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
d950: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74   .fullschema wit
d960: 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20  h --indent */.  
d970: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
d980: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
d990: 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a  int nParen = 0;.
d9a0: 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20        char cEnd 
d9b0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
d9c0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  c;.      int nLi
d9d0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ne = 0;.      as
d9e0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
d9f0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
da00: 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [0]==0 ) break;.
da10: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
da20: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
da30: 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b  E VIEW%", azArg[
da40: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
da50: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
da60: 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47  ike("CREATE TRIG
da70: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
da80: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
da90: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
daa0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
dab0: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
dac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dad0: 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71    }.      z = sq
dae0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
daf0: 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  s", azArg[0]);. 
db00: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
db10: 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61    for(i=0; IsSpa
db20: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
db30: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20  .      for(; (c 
db40: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
db50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
db60: 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
db70: 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d        if( z[j-1]
db80: 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20  =='\r' ) z[j-1] 
db90: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
dba0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
dbb0: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
dbc0: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
dbd0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dbe0: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
dbf0: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
dc00: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
dc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
dc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc30: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
dc40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
dc50: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
dc60: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
dc70: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
dc80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
dc90: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
dca0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
dcb0: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
dcc0: 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43  !=0; i++){  /* C
dcd0: 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  opy changes from
dce0: 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b   z[i] back to z[
dcf0: 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  j] */.          
dd00: 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20  if( c==cEnd ){. 
dd10: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dd20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
dd30: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
dd40: 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  || c=='\'' || c=
dd50: 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='`' ){.        
dd60: 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20      cEnd = c;.  
dd70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dd80: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
dd90: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27          cEnd = '
dda0: 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]';.          }e
ddb0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26  lse if( c=='-' &
ddc0: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b  & z[i+1]=='-' ){
ddd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
dde0: 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  d = '\n';.      
ddf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
de00: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
de10: 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20      nParen++;.  
de20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
de30: 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  ( c==')' ){.    
de40: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d          nParen--
de50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
de60: 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61  ( nLine>0 && nPa
de70: 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b  ren==0 && j>0 ){
de80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
de90: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
dea0: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
deb0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n");.           
dec0: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
ded0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b    }.          z[
def0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
df00: 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d      if( nParen==
df10: 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20  1 && cEnd==0.   
df20: 20 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27          && (c=='
df30: 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c  (' || c=='\n' ||
df40: 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54   (c==',' && !wsT
df50: 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20  oEol(z+i+1))).  
df60: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
df70: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
df80: 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20  n' ) j--;.      
df90: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
dfa0: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
dfb0: 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20  , j, "\n  ");.  
dfc0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
dfd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69  .            nLi
dfe0: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ne++;.          
dff0: 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
e000: 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b  (z[i+1]) ){ i++;
e010: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e030: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
e040: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63   }.      printSc
e050: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
e060: 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20   z, ";\n");.    
e070: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e080: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e090: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e0a0: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
e0b0: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e0c0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e0d0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e0e0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
e100: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e110: 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69  t,"%s%s",azCol[i
e120: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
e130: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
e140: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e150: 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   : p->colSeparat
e160: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
e170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e180: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
e190: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
e1a0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e1b0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
e1c0: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
e1d0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
e1e0: 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b   = p->nullValue;
e1f0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e200: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e210: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ", z);.        i
e220: 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20  f( i<nArg-1 ){. 
e230: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
e240: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e250: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
e260: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  or);.        }el
e270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  se{.          ut
e280: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e290: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e2a0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e2b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e2c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e2d0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d     case MODE_Htm
e2e0: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
e2f0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
e300: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
e310: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e320: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29  f(p->out,"<TR>")
e330: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
e340: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e350: 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
e360: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
e370: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
e380: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
e390: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
e3a0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
e3b0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e3c0: 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20  t,"</TH>\n");.  
e3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e3e0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e3f0: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
e400: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e410: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e420: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
e430: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22  tf(p->out,"<TR>"
e440: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
e450: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
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 54 44 3e 22  tf(p->out,"<TD>"
e480: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
e490: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
e4a0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
e4b0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
e4c0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
e4d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e4e0: 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b  >out,"</TD>\n");
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e500: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e510: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
e520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e530: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63      case MODE_Tc
e540: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
e550: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
e560: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
e570: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e580: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e590: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
e5a0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61  _string(p->out,a
e5b0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
e5c0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
e5d0: 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29      if(i<nArg-1)
e5e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e5f0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e600: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
e620: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e630: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
e640: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e650: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e660: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e670: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e680: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e690: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
e6a0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e6b0: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
e6c0: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
e6d0: 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41  .        if(i<nA
e6e0: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
e6f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e700: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e720: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e730: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e740: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e760: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
e770: 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e  : {.      setBin
e780: 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
e790: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
e7a0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
e7b0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e7c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e7d0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e7e0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
e7f0: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20  v(p, azCol[i] ? 
e800: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69  azCol[i] : "", i
e810: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
e820: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e830: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e840: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e850: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e860: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30        if( nArg>0
e870: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e880: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e890: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
e8a0: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67  put_csv(p, azArg
e8b0: 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a  [i], i<nArg-1);.
e8c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8d0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e8e0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e8f0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e900: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54      }.      setT
e910: 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
e920: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
e930: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e940: 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20  MODE_Insert: {. 
e950: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e960: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e970: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e980: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
e990: 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62   %s",p->zDestTab
e9a0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
e9b0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
e9c0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e9d0: 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a  tf(p->out,"(");.
e9e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e9f0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ea00: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
ea10: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
ea20: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
ea30: 20 20 20 20 20 20 69 66 28 20 71 75 6f 74 65 43        if( quoteC
ea40: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b  har(azCol[i]) ){
ea50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
ea60: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  r *z = sqlite3_m
ea70: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
ea80: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
ea90: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
eaa0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
eab0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
eac0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ead0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
eae0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
eaf0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
eb00: 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69  t, "%s", azCol[i
eb10: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
eb20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb30: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
eb40: 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  out,")");.      
eb50: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
eb60: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
eb70: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
eb80: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
eb90: 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20  f(p->out, i>0 ? 
eba0: 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22  "," : " VALUES("
ebb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
ebc0: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
ebd0: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
ebe0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
ebf0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
ec00: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ec10: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
ec20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
ec30: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ec40: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
ec50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ec60: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
ec70: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
ec80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
ec90: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
eca0: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
ecb0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
ecc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ecd0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
ece0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
ecf0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
ed00: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
ed10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ed20: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
ed30: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
ed40: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
ed50: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ed60: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
ed70: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
ed80: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
ed90: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
eda0: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
edb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
edc0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
edd0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
ede0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
edf0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
ee00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75         sqlite3_u
ee10: 69 6e 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20  int64 ur;.      
ee20: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26      memcpy(&ur,&
ee30: 72 2c 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  r,sizeof(r));.  
ee40: 20 20 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d          if( ur==
ee50: 30 78 37 66 66 30 30 30 30 30 30 30 30 30 30 30  0x7ff00000000000
ee60: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
ee70: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ee80: 2d 3e 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b  ->out, "1e999");
ee90: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
eea0: 20 69 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30   if( ur==0xfff00
eeb0: 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b  00000000000LL ){
eec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
eed0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
eee0: 22 2d 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20  "-1e999");.     
eef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ef00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ef10: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
ef20: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
ef30: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
ef40: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ef50: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
ef60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ef70: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
ef80: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
ef90: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
efa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
efb0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
efc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
efd0: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
efe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
eff0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f000: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f010: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f020: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f030: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f040: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f050: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f060: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f070: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f080: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f090: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f0a0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f0b0: 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73  lse if( ShellHas
f0c0: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
f0d0: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
f0e0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
f0f0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f100: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f110: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f120: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
f130: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
f140: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
f150: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
f160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
f170: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f180: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
f190: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f1a0: 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a  case MODE_Quote:
f1b0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   {.      if( azA
f1c0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
f1d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d       if( p->cnt=
f1e0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
f1f0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
f200: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f210: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
f220: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
f230: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
f240: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
f250: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
f260: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b  g(p->out, azCol[
f270: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
f280: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
f290: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
f2a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
f2b0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
f2c0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f2d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f2e0: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
f2f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
f300: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
f310: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
f320: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
f330: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
f340: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
f350: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f360: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
f370: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f380: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f390: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
f3a0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f3b0: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
f3c0: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
f3d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f3e0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f3f0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
f400: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
f410: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f420: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
f430: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f440: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
f450: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f460: 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
f470: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b           char z[
f480: 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  50];.          d
f490: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
f4a0: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
f4b0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
f4c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f4d0: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
f4e0: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
f4f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f500: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
f510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f520: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
f530: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f540: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
f550: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
f560: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
f570: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f580: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
f590: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
f5a0: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
f5b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
f5c0: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
f5d0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
f5e0: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
f5f0: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
f600: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f610: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
f620: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
f630: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f640: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
f650: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f670: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
f680: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f690: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f6a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f6b0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f6c0: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
f6d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f6e0: 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69   case MODE_Ascii
f6f0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
f700: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
f710: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
f720: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f730: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f740: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f750: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f760: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
f770: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
f780: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f790: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
f7a0: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
f7b0: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
f7c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
f7d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f7e0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
f7f0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
f800: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
f810: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
f830: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
f840: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
f850: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f860: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
f870: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75  ator);.        u
f880: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f890: 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20  t,"%s",azArg[i] 
f8a0: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
f8b0: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
f8c0: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
f8d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f8e0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f8f0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
f900: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f910: 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20  e MODE_EQP: {.  
f920: 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
f930: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  , atoi(azArg[0])
f940: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29  , atoi(azArg[1])
f950: 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20  , azArg[3]);.   
f960: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
f980: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
f990: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
f9a0: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53  utine that the S
f9b0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a  QLite library.**
f9c0: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
f9d0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
f9e0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
f9f0: 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28  ic int callback(
fa00: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
fa10: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
fa20: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
fa30: 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65  ){.  /* since we
fa40: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65   don't have type
fa50: 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20   info, call the 
fa60: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77  shell_callback w
fa70: 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
fa80: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65   */.  return she
fa90: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
faa0: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61  , nArg, azArg, a
fab0: 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  zCol, NULL);.}..
fac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
fad0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
fae0: 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ne from sqlite3_
faf0: 65 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65  exec() that appe
fb00: 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75  nds all.** outpu
fb10: 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  t onto the end o
fb20: 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62  f a ShellText ob
fb30: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
fb40: 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75  int captureOutpu
fb50: 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  tCallback(void *
fb60: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
fb70: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
fb80: 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c  ar **az){.  Shel
fb90: 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c  lText *p = (Shel
fba0: 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69  lText*)pArg;.  i
fbb0: 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt i;.  UNUSED_P
fbc0: 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20  ARAMETER(az);.  
fbd0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72  if( azArg==0 ) r
fbe0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fbf0: 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74  ->n ) appendText
fc00: 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66  (p, "|", 0);.  f
fc10: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
fc20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
fc30: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
fc40: 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ",", 0);.    if(
fc50: 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65   azArg[i] ) appe
fc60: 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b  ndText(p, azArg[
fc70: 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  i], 0);.  }.  re
fc80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fc90: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70   Generate an app
fca0: 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53  ropriate SELFTES
fcb0: 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  T table in the m
fcc0: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ain database..*/
fcd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
fce0: 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65  ateSelftestTable
fcf0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
fd00: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
fd10: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
fd20: 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
fd30: 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74  "SAVEPOINT selft
fd40: 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20  est_init;\n".   
fd50: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
fd60: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c  F NOT EXISTS sel
fd70: 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20  ftest(\n".    " 
fd80: 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49   tno INTEGER PRI
fd90: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f  MARY KEY,\n"   /
fda0: 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f  * Test number */
fdb0: 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c  .    "  op TEXT,
fdc0: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
fdd0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f        /* Operato
fde0: 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a  r:  memo run */.
fdf0: 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c      "  cmd TEXT,
fe00: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
fe10: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
fe20: 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61  text */.    "  a
fe30: 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20  ns TEXT\n"      
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe50: 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a  Desired answer *
fe60: 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22  /.    ");".    "
fe70: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
fe80: 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  E [_shell$self](
fe90: 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a  op,cmd,ans);\n".
fea0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
feb0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72   [_shell$self](r
fec0: 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a  owid,op,cmd)\n".
fed0: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f      "  VALUES(co
fee0: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28  alesce((SELECT (
fef0: 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30  max(tno)+100)/10
ff00: 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c   FROM selftest),
ff10: 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  10),\n".    "   
ff20: 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65        'memo','Te
ff30: 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  sts generated by
ff40: 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20   --init');\n".  
ff50: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
ff60: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
ff70: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
ff80: 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  un',\n".    "   
ff90: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
ffa0: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
ffb0: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
ffc0: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
fff0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
10000 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29  RDER BY 2'',224)
10010 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
10020 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
10030 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
10040 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
10050 20 20 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 22 46 52 4f 4d 20            "FROM 
10070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
10080 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b  DER BY 2',224));
10090 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
100a0 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
100b0 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
100c0 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20  ECT 'run',".    
100d0 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
100e0 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
100f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20  LECT * FROM \"' 
10100 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
10110 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d   printf('%w',nam
10120 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e  e) || '\" NOT IN
10130 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c  DEXED'',224))',\
10140 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
10150 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74  sha3_query(print
10160 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f('SELECT * FROM
10170 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45   \"%w\" NOT INDE
10180 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29  XED',name),224))
10190 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  \n".    "  FROM 
101a0 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45  (\n".    "    SE
101b0 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
101c0 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a  qlite_master\n".
101d0 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20      "     WHERE 
101e0 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a  type='table'\n".
101f0 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
10200 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27  name<>'selftest'
10210 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
10220 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
10230 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20  tpage,0)>0\n".  
10240 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20    "  )\n".    " 
10250 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e  ORDER BY name;\n
10260 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10270 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
10280 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
10290 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  S('run','PRAGMA 
102a0 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
102b0 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22  ,'ok');\n".    "
102c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66  INSERT INTO self
102d0 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  test(tno,op,cmd,
102e0 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c  ans)".    "  SEL
102f0 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c  ECT rowid*10,op,
10300 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73  cmd,ans FROM [_s
10310 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20  hell$self];\n". 
10320 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b     "DROP TABLE [
10330 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20  _shell$self];". 
10340 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67     ,0,0,&zErrMsg
10350 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
10360 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
10370 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c  ntf(stderr, "SEL
10380 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61  FTEST initializa
10390 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73  tion failure: %s
103a0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
103b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
103c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
103d0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
103e0 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c  db, "RELEASE sel
103f0 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c  ftest_init",0,0,
10400 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  0);.}.../*.** Se
10410 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
10420 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66  n table field of
10430 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20   the ShellState 
10440 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
10450 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10460 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73  table given.  Es
10470 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63  cape any quote c
10480 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
10490 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  .** table name..
104a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
104b0 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68  et_table_name(Sh
104c0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
104d0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
104e0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
104f0 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68  har cQuote;.  ch
10500 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
10510 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
10520 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
10530 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
10540 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
10550 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
10560 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51  0 ) return;.  cQ
10570 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
10580 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73  (zName);.  n = s
10590 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
105a0 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e    if( cQuote ) n
105b0 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70   += n+2;.  z = p
105c0 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d  ->zDestTable = m
105d0 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
105e0 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c  if( z==0 ) shell
105f0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
10600 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  n = 0;.  if(
10610 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
10620 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72   = cQuote;.  for
10630 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
10640 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
10650 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
10660 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63   if( zName[i]==c
10670 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
10680 20 63 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69   cQuote;.  }.  i
10690 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
106a0 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a  +] = cQuote;.  z
106b0 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  [n] = 0;.}.../*.
106c0 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
106d0 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
106e0 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  t will generate 
106f0 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69  SQL output.  Pri
10700 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  nt.** the result
10710 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d   columns, comma-
10720 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20  separated, on a 
10730 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64  line and then ad
10740 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  d a.** semicolon
10750 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74   terminator to t
10760 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c  he end of that l
10770 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ine..**.** If th
10780 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10790 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61  mns is 1 and tha
107a0 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  t column contain
107b0 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74  s text "--".** t
107c0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65  hen write the se
107d0 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70  micolon on a sep
107e0 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61  arate line.  Tha
107f0 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22  t way, if a.** "
10800 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
10810 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
10820 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
10830 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
10840 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
10850 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
10860 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
10870 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
10880 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
10890 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
108a0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
108b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
108c0 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
108d0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
108e0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
108f0 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
10900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
10910 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
10920 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
10930 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
10940 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10950 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
10960 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
10970 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
10980 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10990 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
109a0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
109b0 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
109c0 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
109d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
109e0 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
109f0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10a00 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10a10 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10a20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10a50 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10a60 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10a70 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10a80 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
10a90 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
10aa0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10ab0 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74  lect);.  nResult
10ac0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10ad0 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29  n_count(pSelect)
10ae0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
10af0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
10b00 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29   if( zFirstRow )
10b10 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
10b20 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
10b30 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20  , zFirstRow);.  
10b40 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20      zFirstRow = 
10b50 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  0;.    }.    z =
10b60 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
10b70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10b80 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
10b90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10ba0 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
10bb0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
10bc0 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
10bd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
10be0 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
10bf0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
10c00 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
10c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10c20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
10c30 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
10c40 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
10c50 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
10c60 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
10c70 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
10c80 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c  tf(p->out, "\n;\
10c90 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
10ca0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10cb0 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b  (p->out, ";\n");
10cc0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10cd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10ce0 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
10cf0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
10d00 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
10d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10d20 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
10d30 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
10d40 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
10d50 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
10d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10d80 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
10d90 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
10da0 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
10db0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
10dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10dd0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
10de0 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
10df0 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
10e00 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
10e10 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
10e20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
10e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10e40 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
10e50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
10e60 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
10e70 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
10e80 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
10e90 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
10ea0 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67  malloc64(nErrMsg
10eb0 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
10ec0 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
10ed0 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
10ee0 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
10ef0 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
10f00 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23  rn zErrMsg;.}..#
10f10 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
10f20 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
10f30 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61   display I/O sta
10f40 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e  ts on Linux usin
10f50 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a  g /proc/PID/io.*
10f60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
10f70 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
10f80 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  s(FILE *out){.  
10f90 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
10fa0 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74   z[200];.  sqlit
10fb0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
10fc0 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63  of(z), z, "/proc
10fd0 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28  /%d/io", getpid(
10fe0 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ));.  in = fopen
10ff0 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  (z, "rb");.  if(
11000 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
11010 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
11020 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e  z, sizeof(z), in
11030 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )!=0 ){.    stat
11040 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
11050 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
11060 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20  ar *zPattern;.  
11070 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11080 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72  zDesc;.    } aTr
11090 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ans[] = {.      
110a0 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20  { "rchar: ",    
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
110c0 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79  ytes received by
110d0 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20   read():" },.   
110e0 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20     { "wchar: ", 
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20   "Bytes sent to 
11110 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a  write():"    },.
11120 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20        { "syscr: 
11130 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11140 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74      "Read() syst
11150 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20  em calls:"      
11160 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
11170 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  w: ",           
11180 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20         "Write() 
11190 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
111a0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72     },.      { "r
111b0 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ead_bytes: ",   
111c0 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
111d0 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61   read from stora
111e0 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b  ge:"  },.      {
111f0 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22   "write_bytes: "
11200 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79  ,            "By
11210 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  tes written to s
11220 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20  torage:" },.    
11230 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77    { "cancelled_w
11240 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
11250 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65  "Cancelled write
11260 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20   bytes:"    },. 
11270 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
11280 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11290 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73  ArraySize(aTrans
112a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
112b0 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
112c0 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
112d0 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rn);.      if( s
112e0 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d  trncmp(aTrans[i]
112f0 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29  .zPattern, z, n)
11300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
11310 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
11320 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61  "%-36s %s", aTra
11330 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b  ns[i].zDesc, &z[
11340 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n]);.        bre
11350 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11360 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
11370 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  n);.}.#endif../*
11380 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69  .** Display a si
11390 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61  ngle line of sta
113a0 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74  tus using 64-bit
113b0 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
113c0 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53  ic void displayS
113d0 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c  tatLine(.  Shell
113e0 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
113f0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c       /* The shel
11400 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  l context */.  c
11410 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
11420 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
11430 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c  l for this one l
11440 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
11450 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20  Format,         
11460 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
11470 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
11480 20 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c   int iStatusCtrl
11490 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
114a0 69 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69  ich status to di
114b0 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  splay */.  int b
114c0 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
114d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
114e0 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
114f0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
11500 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b  int64 iCur = -1;
11510 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
11520 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20   iHiwtr = -1;.  
11530 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b  int i, nPercent;
11540 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30  .  char zLine[20
11550 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0];.  sqlite3_st
11560 61 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74  atus64(iStatusCt
11570 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  rl, &iCur, &iHiw
11580 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
11590 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74  or(i=0, nPercent
115a0 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20  =0; zFormat[i]; 
115b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  i++){.    if( zF
115c0 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20  ormat[i]=='%' ) 
115d0 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a  nPercent++;.  }.
115e0 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31    if( nPercent>1
115f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11600 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
11610 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
11620 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48  Format, iCur, iH
11630 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iwtr);.  }else{.
11640 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11650 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
11660 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
11670 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  at, iHiwtr);.  }
11680 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
11690 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  >out, "%-36s %s\
116a0 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e  n", zLabel, zLin
116b0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  e);.}../*.** Dis
116c0 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
116d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
116e0 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
116f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11710 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
11720 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
11730 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
11740 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11750 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
11760 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11780 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
11790 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
117a0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
117b0 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20   iHiwtr;.  FILE 
117c0 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67  *out;.  if( pArg
117d0 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74  ==0 || pArg->out
117e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
117f0 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75    out = pArg->ou
11800 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t;..  if( pArg->
11810 70 53 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e  pStmt && (pArg->
11820 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a  statsOn & 2) ){.
11830 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c      int nCol, i,
11840 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   x;.    sqlite3_
11850 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41  stmt *pStmt = pA
11860 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63  rg->pStmt;.    c
11870 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20  har z[100];.    
11880 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
11890 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
118a0 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
118b0 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
118c0 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66  d\n", "Number of
118d0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a   output columns:
118e0 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f  ", nCol);.    fo
118f0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11900 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
11910 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11920 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20  of(z),z,"Column 
11930 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20  %d %nname:", i, 
11940 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  &x);.      utf8_
11950 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11960 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11970 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
11980 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e  (pStmt,i));.#ifn
11990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
119a0 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73  DECLTYPE.      s
119b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
119c0 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72  30, z+x, "declar
119d0 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20  ed type:");.    
119e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
119f0 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11a00 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
11a10 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d  mn_decltype(pStm
11a20 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23  t, i));.#endif.#
11a30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11a40 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
11a50 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ATA.      sqlite
11a60 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11a70 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61  +x, "database na
11a80 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11a90 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11aa0 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11ab0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
11ac0 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d  tabase_name(pStm
11ad0 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  t,i));.      sql
11ae0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11af0 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61  , z+x, "table na
11b00 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11b10 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11b20 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11b30 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
11b40 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ble_name(pStmt,i
11b50 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11b60 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11b70 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65  +x, "origin name
11b80 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11b90 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ba0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11bb0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
11bc0 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  in_name(pStmt,i)
11bd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
11be0 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74    }..  displaySt
11bf0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65  atLine(pArg, "Me
11c00 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20  mory Used:",.   
11c10 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11c20 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
11c30 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
11c40 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
11c50 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11c60 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
11c70 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c  f Outstanding Al
11c80 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20  locations:",.   
11c90 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11ca0 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
11cb0 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c  US_MALLOC_COUNT,
11cc0 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20   bReset);.  if( 
11cd0 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  pArg->shellFlgs 
11ce0 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68  & SHFLG_Pagecach
11cf0 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  e ){.    display
11d00 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11d10 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11d20 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20   Pages Used:",. 
11d30 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
11d40 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53   %lld) pages", S
11d50 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
11d60 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65  ECACHE_USED, bRe
11d70 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70  set);.  }.  disp
11d80 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
11d90 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
11da0 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
11db0 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  es:",.     "%lld
11dc0 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11dd0 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11de0 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52  S_PAGECACHE_OVER
11df0 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20  FLOW, bReset);. 
11e00 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11e10 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11e20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20  Allocation:",.  
11e30 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c     "%lld bytes",
11e40 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11e50 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73  ALLOC_SIZE, bRes
11e60 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11e70 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
11e80 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
11e90 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11ea0 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11eb0 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11ec0 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73  CACHE_SIZE, bRes
11ed0 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  et);.#ifdef YYTR
11ee0 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
11ef0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11f00 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65 73  ne(pArg, "Deepes
11f10 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22  t Parser Stack:"
11f20 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
11f30 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
11f40 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53  _STATUS_PARSER_S
11f50 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23  TACK, bReset);.#
11f60 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20  endif..  if( db 
11f70 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d  ){.    if( pArg-
11f80 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
11f90 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a  LG_Lookaside ){.
11fa0 20 20 20 20 20 20 69 48 69 77 74 72 20 3d 20 69        iHiwtr = i
11fb0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Cur = -1;.      
11fc0 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11fd0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11fe0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11ff0 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20  USED,.          
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
12010 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
12020 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
12030 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12040 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
12050 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74   "Lookaside Slot
12060 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  s Used:         
12070 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
12080 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
12090 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74       iCur, iHiwt
120a0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
120b0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
120c0 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
120d0 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20  LOOKASIDE_HIT,. 
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12100 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12110 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12120 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63  (pArg->out, "Suc
12130 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
12140 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20  e attempts:     
12150 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
12160 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
12170 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12180 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12190 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
121a0 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
121b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
121c0 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
121d0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
121e0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
121f0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12200 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12210 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20  s due to size:  
12220 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12230 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
12240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12250 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12260 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12270 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c  OKASIDE_MISS_FUL
12280 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
12290 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
122a0 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
122b0 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
122c0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
122d0 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
122e0 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20  res due to OOM: 
122f0 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
12300 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
12310 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48  r);.    }.    iH
12320 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12340 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12350 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
12360 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
12370 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
12380 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12390 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
123a0 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  r Heap Usage:   
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
123d0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
123e0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
123f0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
12400 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12410 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12420 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
12430 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
12440 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12450 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12460 65 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20  e cache hits:   
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12490 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
124a0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
124b0 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
124c0 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
124d0 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69  S_CACHE_MISS, &i
124e0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
124f0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12500 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12510 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12540 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12550 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12560 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12570 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12580 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26  S_CACHE_WRITE, &
12590 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
125a0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
125b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
125c0 67 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a  ge cache writes:
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125e0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
125f0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
12600 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
12610 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12620 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12630 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20  US_CACHE_SPILL, 
12640 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12650 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
12660 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
12670 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73  age cache spills
12680 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12690 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
126a0 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
126b0 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
126c0 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
126d0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
126e0 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c  TUS_SCHEMA_USED,
126f0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
12700 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
12710 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12720 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70  ut, "Schema Heap
12730 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
12740 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
12750 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
12760 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
12770 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12790 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
127a0 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54  TE_DBSTATUS_STMT
127b0 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
127c0 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
127d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
127e0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65  Arg->out, "State
127f0 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73  ment Heap/Lookas
12800 69 64 65 20 55 73 61 67 65 3a 20 20 20 20 20 20  ide Usage:      
12810 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
12820 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
12830 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d    }..  if( pArg-
12840 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43  >pStmt ){.    iC
12850 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
12860 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
12870 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
12880 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
12890 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20  _STEP,.         
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20        bReset);. 
128c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
128d0 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63  rg->out, "Fullsc
128e0 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  an Steps:       
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12900 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12910 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12920 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12930 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12940 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
12950 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
12960 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12970 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74  ut, "Sort Operat
12980 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12990 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
129a0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
129b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
129c0 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
129d0 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
129e0 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
129f0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
12a00 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12a10 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e  t, "Autoindex In
12a20 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20  serts:          
12a30 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12a40 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12a50 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12a60 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12a70 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12a80 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52  ATUS_VM_STEP, bR
12a90 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12aa0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12ab0 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e   "Virtual Machin
12ac0 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20  e Steps:        
12ad0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12ae0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12af0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12b00 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12b10 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12b20 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52  US_REPREPARE, bR
12b30 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12b40 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12b50 20 22 52 65 70 72 65 70 61 72 65 20 6f 70 65 72   "Reprepare oper
12b60 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
12b70 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12b80 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12b90 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12ba0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12bb0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12bc0 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b  US_RUN, bReset);
12bd0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12be0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62  pArg->out, "Numb
12bf0 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a  er of times run:
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12c20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12c30 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12c40 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12c50 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d  E_STMTSTATUS_MEM
12c60 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
12c70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12c80 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79  rg->out, "Memory
12c90 20 75 73 65 64 20 62 79 20 70 72 65 70 61 72 65   used by prepare
12ca0 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25  d stmt:        %
12cb0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d  d\n", iCur);.  }
12cc0 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
12cd0 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75  __.  displayLinu
12ce0 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f  xIoStats(pArg->o
12cf0 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ut);.#endif..  /
12d00 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20  * Do not remove 
12d10 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61  this machine rea
12d20 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65  dable comment: e
12d30 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75  xtra-stats-outpu
12d40 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74  t-here */..  ret
12d50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12d60 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61  Display scan sta
12d70 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
12d80 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73  id display_scans
12d90 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
12da0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12db0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12dc0 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
12dd0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
12de0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
12df0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12e00 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b  ShellState */.){
12e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12e20 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
12e30 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f  STATUS.  UNUSED_
12e40 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
12e50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12e60 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20  R(pArg);.#else. 
12e70 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78   int i, k, n, mx
12e80 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  ;.  raw_printf(p
12e90 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
12ea0 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d  --- scanstats --
12eb0 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78  ------\n");.  mx
12ec0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b   = 0;.  for(k=0;
12ed0 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20   k<=mx; k++){.  
12ee0 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f    double rEstLoo
12ef0 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72  p = 1.0;.    for
12f00 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b  (i=n=0; 1; i++){
12f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12f20 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70  tmt *p = pArg->p
12f30 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Stmt;.      sqli
12f40 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c  te3_int64 nLoop,
12f50 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64   nVisit;.      d
12f60 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20  ouble rEst;.    
12f70 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20    int iSid;.    
12f80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
12f90 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66  xplain;.      if
12fa0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  ( sqlite3_stmt_s
12fb0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12fc0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12fd0 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
12fe0 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Loop) ){.       
12ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
13010 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
13020 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
13030 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76  TAT_SELECTID, (v
13040 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20  oid*)&iSid);.   
13050 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29     if( iSid>mx )
13060 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20   mx = iSid;.    
13070 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20    if( iSid!=k ) 
13080 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13090 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
130a0 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28      rEstLoop = (
130b0 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20  double)nLoop;.  
130c0 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20        if( k>0 ) 
130d0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
130e0 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
130f0 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d  subquery %d ----
13100 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20  ---\n", k);.    
13110 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
13120 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
13130 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
13140 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
13150 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
13160 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
13170 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13180 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
13190 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
131a0 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
131b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
131c0 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
131d0 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
131e0 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
131f0 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
13200 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  n);.      utf8_p
13210 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
13220 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e   "Loop %2d: %s\n
13230 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b  ", n, zExplain);
13240 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20  .      rEstLoop 
13250 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72  *= rEst;.      r
13260 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
13270 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22  out,.          "
13280 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25           nLoop=%
13290 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c  -8lld nRow=%-8ll
132a0 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20  d estRow=%-8lld 
132b0 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67  estRow/Loop=%-8g
132c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
132d0 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73  Loop, nVisit, (s
132e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45  qlite3_int64)(rE
132f0 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73  stLoop+0.5), rEs
13300 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
13310 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
13320 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
13330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13340 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23  ---------\n");.#
13350 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
13360 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79  arameter azArray
13370 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72   points to a zer
13380 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72  o-terminated arr
13390 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a  ay of strings. z
133a0 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  Str.** points to
133b0 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65   a single nul-te
133c0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
133d0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
133e0 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65   if zStr.** is e
133f0 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20  qual, according 
13400 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20  to strcmp(), to 
13410 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  any of the strin
13420 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  gs in the array.
13430 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
13440 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
13450 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e  tatic int str_in
13460 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61  _array(const cha
13470 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
13480 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a  har **azArray){.
13490 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
134a0 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20  =0; azArray[i]; 
134b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
134c0 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a  =strcmp(zStr, az
134d0 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75  Array[i]) ) retu
134e0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
134f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
13500 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  f compiled state
13510 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72  ment pSql appear
13520 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41  s to be an EXPLA
13530 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c  IN statement, al
13540 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f  locate.** and po
13550 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c  pulate the Shell
13560 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d  State.aiIndent[]
13570 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
13580 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
13590 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
135a0 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
135b0 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
135c0 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
135d0 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65  e indenting rule
135e0 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
135f0 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78   * For each "Nex
13600 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65  t", "Prev", "VNe
13610 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69  xt" or "VPrev" i
13620 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65  nstruction, inde
13630 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20  nt.**       all 
13640 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63  opcodes that occ
13650 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  ur between the p
13660 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  2 jump destinati
13670 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  on and the opcod
13680 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c  e.**       itsel
13690 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  f by 2 spaces..*
136a0 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
136b0 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74  ach "Goto", if t
136c0 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he jump destinat
136d0 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69  ion is earlier i
136e0 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  n the program.**
136f0 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20         and ends 
13700 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20  on one of:.**   
13710 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65         Yield  Se
13720 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f  ekGt  SeekLt  Ro
13730 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64  wSetRead  Rewind
13740 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20  .**       or if 
13750 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  the P1 parameter
13760 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20   is one instead 
13770 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20  of zero,.**     
13780 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c    then indent al
13790 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65  l opcodes betwee
137a0 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e  n the earlier in
137b0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  struction.**    
137c0 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79     and "Goto" by
137d0 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74   2 spaces..*/.st
137e0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
137f0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53  n_data_prepare(S
13800 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
13810 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
13820 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
13830 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
13840 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
13850 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
13860 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
13870 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
13880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13890 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
138a0 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
138b0 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69  N */.  int *abYi
138c0 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
138d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
138e0 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69  f op is an OP_Yi
138f0 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  eld */.  int nAl
13900 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
13910 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
13920 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d  cated size of p-
13930 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59  >aiIndent[], abY
13940 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ield */.  int iO
13950 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13970 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  ex of operation 
13980 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  in p->aiIndent[]
13990 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
139a0 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20  r *azNext[] = { 
139b0 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
139c0 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22  "VPrev", "VNext"
139d0 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20  , "SorterNext", 
139e0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
139f0 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b  r *azYield[] = {
13a00 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c   "Yield", "SeekL
13a10 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52  T", "SeekGT", "R
13a20 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20  owSetRead",.    
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 20 20 20 20 20 22 52 65 77 69 6e 64 22          "Rewind"
13a50 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
13a60 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20  har *azGoto[] = 
13a70 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a  { "Goto", 0 };..
13a80 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75    /* Try to figu
13a90 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
13aa0 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c  s really an EXPL
13ab0 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  AIN statement. I
13ac0 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e  f this.  ** cann
13ad0 6f 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20  ot be verified, 
13ae0 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a  return early.  *
13af0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
13b00 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71  column_count(pSq
13b10 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e  l)!=8 ){.    p->
13b20 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
13b30 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13b40 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
13b50 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69  3_sql(pSql);.  i
13b60 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
13b70 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71  urn;.  for(z=zSq
13b80 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  l; *z==' ' || *z
13b90 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\t' || *z=='\
13ba0 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c  n' || *z=='\f' |
13bb0 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29  | *z=='\r'; z++)
13bc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
13bd0 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70  strnicmp(z, "exp
13be0 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20  lain", 7) ){.   
13bf0 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
13c00 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
13c10 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d  .  }..  for(iOp=
13c20 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
13c30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
13c40 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69  ); iOp++){.    i
13c50 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41  nt i;.    int iA
13c60 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ddr = sqlite3_co
13c70 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30  lumn_int(pSql, 0
13c80 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
13c90 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
13ca0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
13cb0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
13cc0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  1);..    /* Set 
13cd0 70 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65  p2 to the P2 fie
13ce0 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
13cf0 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20  t opcode. Then, 
13d00 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20  assuming that.  
13d10 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e    ** p2 is an in
13d20 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
13d30 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20  s, set variable 
13d40 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65  p2op to the inde
13d50 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  x of that.    **
13d60 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
13d70 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61  the aiIndent[] a
13d80 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f  rray. p2 and p2o
13d90 70 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  p may be differe
13da0 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  nt if.    ** the
13db0 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63   current instruc
13dc0 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
13dd0 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65  a sub-program ge
13de0 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20  nerated by an.  
13df0 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72    ** SQL trigger
13e00 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e   or foreign key.
13e10 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20    */.    int p2 
13e20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
13e30 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  _int(pSql, 3);. 
13e40 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70     int p2op = (p
13e50 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29  2 + (iOp-iAddr))
13e60 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
13e70 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61  he p->aiIndent a
13e80 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64  rray as required
13e90 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e   */.    if( iOp>
13ea0 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
13eb0 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20   if( iOp==0 ){. 
13ec0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72         /* Do fur
13ed0 74 68 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e  ther verfication
13ee0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 78   that this is ex
13ef0 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41  plain output.  A
13f00 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20 20  bort if.        
13f10 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a  ** it is not */.
13f20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
13f30 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61  onst char *expla
13f40 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  inCols[] = {.   
13f50 20 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20          "addr", 
13f60 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
13f70 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
13f80 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
13f90 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  " };.        int
13fa0 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   jj;.        for
13fb0 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53  (jj=0; jj<ArrayS
13fc0 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29  ize(explainCols)
13fd0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
13fe0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71     if( strcmp(sq
13ff0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
14000 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61  e(pSql,jj),expla
14010 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29  inCols[jj])!=0 )
14020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14030 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
14040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
14050 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
14060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14070 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
14080 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14090 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f     }.      nAllo
140a0 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  c += 100;.      
140b0 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69  p->aiIndent = (i
140c0 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
140d0 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e  loc64(p->aiInden
140e0 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t, nAlloc*sizeof
140f0 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66  (int));.      if
14100 28 20 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30  ( p->aiIndent==0
14110 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
14120 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20  memory();.      
14130 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29  abYield = (int*)
14140 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
14150 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f  4(abYield, nAllo
14160 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
14170 20 20 20 20 20 20 69 66 28 20 61 62 59 69 65 6c        if( abYiel
14180 64 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  d==0 ) shell_out
14190 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
141a0 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b    }.    abYield[
141b0 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72  iOp] = str_in_ar
141c0 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64  ray(zOp, azYield
141d0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  );.    p->aiInde
141e0 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20  nt[iOp] = 0;.   
141f0 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f   p->nIndent = iO
14200 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74  p+1;..    if( st
14210 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
14220 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20  azNext) ){.     
14230 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
14240 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
14250 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
14260 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f    }.    if( str_
14270 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
14280 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d  Goto) && p2op<p-
14290 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26  >nIndent.     &&
142a0 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20   (abYield[p2op] 
142b0 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
142c0 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a  n_int(pSql, 2)).
142d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72      ){.      for
142e0 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
142f0 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
14300 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
14310 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e    }..  p->iInden
14320 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14330 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a  _free(abYield);.
14340 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
14350 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pSql);.}../*.** 
14360 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20 61  Free the array a
14370 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c  llocated by expl
14380 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
14390 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
143a0 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
143b0 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74  delete(ShellStat
143c0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
143d0 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e  _free(p->aiInden
143e0 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e  t);.  p->aiInden
143f0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64  t = 0;.  p->nInd
14400 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49  ent = 0;.  p->iI
14410 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ndent = 0;.}../*
14420 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20  .** Disable and 
14430 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72  restore .wheretr
14440 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74  ace and .selectt
14450 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a  race settings..*
14460 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
14470 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14480 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14490 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
144a0 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
144b0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
144c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
144d0 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
144e0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
144f0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
14500 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
14510 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
14520 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
14530 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14540 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
14550 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
14560 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64  ndif.static void
14570 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
14580 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29  race_modes(void)
14590 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
145a0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
145b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
145c0 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
145d0 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74 54  ).  savedSelectT
145e0 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65  race = sqlite3Se
145f0 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c  lectTrace;.  sql
14600 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
14610 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
14620 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
14630 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
14640 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
14650 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 61 76  HERETRACE).  sav
14660 65 64 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  edWhereTrace = s
14670 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14680 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
14690 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
146a0 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f.}.static void 
146b0 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
146c0 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b  ace_modes(void){
146d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
146e0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
146f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
14700 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
14710 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14720 54 72 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c  Trace = savedSel
14730 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
14740 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
14750 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
14760 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
14770 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
14780 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
14790 61 63 65 20 3d 20 73 61 76 65 64 57 68 65 72 65  ace = savedWhere
147a0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Trace;.#endif.}.
147b0 0a 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 54  ./* Create the T
147c0 45 4d 50 20 74 61 62 6c 65 20 75 73 65 64 20 74  EMP table used t
147d0 6f 20 73 74 6f 72 65 20 70 61 72 61 6d 65 74 65  o store paramete
147e0 72 20 62 69 6e 64 69 6e 67 73 20 2a 2f 0a 73 74  r bindings */.st
147f0 61 74 69 63 20 76 6f 69 64 20 62 69 6e 64 5f 74  atic void bind_t
14800 61 62 6c 65 5f 69 6e 69 74 28 53 68 65 6c 6c 53  able_init(ShellS
14810 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
14820 77 72 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  wrSchema = 0;.  
14830 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
14840 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  g(p->db, SQLITE_
14850 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c  DBCONFIG_WRITABL
14860 45 5f 53 43 48 45 4d 41 2c 20 2d 31 2c 20 26 77  E_SCHEMA, -1, &w
14870 72 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  rSchema);.  sqli
14880 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d  te3_db_config(p-
14890 3e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  >db, SQLITE_DBCO
148a0 4e 46 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43  NFIG_WRITABLE_SC
148b0 48 45 4d 41 2c 20 31 2c 20 30 29 3b 0a 20 20 73  HEMA, 1, 0);.  s
148c0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
148d0 62 2c 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  b,.    "CREATE T
148e0 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
148f0 54 53 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 70  TS temp.sqlite_p
14900 61 72 61 6d 65 74 65 72 73 28 5c 6e 22 0a 20 20  arameters(\n".  
14910 20 20 22 20 20 6b 65 79 20 54 45 58 54 20 50 52    "  key TEXT PR
14920 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20  IMARY KEY,\n".  
14930 20 20 22 20 20 76 61 6c 75 65 20 41 4e 59 5c 6e    "  value ANY\n
14940 22 0a 20 20 20 20 22 29 20 57 49 54 48 4f 55 54  ".    ") WITHOUT
14950 20 52 4f 57 49 44 3b 22 2c 0a 20 20 20 20 30 2c   ROWID;",.    0,
14960 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
14970 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64  3_db_config(p->d
14980 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
14990 49 47 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45  IG_WRITABLE_SCHE
149a0 4d 41 2c 20 77 72 53 63 68 65 6d 61 2c 20 30 29  MA, wrSchema, 0)
149b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20  ;.}../*.** Bind 
149c0 70 61 72 61 6d 65 74 65 72 73 20 6f 6e 20 61 20  parameters on a 
149d0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
149e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  nt..**.** Parame
149f0 74 65 72 20 62 69 6e 64 69 6e 67 73 20 61 72 65  ter bindings are
14a00 20 74 61 6b 65 6e 20 66 72 6f 6d 20 61 20 54 45   taken from a TE
14a10 4d 50 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  MP table of the 
14a20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43  form:.**.**    C
14a30 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
14a40 20 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65   sqlite_paramete
14a50 72 73 28 6b 65 79 20 54 45 58 54 20 50 52 49 4d  rs(key TEXT PRIM
14a60 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 29 0a  ARY KEY, value).
14a70 2a 2a 20 20 20 20 57 49 54 48 4f 55 54 20 52 4f  **    WITHOUT RO
14a80 57 49 44 3b 0a 2a 2a 0a 2a 2a 20 4e 6f 20 62 69  WID;.**.** No bi
14a90 6e 64 69 6e 67 73 20 6f 63 63 75 72 20 69 66 20  ndings occur if 
14aa0 74 68 69 73 20 74 61 62 6c 65 20 64 6f 65 73 20  this table does 
14ab0 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
14ac0 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 65  special characte
14ad0 72 20 27 24 27 0a 2a 2a 20 69 73 20 69 6e 63 6c  r '$'.** is incl
14ae0 75 64 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  uded in the tabl
14af0 65 20 6e 61 6d 65 20 74 6f 20 68 65 6c 70 20 70  e name to help p
14b00 72 65 76 65 6e 74 20 63 6f 6c 6c 69 73 69 6f 6e  revent collision
14b10 73 20 77 69 74 68 20 61 63 74 75 61 6c 20 74 61  s with actual ta
14b20 62 6c 65 73 2e 0a 2a 2a 20 54 68 65 20 74 61 62  bles..** The tab
14b30 6c 65 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68  le must be in th
14b40 65 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  e TEMP schema..*
14b50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69  /.static void bi
14b60 6e 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  nd_prepared_stmt
14b70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72  (ShellState *pAr
14b80 67 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  g, sqlite3_stmt 
14b90 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 6e  *pStmt){.  int n
14ba0 56 61 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Var;.  int i;.  
14bb0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
14bc0 33 5f 73 74 6d 74 20 2a 70 51 20 3d 20 30 3b 0a  3_stmt *pQ = 0;.
14bd0 0a 20 20 6e 56 61 72 20 3d 20 73 71 6c 69 74 65  .  nVar = sqlite
14be0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
14bf0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
14c00 20 69 66 28 20 6e 56 61 72 3d 3d 30 20 29 20 72   if( nVar==0 ) r
14c10 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 74 68 69  eturn;  /* Nothi
14c20 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 66  ng to do */.  if
14c30 28 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  ( sqlite3_table_
14c40 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
14c50 70 41 72 67 2d 3e 64 62 2c 20 22 54 45 4d 50 22  pArg->db, "TEMP"
14c60 2c 20 22 73 71 6c 69 74 65 5f 70 61 72 61 6d 65  , "sqlite_parame
14c70 74 65 72 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ters",.         
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 20 20 20 20 22 6b 65 79 22             "key"
14ca0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 0, 0, 0, 0, 0)
14cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14cc0 20 20 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61     return; /* Pa
14cd0 72 61 6d 65 74 65 72 20 74 61 62 6c 65 20 64 6f  rameter table do
14ce0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 2a 2f 0a  es not exist */.
14cf0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14d00 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 41  e3_prepare_v2(pA
14d10 72 67 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  rg->db,.        
14d20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
14d30 46 52 4f 4d 20 74 65 6d 70 2e 73 71 6c 69 74 65  FROM temp.sqlite
14d40 5f 70 61 72 61 6d 65 74 65 72 73 22 0a 20 20 20  _parameters".   
14d50 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6b         " WHERE k
14d60 65 79 3d 3f 31 22 2c 20 2d 31 2c 20 26 70 51 2c  ey=?1", -1, &pQ,
14d70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 7c 7c   0);.  if( rc ||
14d80 20 70 51 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   pQ==0 ) return;
14d90 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
14da0 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Var; i++){.    c
14db0 68 61 72 20 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20  har zNum[30];.  
14dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
14dd0 61 72 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  ar = sqlite3_bin
14de0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
14df0 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
14e00 69 66 28 20 7a 56 61 72 3d 3d 30 20 29 7b 0a 20  if( zVar==0 ){. 
14e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
14e20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4e 75  rintf(sizeof(zNu
14e30 6d 29 2c 7a 4e 75 6d 2c 22 3f 25 64 22 2c 69 29  m),zNum,"?%d",i)
14e40 3b 0a 20 20 20 20 20 20 7a 56 61 72 20 3d 20 7a  ;.      zVar = z
14e50 4e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Num;.    }.    s
14e60 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
14e70 28 70 51 2c 20 31 2c 20 7a 56 61 72 2c 20 2d 31  (pQ, 1, zVar, -1
14e80 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14e90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14ea0 33 5f 73 74 65 70 28 70 51 29 3d 3d 53 51 4c 49  3_step(pQ)==SQLI
14eb0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
14ec0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c  sqlite3_bind_val
14ed0 75 65 28 70 53 74 6d 74 2c 20 69 2c 20 73 71 6c  ue(pStmt, i, sql
14ee0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
14ef0 65 28 70 51 2c 20 30 29 29 3b 0a 20 20 20 20 7d  e(pQ, 0));.    }
14f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
14f10 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
14f20 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  tmt, i);.    }. 
14f30 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
14f40 28 70 51 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (pQ);.  }.  sqli
14f50 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 29  te3_finalize(pQ)
14f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
14f70 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
14f80 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
14f90 69 64 20 65 78 65 63 5f 70 72 65 70 61 72 65 64  id exec_prepared
14fa0 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74  _stmt(.  ShellSt
14fb0 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
14fe0 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61  nter to ShellSta
14ff0 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
15000 73 74 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20  stmt *pStmt     
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
15030 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29  ment to run */.)
15040 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
15050 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69  * perform the fi
15060 72 73 74 20 73 74 65 70 2e 20 20 74 68 69 73 20  rst step.  this 
15070 77 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20  will tell us if 
15080 77 65 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72  we.  ** have a r
15090 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74  esult set or not
150a0 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74   and how wide it
150b0 20 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d   is..  */.  rc =
150c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
150d0 74 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65  tmt);.  /* if we
150e0 20 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73   have a result s
150f0 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53  et... */.  if( S
15100 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
15110 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ){.    /* alloca
15120 74 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c  te space for col
15130 20 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65   name ptr, value
15140 20 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a   ptr, and type *
15150 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  /.    int nCol =
15160 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15170 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
15180 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
15190 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
151a0 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63  (3*nCol*sizeof(c
151b0 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29  onst char*) + 1)
151c0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 61 74 61  ;.    if( !pData
151d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
151e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
151f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
15200 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63  ar **azCols = (c
15210 68 61 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20  har **)pData;   
15220 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72     /* Names of r
15230 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
15240 0a 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  .      char **az
15250 56 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e  Vals = &azCols[n
15260 43 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52  Col];       /* R
15270 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
15280 69 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28  int *aiTypes = (
15290 69 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43  int *)&azVals[nC
152a0 6f 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74  ol]; /* Result t
152b0 79 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ypes */.      in
152c0 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73  t i, x;.      as
152d0 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29  sert(sizeof(int)
152e0 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20   <= sizeof(char 
152f0 2a 29 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61  *));.      /* sa
15300 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63  ve off ptrs to c
15310 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
15320 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15330 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
15340 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20      azCols[i] = 
15350 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
15360 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
15370 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, i);.      }. 
15380 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
15390 20 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20   /* extract the 
153a0 64 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79  data and data ty
153b0 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  pes */.        f
153c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
153d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
153e0 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d  aiTypes[i] = x =
153f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15400 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  type(pStmt, i);.
15410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3d            if( x=
15420 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
15430 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d  pArg && pArg->cM
15440 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74  ode==MODE_Insert
15450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15460 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a  azVals[i] = "";.
15470 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
15480 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56  .            azV
15490 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29  als[i] = (char*)
154a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
154b0 65 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ext(pStmt, i);. 
154c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
154d0 20 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73       if( !azVals
154e0 5b 69 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b  [i] && (aiTypes[
154f0 69 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]!=SQLITE_NULL)
15500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15520 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
15530 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f  reak; /* from fo
15540 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  r */.          }
15550 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e  .        } /* en
15560 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  d for */..      
15570 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64    /* if data and
15580 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64   types extracted
15590 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e   successfully...
155a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
155b0 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63  SQLITE_ROW == rc
155c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
155d0 20 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69   call the suppli
155e0 65 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ed callback with
155f0 20 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20   the result row 
15600 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20  data */.        
15610 20 20 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c    if( shell_call
15620 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c  back(pArg, nCol,
15630 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c   azVals, azCols,
15640 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20   aiTypes) ){.   
15650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15660 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
15670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
15690 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
156a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
156b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
156c0 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
156d0 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20  OW == rc );.    
156e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
156f0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
15700 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
15710 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15720 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ABLE./*.** This 
15730 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15740 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51  ed to process SQ
15750 4c 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75  L if the previou
15760 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a  s shell command.
15770 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74 22  ** was ".expert"
15780 2e 20 49 74 20 70 61 73 73 65 73 20 74 68 65 20  . It passes the 
15790 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  SQL in the secon
157a0 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63  d argument direc
157b0 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71  tly to.** the sq
157c0 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65  lite3expert obje
157d0 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ct..**.** If suc
157e0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
157f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15800 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
15810 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
15820 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
15830 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
15840 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
15850 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15860 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
15870 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
15880 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
15890 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
158a0 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
158b0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
158c0 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
158d0 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
158e0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
158f0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 48  atic int expertH
15900 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c  andleSQL(.  Shel
15910 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
15920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15930 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  Sql, .  char **p
15940 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74  zErr.){.  assert
15950 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
15960 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73  .pExpert );.  as
15970 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c  sert( pzErr==0 |
15980 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20  | *pzErr==0 );. 
15990 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
159a0 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74  expert_sql(pStat
159b0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
159c0 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b  t, zSql, pzErr);
159d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
159e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
159f0 64 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65  d either to sile
15a00 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68  ntly clean up th
15a10 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61  e object.** crea
15a20 74 65 64 20 62 79 20 74 68 65 20 22 2e 65 78 70  ted by the ".exp
15a30 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66  ert" command (if
15a40 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72   bCancel==1), or
15a50 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a   to generate a .
15a60 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69  ** report from i
15a70 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e  t and then clean
15a80 20 69 74 20 75 70 20 28 69 66 20 62 43 61 6e 63   it up (if bCanc
15a90 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  el==0)..**.** If
15aa0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
15ab0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15ac0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
15ad0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
15ae0 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  * code. In this 
15af0 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d  case, (*pzErr) m
15b00 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
15b10 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
15b20 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20  ontaining.** an 
15b30 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
15b40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
15b50 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
15b60 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
15b70 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
15b80 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69  ntually free thi
15b90 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
15ba0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
15bb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
15bc0 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65  ertFinish(.  She
15bd0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
15be0 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a  .  int bCancel,.
15bf0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
15c00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15c10 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
15c20 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74  3expert *p = pSt
15c30 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
15c40 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ert;.  assert( p
15c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43   );.  assert( bC
15c60 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d  ancel || pzErr==
15c70 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29  0 || *pzErr==0 )
15c80 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d  ;.  if( bCancel=
15c90 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
15ca0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
15cb0 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62  t;.    int bVerb
15cc0 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78  ose = pState->ex
15cd0 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a  pert.bVerbose;..
15ce0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15cf0 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28  _expert_analyze(
15d00 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69  p, pzErr);.    i
15d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15d20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51   ){.      int nQ
15d30 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65  uery = sqlite3_e
15d40 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a  xpert_count(p);.
15d50 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20        int i;..  
15d60 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
15d70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
15d80 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20  t char *zCand = 
15d90 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15da0 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54  eport(p,0,EXPERT
15db0 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54  _REPORT_CANDIDAT
15dc0 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  ES);.        raw
15dd0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
15de0 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d   Candidates ----
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20  ---------\n");. 
15e10 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
15e20 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  f(out, "%s\n", z
15e30 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cand);.      }. 
15e40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15e50 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20  nQuery; i++){.  
15e60 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15e70 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
15e80 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70  _expert_report(p
15e90 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f  , i, EXPERT_REPO
15ea0 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20  RT_SQL);.       
15eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
15ec0 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  x = sqlite3_expe
15ed0 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
15ee0 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e  EXPERT_REPORT_IN
15ef0 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20  DEXES);.        
15f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50  const char *zEQP
15f10 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
15f20 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45  t_report(p, i, E
15f30 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41  XPERT_REPORT_PLA
15f40 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  N);.        if( 
15f50 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d  zIdx==0 ) zIdx =
15f60 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65   "(no new indexe
15f70 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69  s)\n";.        i
15f80 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
15f90 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
15fa0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65  ntf(out, "-- Que
15fb0 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ry %d ----------
15fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15fd0 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a  ------\n",i+1);.
15fe0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
15ff0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c  intf(out, "%s\n\
16000 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
16010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
16020 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
16030 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20  \n", zIdx);.    
16040 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
16050 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50  ut, "%s\n", zEQP
16060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16070 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
16080 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29  xpert_destroy(p)
16090 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65  ;.  pState->expe
160a0 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a  rt.pExpert = 0;.
160b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
160c0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
160d0 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74  tion of ".expert
160e0 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
160f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
16100 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20  ertDotCommand(. 
16110 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
16120 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
16130 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
16140 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
16150 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
16180 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
16190 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
161a0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
161d0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
161e0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  [] */.){.  int r
161f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16200 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
16210 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
16220 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20  iSample = 0;..  
16230 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e  assert( pState->
16240 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
16250 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
16260 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30  State->expert, 0
16270 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49  , sizeof(ExpertI
16280 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  nfo));..  for(i=
16290 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
162a0 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29   && i<nArg; i++)
162b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
162c0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e  azArg[i];.    in
162d0 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  t n;.    if( z[0
162e0 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='-' && z[1]==
162f0 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e  '-' ) z++;.    n
16300 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
16310 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20      if( n>=2 && 
16320 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  0==strncmp(z, "-
16330 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a  verbose", n) ){.
16340 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
16350 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20  pert.bVerbose = 
16360 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
16370 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d  e if( n>=2 && 0=
16380 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61  =strncmp(z, "-sa
16390 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  mple", n) ){.   
163a0 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d     if( i==(nArg-
163b0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  1) ){.        ra
163c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
163d0 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
163e0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
163f0 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
16400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
16410 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
16420 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c  {.        iSampl
16430 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  e = (int)integer
16440 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d  Value(azArg[++i]
16450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
16460 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d  Sample<0 || iSam
16470 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  ple>100 ){.     
16480 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
16490 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f  stderr, "value o
164a0 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c  ut of range: %s\
164b0 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
164c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
164d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
164e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
164f0 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
16500 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16510 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
16520 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
16530 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
16540 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16550 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
16560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16570 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
16580 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74  .pExpert = sqlit
16590 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53  e3_expert_new(pS
165a0 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29  tate->db, &zErr)
165b0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65  ;.    if( pState
165c0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
165d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
165e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
165f0 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f  "sqlite3_expert_
16600 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  new: %s\n", zErr
16610 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
16620 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
16640 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66  ite3_expert_conf
16650 69 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 53  ig(.          pS
16660 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16670 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e  pert, EXPERT_CON
16680 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d  FIG_SAMPLE, iSam
16690 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ple.      );.   
166a0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
166b0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
166c0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
166d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
166e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75   */../*.** Execu
166f0 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
16700 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
16710 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61  nts.  Print.** a
16720 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63  ny result rows/c
16730 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67  olumns depending
16740 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
16750 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20  mode.** set via 
16760 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
16770 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
16780 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
16790 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
167a0 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
167b0 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xec().** functio
167c0 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
167d0 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
167e0 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a  ferent callback.
167f0 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
16800 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
16810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
16820 6c 6c 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c  ll_exec(.  Shell
16830 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16860 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
16870 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16880 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
168a0 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61  SQL to be evalua
168b0 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ted */.  char **
168c0 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
168f0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
16900 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
16910 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
16920 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
16930 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
16940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16950 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
16960 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
16970 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a  e */.  int rc2;.
16980 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
16990 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20  eftover;        
169a0 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70    /* Tail of unp
169b0 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a  rocessed SQL */.
169c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
169d0 70 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  pArg->db;..  if(
169e0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
169f0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c   *pzErrMsg = NUL
16a00 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  L;.  }..#ifndef 
16a10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
16a20 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
16a30 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  Arg->expert.pExp
16a40 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ert ){.    rc = 
16a50 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28  expertHandleSQL(
16a60 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72  pArg, zSql, pzEr
16a70 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
16a80 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70  n expertFinish(p
16a90 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45  Arg, (rc!=SQLITE
16aa0 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b  _OK), pzErrMsg);
16ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77  .  }.#endif..  w
16ac0 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26  hile( zSql[0] &&
16ad0 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72   (SQLITE_OK == r
16ae0 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  c) ){.    static
16af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
16b00 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20  mtSql;.    rc = 
16b10 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
16b20 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
16b30 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f   &pStmt, &zLefto
16b40 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ver);.    if( SQ
16b50 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b  LITE_OK != rc ){
16b60 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72  .      if( pzErr
16b70 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
16b80 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
16b90 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
16ba0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
16bb0 20 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74        if( !pStmt
16bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
16bd0 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
16be0 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69  a comment or whi
16bf0 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te-space */.    
16c00 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
16c10 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
16c20 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
16c30 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
16c40 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
16c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c60 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74  zStmtSql = sqlit
16c70 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
16c80 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71       if( zStmtSq
16c90 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20  l==0 ) zStmtSql 
16ca0 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c  = "";.      whil
16cb0 65 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74  e( IsSpace(zStmt
16cc0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53  Sql[0]) ) zStmtS
16cd0 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ql++;..      /* 
16ce0 73 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65  save off the pre
16cf0 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68  pared statment h
16d00 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20  andle and reset 
16d10 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
16d20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
16d30 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
16d40 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
16d50 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20      pArg->cnt = 
16d60 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
16d70 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71    /* echo the sq
16d80 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65  l statement if e
16d90 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cho on */.      
16da0 69 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c  if( pArg && Shel
16db0 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53  lHasFlag(pArg, S
16dc0 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20  HFLG_Echo) ){.  
16dd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
16de0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73  f(pArg->out, "%s
16df0 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20  \n", zStmtSql ? 
16e00 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29  zStmtSql : zSql)
16e10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16e20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50   /* Show the EXP
16e30 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
16e40 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f  if .eqp is on */
16e50 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
16e60 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  && pArg->autoEQP
16e70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   && sqlite3_stmt
16e80 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74 6d 74  _isexplain(pStmt
16e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
16ea0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45  sqlite3_stmt *pE
16eb0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
16ec0 63 68 61 72 20 2a 7a 45 51 50 3b 0a 20 20 20 20  char *zEQP;.    
16ed0 20 20 20 20 69 6e 74 20 74 72 69 67 67 65 72 45      int triggerE
16ee0 51 50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  QP = 0;.        
16ef0 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72  disable_debug_tr
16f00 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20  ace_modes();.   
16f10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
16f20 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54  config(db, SQLIT
16f30 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47  E_DBCONFIG_TRIGG
16f40 45 52 5f 45 51 50 2c 20 2d 31 2c 20 26 74 72 69  ER_EQP, -1, &tri
16f50 67 67 65 72 45 51 50 29 3b 0a 20 20 20 20 20 20  ggerEQP);.      
16f60 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
16f70 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69  EQP>=AUTOEQP_tri
16f80 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gger ){.        
16f90 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
16fa0 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
16fb0 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
16fc0 45 51 50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  EQP, 1, 0);.    
16fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 45      }.        zE
16fe0 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  QP = sqlite3_mpr
16ff0 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55  intf("EXPLAIN QU
17000 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53  ERY PLAN %s", zS
17010 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  tmtSql);.       
17020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
17030 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
17040 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
17050 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
17060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
17080 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
17090 28 70 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49  (pExplain)==SQLI
170a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
170b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
170c0 20 2a 7a 45 51 50 4c 69 6e 65 20 3d 20 28 63 6f   *zEQPLine = (co
170d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
170e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
170f0 78 70 6c 61 69 6e 2c 33 29 3b 0a 20 20 20 20 20  xplain,3);.     
17100 20 20 20 20 20 20 20 69 6e 74 20 69 45 71 70 49         int iEqpI
17110 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
17120 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
17130 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
17140 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 20 3d   int iParentId =
17150 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
17160 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29  int(pExplain, 1)
17170 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
17180 28 20 7a 45 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27  ( zEQPLine[0]=='
17190 2d 27 20 29 20 65 71 70 5f 72 65 6e 64 65 72 28  -' ) eqp_render(
171a0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  pArg);.         
171b0 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 41     eqp_append(pA
171c0 72 67 2c 20 69 45 71 70 49 64 2c 20 69 50 61 72  rg, iEqpId, iPar
171d0 65 6e 74 49 64 2c 20 7a 45 51 50 4c 69 6e 65 29  entId, zEQPLine)
171e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
171f0 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64          eqp_rend
17200 65 72 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20  er(pArg);.      
17210 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
17220 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
17230 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
17240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51  sqlite3_free(zEQ
17250 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  P);.        if( 
17260 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41  pArg->autoEQP>=A
17270 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b 0a 20  UTOEQP_full ){. 
17280 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
17290 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e 20 66   do an EXPLAIN f
172a0 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22 20 6d  or ".eqp full" m
172b0 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ode */.         
172c0 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f   zEQP = sqlite3_
172d0 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
172e0 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b   %s", zStmtSql);
172f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17300 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
17310 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c  v2(db, zEQP, -1,
17320 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
17330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17350 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d             pArg-
17360 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78  >cMode = MODE_Ex
17370 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20  plain;.         
17380 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
17390 70 72 65 70 61 72 65 28 70 41 72 67 2c 20 70 45  prepare(pArg, pE
173a0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
173b0 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
173c0 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 45  ed_stmt(pArg, pE
173d0 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
173e0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
173f0 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
17400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17410 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
17420 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
17430 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17440 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
17450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17460 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
17470 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 74 72 69  EQP>=AUTOEQP_tri
17480 67 67 65 72 20 26 26 20 74 72 69 67 67 65 72 45  gger && triggerE
17490 51 50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  QP==0 ){.       
174a0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f     sqlite3_db_co
174b0 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
174c0 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52  DBCONFIG_TRIGGER
174d0 5f 45 51 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _EQP, 0, 0);.   
174e0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 72 65 70         /* Reprep
174f0 61 72 65 20 70 53 74 6d 74 20 62 65 66 6f 72 65  are pStmt before
17500 20 72 65 61 63 74 69 76 69 6e 67 20 74 72 61 63   reactiving trac
17510 65 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 20 20 20  e modes */.     
17520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
17530 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
17540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17550 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
17560 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
17570 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
17580 66 28 20 70 41 72 67 20 29 20 70 41 72 67 2d 3e  f( pArg ) pArg->
17590 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  pStmt = pStmt;. 
175a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
175b0 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74   restore_debug_t
175c0 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
175d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
175e0 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
175f0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70   pArg->cMode = p
17600 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  Arg->mode;.     
17610 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
17620 6f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  oExplain ){.    
17630 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17640 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e  3_stmt_isexplain
17650 28 70 53 74 6d 74 29 3d 3d 31 20 29 7b 0a 20 20  (pStmt)==1 ){.  
17660 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
17670 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
17680 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lain;.          
17690 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
176a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
176b0 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 32  xplain(pStmt)==2
176c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
176d0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
176e0 44 45 5f 45 51 50 3b 0a 20 20 20 20 20 20 20 20  DE_EQP;.        
176f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
17700 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
17710 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65 6e   shell is curren
17720 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69 6e  tly in ".explain
17730 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20 74  " mode, gather t
17740 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20 20  he extra.       
17750 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72 65   ** data require
17760 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74 73  d to add indents
17770 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 2a   to the output.*
17780 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  /.        if( pA
17790 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f  rg->cMode==MODE_
177a0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
177b0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
177c0 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20  a_prepare(pArg, 
177d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
177e0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
177f0 20 62 69 6e 64 5f 70 72 65 70 61 72 65 64 5f 73   bind_prepared_s
17800 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29  tmt(pArg, pStmt)
17810 3b 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72 65  ;.      exec_pre
17820 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c  pared_stmt(pArg,
17830 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 65   pStmt);.      e
17840 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65  xplain_data_dele
17850 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20  te(pArg);.      
17860 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29  eqp_render(pArg)
17870 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  ;..      /* prin
17880 74 20 75 73 61 67 65 20 73 74 61 74 73 20 69 66  t usage stats if
17890 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20   stats on */.   
178a0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
178b0 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a  Arg->statsOn ){.
178c0 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
178d0 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20  stats(db, pArg, 
178e0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
178f0 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70     /* print loop
17900 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71  -counters if req
17910 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  uired */.      i
17920 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
17930 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a  >scanstatsOn ){.
17940 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
17950 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41  scanstats(db, pA
17960 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rg);.      }..  
17970 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
17980 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75  the statement ju
17990 73 74 20 65 78 65 63 75 74 65 64 2e 20 49 66 20  st executed. If 
179a0 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65  this fails, save
179b0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
179c0 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
179d0 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  ssage. Otherwise
179e0 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f  , set zSql to po
179f0 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  int to the.     
17a00 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65   ** next stateme
17a10 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a  nt to execute. *
17a20 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  /.      rc2 = sq
17a30 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
17a40 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
17a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
17a60 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  M ) rc = rc2;.  
17a70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17a90 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65   zSql = zLeftove
17aa0 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  r;.        while
17ab0 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30  ( IsSpace(zSql[0
17ac0 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
17ad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45     }else if( pzE
17ae0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
17af0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
17b00 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
17b10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17b20 20 63 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d   clear saved stm
17b30 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  t handle */.    
17b40 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
17b50 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d        pArg->pStm
17b60 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  t = NULL;.      
17b70 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65  }.    }.  } /* e
17b80 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72  nd while */..  r
17b90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ba0 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72  ** Release memor
17bb0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  y previously all
17bc0 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c 65 43  ocated by tableC
17bd0 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a  olumnList()..*/.
17be0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
17bf0 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20  ColumnList(char 
17c00 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  **azCol){.  int 
17c10 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  i;.  for(i=1; az
17c20 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
17c30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
17c40 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zCol[i]);.  }.  
17c50 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61  /* azCol[0] is a
17c60 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a   static string *
17c70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
17c80 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (azCol);.}../*.*
17c90 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
17ca0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
17cb0 74 72 69 6e 67 73 20 77 68 69 63 68 20 61 72 65  trings which are
17cc0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
17cd0 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  l.** columns in 
17ce0 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68  table zTab.   Th
17cf0 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  e memory to hold
17d00 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79   the names is dy
17d10 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
17d20 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20  ocated and must 
17d30 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20 74  be released by t
17d40 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
17d50 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
17d60 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75  l.** to freeColu
17d70 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  mnList()..**.** 
17d80 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74  The azCol[0] ent
17d90 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55  ry is usually NU
17da0 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  LL.  However, if
17db0 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61   zTab contains a
17dc0 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20   rowid.** value 
17dd0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
17de0 20 70 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e   preserved, then
17df0 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c   azCol[0] is fil
17e00 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a  led in with the.
17e10 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72  ** name of the r
17e20 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  owid column..**.
17e30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72 65 67  ** The first reg
17e40 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ular column in t
17e50 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f  he table is azCo
17e60 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20  l[1].  The list 
17e70 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
17e80 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74   by an entry wit
17e90 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a  h azCol[i]==0..*
17ea0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
17eb0 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17ec0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
17ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
17ee0 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  {.  char **azCol
17ef0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
17f00 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
17f10 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
17f20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74   nCol = 0;.  int
17f30 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69   nAlloc = 0;.  i
17f40 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20  nt nPK = 0;     
17f50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
17f60 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
17f70 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  ns seen */.  int
17f80 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20   isIPK = 0;     
17f90 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50  /* True if one P
17fa0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
17fb0 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45  n of type INTEGE
17fc0 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65  R */.  int prese
17fd0 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c  rveRowid = Shell
17fe0 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
17ff0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
18000 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
18010 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
18020 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
18030 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61  le_info=%Q", zTa
18040 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
18050 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
18060 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
18070 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
18080 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
18090 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
180a0 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73  rn 0;.  while( s
180b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
180c0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
180d0 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d  {.    if( nCol>=
180e0 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20  nAlloc-2 ){.    
180f0 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f    nAlloc = nAllo
18100 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b  c*2 + nCol + 10;
18110 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73  .      azCol = s
18120 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
18130 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  zCol, nAlloc*siz
18140 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a  eof(azCol[0]));.
18150 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d        if( azCol=
18160 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
18170 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
18180 7d 0a 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43  }.    azCol[++nC
18190 6f 6c 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ol] = sqlite3_mp
181a0 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
181b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
181c0 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20  pStmt, 1));.    
181d0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
181e0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29  mn_int(pStmt, 5)
181f0 20 29 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b   ){.      nPK++;
18200 0a 20 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d  .      if( nPK==
18210 31 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  1.       && sqli
18220 74 65 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e  te3_stricmp((con
18230 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
18240 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
18250 6d 74 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20  mt,2),.         
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
18280 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18290 69 73 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20  isIPK = 1;.     
182a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
182b0 69 73 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20  isIPK = 0;.     
182c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
182d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
182e0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a  pStmt);.  if( az
182f0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
18300 30 3b 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20  0;.  azCol[0] = 
18310 30 3b 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b  0;.  azCol[nCol+
18320 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  1] = 0;..  /* Th
18330 65 20 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68  e decision of wh
18340 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72  ether or not a r
18350 6f 77 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64  owid really need
18360 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
18370 64 0a 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79  d.  ** is tricky
18380 2e 20 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64  .  We never need
18390 20 74 6f 20 70 72 65 73 65 72 76 65 20 61 20 72   to preserve a r
183a0 6f 77 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f  owid for a WITHO
183b0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20  UT ROWID table. 
183c0 20 2a 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77   ** or a table w
183d0 69 74 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50  ith an INTEGER P
183e0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20  RIMARY KEY.  We 
183f0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72  are unable to pr
18400 65 73 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69  eserve.  ** rowi
18410 64 73 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65  ds on tables whe
18420 72 65 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  re the rowid is 
18430 69 6e 61 63 63 65 73 73 69 62 6c 65 20 62 65 63  inaccessible bec
18440 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20 6f  ause there are o
18450 74 68 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e  ther.  ** column
18460 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e  s in the table n
18470 61 6d 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f  amed "rowid", "_
18480 72 6f 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69  rowid_", and "oi
18490 64 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d"..  */.  if( p
184a0 72 65 73 65 72 76 65 52 6f 77 69 64 20 26 26 20  reserveRowid && 
184b0 69 73 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  isIPK ){.    /* 
184c0 49 66 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d  If a single PRIM
184d0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77  ARY KEY column w
184e0 69 74 68 20 74 79 70 65 20 49 4e 54 45 47 45 52  ith type INTEGER
184f0 20 77 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20   was seen, then 
18500 69 74 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  it.    ** might 
18510 62 65 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20  be an alise for 
18520 74 68 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20  the ROWID.  But 
18530 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  it might also be
18540 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
18550 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72  .    ** table or
18560 20 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41   a INTEGER PRIMA
18570 52 59 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75  RY KEY DESC colu
18580 6d 6e 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77  mn, neither of w
18590 68 69 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20  hich are.    ** 
185a0 52 4f 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20  ROWID aliases.  
185b0 54 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74  To distinguish t
185c0 68 65 73 65 20 63 61 73 65 73 2c 20 63 68 65 63  hese cases, chec
185d0 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  k to see if.    
185e0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 22 70  ** there is a "p
185f0 6b 22 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41  k" entry in "PRA
18600 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e  GMA index_list".
18610 20 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a    There will be.
18620 20 20 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69      ** no "pk" i
18630 6e 64 65 78 20 69 66 20 74 68 65 20 50 52 49 4d  ndex if the PRIM
18640 41 52 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69  ARY KEY really i
18650 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  s an alias for t
18660 68 65 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f  he ROWID..    */
18670 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
18680 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
18690 45 43 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d  ECT 1 FROM pragm
186a0 61 5f 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29  a_index_list(%Q)
186b0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
186d0 48 45 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27  HERE origin='pk'
186e0 22 2c 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63  ", zTab);.    rc
186f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
18700 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
18710 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
18720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18730 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
18740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
18750 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a  reeColumnList(az
18760 43 6f 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Col);.      retu
18770 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
18780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
18790 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  p(pStmt);.    sq
187a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
187b0 53 74 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65  Stmt);.    prese
187c0 72 76 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53  rveRowid = rc==S
187d0 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
187e0 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
187f0 69 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c  id ){.    /* Onl
18800 79 20 70 72 65 73 65 72 76 65 20 74 68 65 20 72  y preserve the r
18810 6f 77 69 64 20 69 66 20 77 65 20 63 61 6e 20 66  owid if we can f
18820 69 6e 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73  ind a name to us
18830 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
18840 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74   rowid */.    st
18850 61 74 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77  atic char *azRow
18860 69 64 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22  id[] = { "rowid"
18870 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69  , "_rowid_", "oi
18880 64 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c  d" };.    int i,
18890 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   j;.    for(j=0;
188a0 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
188b0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43    for(i=1; i<=nC
188c0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
188d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
188e0 72 69 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d  ricmp(azRowid[j]
188f0 2c 61 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20  ,azCol[i])==0 ) 
18900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18910 20 20 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20       if( i>nCol 
18920 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
18930 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
18940 6b 6e 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69  know that azRowi
18950 64 5b 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20  d[j] is not the 
18960 6e 61 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20  name of any.    
18970 20 20 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20      ** ordinary 
18980 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
18990 62 6c 65 2e 20 20 56 65 72 69 66 79 20 74 68 61  ble.  Verify tha
189a0 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20  t azRowid[j] is 
189b0 61 20 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20  a valid.        
189c0 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
189d0 72 6f 77 69 64 20 62 65 66 6f 72 65 20 61 64 64  rowid before add
189e0 69 6e 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b  ing it to azCol[
189f0 30 5d 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57  0].  WITHOUT ROW
18a00 49 44 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ID.        ** ta
18a10 62 6c 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74  bles will fail t
18a20 68 69 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a  his last check *
18a30 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
18a40 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
18a50 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e  umn_metadata(p->
18a60 64 62 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69  db,0,zTab,azRowi
18a70 64 5b 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b  d[j],0,0,0,0,0);
18a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43  =SQLITE_OK ) azC
18aa0 6f 6c 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b  ol[0] = azRowid[
18ab0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  j];.        brea
18ac0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18ad0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a  .  }.  return az
18ae0 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f  Col;.}../*.** To
18af0 67 67 6c 65 20 74 68 65 20 72 65 76 65 72 73 65  ggle the reverse
18b00 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63  _unordered_selec
18b10 74 73 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73  ts setting..*/.s
18b20 74 61 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c  tatic void toggl
18b30 65 53 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c  eSelectOrder(sql
18b40 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c  ite3 *db){.  sql
18b50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18b60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74   = 0;.  int iSet
18b70 74 69 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72  ting = 0;.  char
18b80 20 7a 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73   zStmt[100];.  s
18b90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18ba0 32 28 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65  2(db, "PRAGMA re
18bb0 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
18bc0 73 65 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70  selects", -1, &p
18bd0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
18be0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
18bf0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
18c00 29 7b 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20  ){.    iSetting 
18c10 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
18c20 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
18c30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
18c40 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
18c50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18c60 66 28 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c  f(sizeof(zStmt),
18c70 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22   zStmt,.       "
18c80 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75  PRAGMA reverse_u
18c90 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
18ca0 28 25 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67  (%d)", !iSetting
18cb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
18cc0 63 28 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20  c(db, zStmt, 0, 
18cd0 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
18ce0 54 68 69 73 20 69 73 20 61 20 64 69 66 66 65 72  This is a differ
18cf0 65 6e 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  ent callback rou
18d00 74 69 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75  tine used for du
18d10 6d 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  mping the databa
18d20 73 65 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20  se..** Each row 
18d30 72 65 63 65 69 76 65 64 20 62 79 20 74 68 69 73  received by this
18d40 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73   callback consis
18d50 74 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ts of a table na
18d60 6d 65 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  me,.** the table
18d70 20 74 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f   type ("index" o
18d80 72 20 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53  r "table") and S
18d90 51 4c 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  QL to create the
18da0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
18db0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70  routine should p
18dc0 72 69 6e 74 20 74 65 78 74 20 73 75 66 66 69 63  rint text suffic
18dd0 69 65 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  ient to recreate
18de0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
18df0 74 61 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63  tatic int dump_c
18e00 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
18e10 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
18e20 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
18e30 20 2a 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20   **azNotUsed){. 
18e40 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
18e50 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
18e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
18e70 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
18e80 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53   *zSql;.  ShellS
18e90 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
18ea0 53 74 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20  State *)pArg;.. 
18eb0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18ec0 52 28 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  R(azNotUsed);.  
18ed0 69 66 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61  if( nArg!=3 || a
18ee0 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
18ef0 20 30 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61   0;.  zTable = a
18f00 7a 41 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65  zArg[0];.  zType
18f10 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a   = azArg[1];.  z
18f20 53 71 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a  Sql = azArg[2];.
18f30 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
18f40 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  able, "sqlite_se
18f50 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
18f60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
18f70 3e 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52  >out, "DELETE FR
18f80 4f 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  OM sqlite_sequen
18f90 63 65 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65  ce;\n");.  }else
18fa0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
18fb0 67 6c 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61  glob("sqlite_sta
18fc0 74 3f 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20  t?", zTable)==0 
18fd0 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  ){.    raw_print
18fe0 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59  f(p->out, "ANALY
18ff0 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ZE sqlite_master
19000 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
19010 66 28 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c  f( strncmp(zTabl
19020 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
19030 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
19040 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
19050 20 73 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22   strncmp(zSql, "
19060 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
19070 41 42 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b  ABLE", 20)==0 ){
19080 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b  .    char *zIns;
19090 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69  .    if( !p->wri
190a0 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
190b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
190c0 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
190d0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
190e0 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  ON;\n");.      p
190f0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
19100 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
19110 7a 49 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zIns = sqlite3_m
19120 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  printf(.       "
19130 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69  INSERT INTO sqli
19140 74 65 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e  te_master(type,n
19150 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f  ame,tbl_name,roo
19160 74 70 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20  tpage,sql)".    
19170 20 20 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c     "VALUES('tabl
19180 65 27 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27  e','%q','%q',0,'
19190 25 71 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a  %q');",.       z
191a0 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a  Table, zTable, z
191b0 53 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  Sql);.    utf8_p
191c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
191d0 73 5c 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20  s\n", zIns);.   
191e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49   sqlite3_free(zI
191f0 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ns);.    return 
19200 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
19210 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
19220 70 2d 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b  p->out, zSql, ";
19230 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  \n");.  }..  if(
19240 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22   strcmp(zType, "
19250 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  table")==0 ){.  
19260 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c    ShellText sSel
19270 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65  ect;.    ShellTe
19280 78 74 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63  xt sTable;.    c
19290 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20  har **azCol;.   
192a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72   int i;.    char
192b0 20 2a 73 61 76 65 64 44 65 73 74 54 61 62 6c 65   *savedDestTable
192c0 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d  ;.    int savedM
192d0 6f 64 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20  ode;..    azCol 
192e0 3d 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73  = tableColumnLis
192f0 74 28 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  t(p, zTable);.  
19300 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
19310 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b  {.      p->nErr+
19320 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
19330 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
19340 20 41 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68   Always quote th
19350 65 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76  e table name, ev
19360 65 6e 20 69 66 20 69 74 20 61 70 70 65 61 72 73  en if it appears
19370 20 74 6f 20 62 65 20 70 75 72 65 20 61 73 63 69   to be pure asci
19380 69 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  i,.    ** in cas
19390 65 20 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72  e it is a keywor
193a0 64 2e 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49  d. Ex:  INSERT I
193b0 4e 54 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20  NTO "table" ... 
193c0 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  */.    initText(
193d0 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70  &sTable);.    ap
193e0 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
193f0 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
19400 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20  har(zTable));.  
19410 20 20 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69    /* If preservi
19420 6e 67 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64  ng the rowid, ad
19430 64 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  d a column list 
19440 61 66 74 65 72 20 74 68 65 20 74 61 62 6c 65 20  after the table 
19450 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  name..    ** In 
19460 6f 74 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49  other words:  "I
19470 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72  NSERT INTO tab(r
19480 6f 77 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20  owid,a,b,c,...) 
19490 56 41 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20  VALUES(...)".   
194a0 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74   ** instead of t
194b0 68 65 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54  he usual "INSERT
194c0 20 49 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53   INTO tab VALUES
194d0 28 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20  (...)"..    */. 
194e0 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20     if( azCol[0] 
194f0 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  ){.      appendT
19500 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22  ext(&sTable, "("
19510 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65  , 0);.      appe
19520 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
19530 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20  azCol[0], 0);.  
19540 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43      for(i=1; azC
19550 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ol[i]; i++){.   
19560 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
19570 26 73 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29  &sTable, ",", 0)
19580 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
19590 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
195a0 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61  Col[i], quoteCha
195b0 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20  r(azCol[i]));.  
195c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
195d0 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
195e0 22 29 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ")", 0);.    }..
195f0 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20      /* Build an 
19600 61 70 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45  appropriate SELE
19610 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
19620 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 53      initText(&sS
19630 65 6c 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65  elect);.    appe
19640 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
19650 20 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a   "SELECT ", 0);.
19660 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d      if( azCol[0]
19670 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
19680 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61  Text(&sSelect, a
19690 7a 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20  zCol[0], 0);.   
196a0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
196b0 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b  Select, ",", 0);
196c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
196d0 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
196e0 2b 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  +){.      append
196f0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61  Text(&sSelect, a
19700 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68  zCol[i], quoteCh
19710 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20  ar(azCol[i]));. 
19720 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69       if( azCol[i
19730 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61  +1] ){.        a
19740 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
19750 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
19760 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
19770 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a  reeColumnList(az
19780 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  Col);.    append
19790 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
197a0 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20   FROM ", 0);.   
197b0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
197c0 6c 65 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75  lect, zTable, qu
197d0 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29  oteChar(zTable))
197e0 3b 0a 0a 20 20 20 20 73 61 76 65 64 44 65 73 74  ;..    savedDest
197f0 54 61 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74  Table = p->zDest
19800 54 61 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64  Table;.    saved
19810 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
19820 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
19830 65 20 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20  e = sTable.z;.  
19840 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63    p->mode = p->c
19850 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  Mode = MODE_Inse
19860 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65  rt;.    rc = she
19870 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65  ll_exec(p, sSele
19880 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66  ct.z, 0);.    if
19890 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
198a0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
198b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
198c0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
198d0 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
198e0 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
198f0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
19900 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
19910 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
19920 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30  (p, sSelect.z, 0
19930 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53  );.      toggleS
19940 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62  electOrder(p->db
19950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  );.    }.    p->
19960 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76  zDestTable = sav
19970 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  edDestTable;.   
19980 20 70 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64   p->mode = saved
19990 4d 6f 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Mode;.    freeTe
199a0 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20  xt(&sTable);.   
199b0 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65   freeText(&sSele
199c0 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ct);.    if( rc 
199d0 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  ) p->nErr++;.  }
199e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
199f0 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79  /*.** Run zQuery
19a00 2e 20 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c  .  Use dump_call
19a10 62 61 63 6b 28 29 20 61 73 20 74 68 65 20 63 61  back() as the ca
19a20 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73  llback routine s
19a30 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f  o that.** the co
19a40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75  ntents of the qu
19a50 65 72 79 20 61 72 65 20 6f 75 74 70 75 74 20 61  ery are output a
19a60 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  s SQL statements
19a70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65  ..**.** If we ge
19a80 74 20 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  t a SQLITE_CORRU
19a90 50 54 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20  PT error, rerun 
19aa0 74 68 65 20 71 75 65 72 79 20 61 66 74 65 72 20  the query after 
19ab0 61 70 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52  appending.** "OR
19ac0 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
19ad0 43 22 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a  C" to the end..*
19ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
19af0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
19b00 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ry(.  ShellState
19b10 20 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   *p,.  const cha
19b20 72 20 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69  r *zQuery.){.  i
19b30 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
19b40 45 72 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  Err = 0;.  rc = 
19b50 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
19b60 64 62 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70  db, zQuery, dump
19b70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a  _callback, p, &z
19b80 45 72 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Err);.  if( rc==
19b90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
19ba0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b  {.    char *zQ2;
19bb0 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
19bc0 74 72 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b  trlen30(zQuery);
19bd0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
19be0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19bf0 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
19c00 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
19c10 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
19c20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
19c30 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
19c40 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  ** %s ******/\n"
19c50 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
19c60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
19c70 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20  );.      zErr = 
19c80 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32  0;.    }.    zQ2
19c90 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31   = malloc( len+1
19ca0 30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51  00 );.    if( zQ
19cb0 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  2==0 ) return rc
19cc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
19cd0 70 72 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20  printf(len+100, 
19ce0 7a 51 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42  zQ2, "%s ORDER B
19cf0 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
19d00 51 75 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d  Query);.    rc =
19d10 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
19d20 3e 64 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63  >db, zQ2, dump_c
19d30 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
19d40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  r);.    if( rc )
19d50 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
19d60 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
19d70 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a  **** ERROR: %s *
19d80 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29  *****/\n", zErr)
19d90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
19db0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
19dc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19dd0 45 72 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Err);.    free(z
19de0 51 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Q2);.  }.  retur
19df0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19e00 65 78 74 20 6f 66 20 68 65 6c 70 20 6d 65 73 73  ext of help mess
19e10 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ages..**.** The 
19e20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 65 61  help text for ea
19e30 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f  ch individual co
19e40 6d 6d 61 6e 64 20 62 65 67 69 6e 73 20 77 69 74  mmand begins wit
19e50 68 20 61 20 6c 69 6e 65 20 74 68 61 74 20 73 74  h a line that st
19e60 61 72 74 73 0a 2a 2a 20 77 69 74 68 20 22 2e 22  arts.** with "."
19e70 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 6c 69  .  Subsequent li
19e80 6e 65 73 20 61 72 65 20 73 75 70 70 6c 69 6d 65  nes are supplime
19e90 6e 74 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ntal information
19ea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
19eb0 73 74 20 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72  st be two or mor
19ec0 65 20 73 70 61 63 65 73 20 62 65 74 77 65 65 6e  e spaces between
19ed0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19ee0 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 74 68 65 0a  command and the.
19ef0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
19f00 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 77  description of w
19f10 68 61 74 20 74 68 61 74 20 63 6f 6d 6d 61 6e 64  hat that command
19f20 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
19f30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 61 7a   const char *(az
19f40 48 65 6c 70 5b 5d 29 20 3d 20 7b 0a 23 69 66 20  Help[]) = {.#if 
19f50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
19f60 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65  AVE_ZLIB) && !de
19f70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19f80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
19f90 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20    ".archive ... 
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61              Mana
19fb0 67 65 20 53 51 4c 20 61 72 63 68 69 76 65 73 22  ge SQL archives"
19fc0 2c 0a 20 20 22 20 20 20 45 61 63 68 20 63 6f 6d  ,.  "   Each com
19fd0 6d 61 6e 64 20 6d 75 73 74 20 68 61 76 65 20 65  mand must have e
19fe0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
19ff0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 74 69  e following opti
1a000 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d  ons:",.  "     -
1a010 63 2c 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20  c, --create     
1a020 20 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65            Create
1a030 20 61 20 6e 65 77 20 61 72 63 68 69 76 65 22 2c   a new archive",
1a040 0a 20 20 22 20 20 20 20 20 2d 75 2c 20 2d 2d 75  .  "     -u, --u
1a050 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  pdate           
1a060 20 20 20 20 41 64 64 20 66 69 6c 65 73 20 6f 72      Add files or
1a070 20 75 70 64 61 74 65 20 66 69 6c 65 73 20 77 69   update files wi
1a080 74 68 20 63 68 61 6e 67 65 64 20 6d 74 69 6d 65  th changed mtime
1a090 22 2c 0a 20 20 22 20 20 20 20 20 2d 69 2c 20 2d  ",.  "     -i, -
1a0a0 2d 69 6e 73 65 72 74 20 20 20 20 20 20 20 20 20  -insert         
1a0b0 20 20 20 20 20 20 4c 69 6b 65 20 2d 75 20 62 75        Like -u bu
1a0c0 74 20 61 6c 77 61 79 73 20 61 64 64 20 65 76 65  t always add eve
1a0d0 6e 20 69 66 20 6d 74 69 6d 65 20 75 6e 63 68 61  n if mtime uncha
1a0e0 6e 67 65 64 22 2c 0a 20 20 22 20 20 20 20 20 2d  nged",.  "     -
1a0f0 74 2c 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20  t, --list       
1a100 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63            List c
1a110 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69  ontents of archi
1a120 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c  ve",.  "     -x,
1a130 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20 20   --extract      
1a140 20 20 20 20 20 20 20 20 45 78 74 72 61 63 74 20          Extract 
1a150 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69  files from archi
1a160 76 65 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f  ve",.  "   Optio
1a170 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c  nal arguments:",
1a180 0a 20 20 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76  .  "     -v, --v
1a190 65 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20  erbose          
1a1a0 20 20 20 20 50 72 69 6e 74 20 65 61 63 68 20 66      Print each f
1a1b0 69 6c 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73  ilename as it is
1a1c0 20 70 72 6f 63 65 73 73 65 64 22 2c 0a 20 20 22   processed",.  "
1a1d0 20 20 20 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d       -f FILE, --
1a1e0 66 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20  file FILE       
1a1f0 4f 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69  Operate on archi
1a200 76 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74  ve FILE (default
1a210 20 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 22   is current db)"
1a220 2c 0a 20 20 22 20 20 20 20 20 2d 61 20 46 49 4c  ,.  "     -a FIL
1a230 45 2c 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45  E, --append FILE
1a240 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20       Operate on 
1a250 46 49 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e  FILE opened usin
1a260 67 20 74 68 65 20 61 70 6e 64 76 66 73 20 56 46  g the apndvfs VF
1a270 53 22 2c 0a 20 20 22 20 20 20 20 20 2d 43 20 44  S",.  "     -C D
1a280 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20  IR, --directory 
1a290 44 49 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f  DIR    Change to
1a2a0 20 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 74   directory DIR t
1a2b0 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74 20 66  o read/extract f
1a2c0 69 6c 65 73 22 2c 0a 20 20 22 20 20 20 20 20 2d  iles",.  "     -
1a2d0 6e 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20  n, --dryrun     
1a2e0 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74            Show t
1a2f0 68 65 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c  he SQL that woul
1a300 64 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 22  d have occurred"
1a310 2c 0a 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73  ,.  "   Examples
1a320 3a 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20  :",.  "     .ar 
1a330 2d 63 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -cf archive.sar 
1a340 66 6f 6f 20 62 61 72 20 20 23 20 43 72 65 61 74  foo bar  # Creat
1a350 65 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72  e archive.sar fr
1a360 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64  om files foo and
1a370 20 62 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e   bar",.  "     .
1a380 61 72 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73  ar -tf archive.s
1a390 61 72 20 20 20 20 20 20 20 20 20 20 23 20 4c 69  ar          # Li
1a3a0 73 74 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72  st members of ar
1a3b0 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20  chive.sar",.  " 
1a3c0 20 20 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63      .ar -xvf arc
1a3d0 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
1a3e0 20 23 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74   # Verbosely ext
1a3f0 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20  ract files from 
1a400 61 72 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20  archive.sar",.  
1a410 22 20 20 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a  "   See also:",.
1a420 20 20 22 20 20 20 20 20 20 68 74 74 70 3a 2f 2f    "      http://
1a430 73 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68  sqlite.org/cli.h
1a440 74 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76  tml#sqlar_archiv
1a450 65 5f 73 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64  e_support",.#end
1a460 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
1a470 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1a480 54 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e  TION.  ".auth ON
1a490 7c 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 20  |OFF            
1a4a0 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72   Show authorizer
1a4b0 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e   callbacks",.#en
1a4c0 64 69 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f  dif.  ".backup ?
1a4d0 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20 20  DB? FILE        
1a4e0 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61 75  Backup DB (defau
1a4f0 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20  lt \"main\") to 
1a500 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 20  FILE",.  "      
1a510 20 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20   --append       
1a520 20 20 20 20 20 55 73 65 20 74 68 65 20 61 70 70       Use the app
1a530 65 6e 64 76 66 73 22 2c 0a 20 20 22 20 20 20 20  endvfs",.  "    
1a540 20 20 20 2d 2d 61 73 79 6e 63 20 20 20 20 20 20     --async      
1a550 20 20 20 20 20 20 20 57 72 69 74 65 20 74 6f 20         Write to 
1a560 46 49 4c 45 20 77 69 74 68 6f 75 74 20 61 20 6a  FILE without a j
1a570 6f 75 72 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f  ournal and witho
1a580 75 74 20 66 73 79 6e 63 28 29 22 2c 0a 20 20 22  ut fsync()",.  "
1a590 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20  .bail on|off    
1a5a0 20 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66           Stop af
1a5b0 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65  ter hitting an e
1a5c0 72 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f  rror.  Default O
1a5d0 46 46 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20  FF",.  ".binary 
1a5e0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
1a5f0 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74   Turn binary out
1a600 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20  put on or off.  
1a610 44 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20  Default OFF",.  
1a620 22 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20 20  ".cd DIRECTORY  
1a630 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67 65            Change
1a640 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72   the working dir
1a650 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54  ectory to DIRECT
1a660 4f 52 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65  ORY",.  ".change
1a670 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  s on|off        
1a680 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66    Show number of
1a690 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79   rows changed by
1a6a0 20 53 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b   SQL",.  ".check
1a6b0 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   GLOB           
1a6c0 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75     Fail if outpu
1a6d0 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73  t since .testcas
1a6e0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
1a6f0 22 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57  ",.  ".clone NEW
1a700 44 42 20 20 20 20 20 20 20 20 20 20 20 20 20 43  DB             C
1a710 6c 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e  lone data into N
1a720 45 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78  EWDB from the ex
1a730 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 22  isting database"
1a740 2c 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20  ,.  ".databases 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1a760 73 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c  st names and fil
1a770 65 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  es of attached d
1a780 61 74 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64  atabases",.  ".d
1a790 62 63 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61  bconfig ?op? ?va
1a7a0 6c 3f 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63  l?     List or c
1a7b0 68 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62  hange sqlite3_db
1a7c0 5f 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e  _config() option
1a7d0 73 22 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f  s",.  ".dbinfo ?
1a7e0 44 42 3f 20 20 20 20 20 20 20 20 20 20 20 20 20  DB?             
1a7f0 53 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f  Show status info
1a800 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1a810 65 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  e database",.  "
1a820 2e 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e  .dump ?TABLE? ..
1a830 2e 20 20 20 20 20 20 20 20 52 65 6e 64 65 72 20  .        Render 
1a840 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1a850 74 65 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20  tent as SQL",.  
1a860 22 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20  "   Options:",. 
1a870 20 22 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76   "     --preserv
1a880 65 2d 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e  e-rowids      In
1a890 63 6c 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75  clude ROWID valu
1a8a0 65 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  es in the output
1a8b0 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77  ",.  "     --new
1a8c0 6c 69 6e 65 73 20 20 20 20 20 20 20 20 20 20 20  lines           
1a8d0 20 20 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65    Allow unescape
1a8e0 64 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63  d newline charac
1a8f0 74 65 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c  ters in output",
1a900 0a 20 20 22 20 20 20 54 41 42 4c 45 20 69 73 20  .  "   TABLE is 
1a910 61 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 66  a LIKE pattern f
1a920 6f 72 20 74 68 65 20 74 61 62 6c 65 73 20 74 6f  or the tables to
1a930 20 64 75 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f   dump",.  ".echo
1a940 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1a950 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64      Turn command
1a960 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22   echo on or off"
1a970 2c 0a 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66  ,.  ".eqp on|off
1a980 7c 66 75 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e  |full|...     En
1a990 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1a9a0 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49  automatic EXPLAI
1a9b0 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20  N QUERY PLAN",. 
1a9c0 20 22 20 20 20 4f 74 68 65 72 20 4d 6f 64 65 73   "   Other Modes
1a9d0 3a 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  :",.#ifdef SQLIT
1a9e0 45 5f 44 45 42 55 47 0a 20 20 22 20 20 20 20 20  E_DEBUG.  "     
1a9f0 20 74 65 73 74 20 20 20 20 20 20 20 20 20 20 20   test           
1aa00 20 20 20 20 20 20 20 53 68 6f 77 20 72 61 77 20         Show raw 
1aa10 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1aa20 41 4e 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20  AN output",.  " 
1aa30 20 20 20 20 20 74 72 61 63 65 20 20 20 20 20 20       trace      
1aa40 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20             Like 
1aa50 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73  \"full\" but als
1aa60 6f 20 65 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d  o enable \"PRAGM
1aa70 41 20 76 64 62 65 5f 74 72 61 63 65 5c 22 22 2c  A vdbe_trace\"",
1aa80 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20  .#endif.  "     
1aa90 20 74 72 69 67 67 65 72 20 20 20 20 20 20 20 20   trigger        
1aaa0 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66 75         Like \"fu
1aab0 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 73 68  ll\" but also sh
1aac0 6f 77 20 74 72 69 67 67 65 72 20 62 79 74 65 63  ow trigger bytec
1aad0 6f 64 65 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20  ode",.  ".excel 
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 44 69 73 70 6c 61 79 20 74 68 65 20 6f 75    Display the ou
1ab00 74 70 75 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d  tput of next com
1ab10 6d 61 6e 64 20 69 6e 20 61 20 73 70 72 65 61 64  mand in a spread
1ab20 73 68 65 65 74 22 2c 0a 20 20 22 2e 65 78 69 74  sheet",.  ".exit
1ab30 20 3f 43 4f 44 45 3f 20 20 20 20 20 20 20 20 20   ?CODE?         
1ab40 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70 72      Exit this pr
1ab50 6f 67 72 61 6d 20 77 69 74 68 20 72 65 74 75 72  ogram with retur
1ab60 6e 2d 63 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20  n-code CODE",.  
1ab70 22 2e 65 78 70 65 72 74 20 20 20 20 20 20 20 20  ".expert        
1ab80 20 20 20 20 20 20 20 20 20 20 45 58 50 45 52 49            EXPERI
1ab90 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20  MENTAL. Suggest 
1aba0 69 6e 64 65 78 65 73 20 66 6f 72 20 73 70 65 63  indexes for spec
1abb0 69 66 69 65 64 20 71 75 65 72 69 65 73 22 2c 0a  ified queries",.
1abc0 2f 2a 20 42 65 63 61 75 73 65 20 65 78 70 6c 61  /* Because expla
1abd0 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e  in mode comes on
1abe0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e   automatically n
1abf0 6f 77 2c 20 74 68 65 20 22 2e 65 78 70 6c 61 69  ow, the ".explai
1ac00 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65  n" mode.** is re
1ac10 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 68  moved from the h
1ac20 65 6c 70 20 73 63 72 65 65 6e 2e 20 20 49 74 20  elp screen.  It 
1ac30 69 73 20 73 74 69 6c 6c 20 73 75 70 70 6f 72 74  is still support
1ac40 65 64 20 66 6f 72 20 6c 65 67 61 63 79 2c 20 68  ed for legacy, h
1ac50 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78  owever */./*".ex
1ac60 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75  plain ?on|off|au
1ac70 74 6f 3f 20 20 20 54 75 72 6e 20 45 58 50 4c 41  to?   Turn EXPLA
1ac80 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f  IN output mode o
1ac90 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61  n or off or to a
1aca0 75 74 6f 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22  utomatic",*/.  "
1acb0 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69  .fullschema ?--i
1acc0 6e 64 65 6e 74 3f 20 20 20 53 68 6f 77 20 73 63  ndent?   Show sc
1acd0 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e  hema and the con
1ace0 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73  tent of sqlite_s
1acf0 74 61 74 20 74 61 62 6c 65 73 22 2c 0a 20 20 22  tat tables",.  "
1ad00 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20  .headers on|off 
1ad10 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 64 69           Turn di
1ad20 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72 73  splay of headers
1ad30 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22   on or off",.  "
1ad40 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41  .help ?-all? ?PA
1ad50 54 54 45 52 4e 3f 20 20 20 53 68 6f 77 20 68 65  TTERN?   Show he
1ad60 6c 70 20 74 65 78 74 20 66 6f 72 20 50 41 54 54  lp text for PATT
1ad70 45 52 4e 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74  ERN",.  ".import
1ad80 20 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20   FILE TABLE     
1ad90 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20 66 72    Import data fr
1ada0 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54 41 42  om FILE into TAB
1adb0 4c 45 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE",.#ifndef SQL
1adc0 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f  ITE_OMIT_TEST_CO
1add0 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74  NTROL.  ".impost
1ade0 65 72 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20  er INDEX TABLE  
1adf0 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73 74 65    Create imposte
1ae00 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e  r table TABLE on
1ae10 20 69 6e 64 65 78 20 49 4e 44 45 58 22 2c 0a 23   index INDEX",.#
1ae20 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65 78 65  endif.  ".indexe
1ae30 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20  s ?TABLE?       
1ae40 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20    Show names of 
1ae50 69 6e 64 65 78 65 73 22 2c 0a 20 20 22 20 20 20  indexes",.  "   
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45          If TABLE
1ae80 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
1ae90 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73  nly show indexes
1aea0 20 66 6f 72 22 2c 0a 20 20 22 20 20 20 20 20 20   for",.  "      
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 20 20 20 20 74 61 62 6c 65 73 20 6d 61 74 63       tables matc
1aed0 68 69 6e 67 20 54 41 42 4c 45 20 75 73 69 6e 67  hing TABLE using
1aee0 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
1aef0 6f 72 2e 22 2c 0a 23 69 66 64 65 66 20 53 51 4c  or.",.#ifdef SQL
1af00 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1af10 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46  CE.  ".iotrace F
1af20 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 45  ILE            E
1af30 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f  nable I/O diagno
1af40 73 74 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20  stic logging to 
1af50 46 49 4c 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20  FILE",.#endif.  
1af60 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20  ".limit ?LIMIT? 
1af70 3f 56 41 4c 3f 20 20 20 20 20 44 69 73 70 6c 61  ?VAL?     Displa
1af80 79 20 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20  y or change the 
1af90 76 61 6c 75 65 20 6f 66 20 61 6e 20 53 51 4c 49  value of an SQLI
1afa0 54 45 5f 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c  TE_LIMIT",.  ".l
1afb0 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20  int OPTIONS     
1afc0 20 20 20 20 20 20 20 52 65 70 6f 72 74 20 70 6f         Report po
1afd0 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61 20 69  tential schema i
1afe0 73 73 75 65 73 2e 22 2c 0a 20 20 22 20 20 20 20  ssues.",.  "    
1aff0 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   Options:",.  " 
1b000 20 20 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65         fkey-inde
1b010 78 65 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73  xes     Find mis
1b020 73 69 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79  sing foreign key
1b030 20 69 6e 64 65 78 65 73 22 2c 0a 23 69 66 6e 64   indexes",.#ifnd
1b040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
1b050 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
1b060 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54  ".load FILE ?ENT
1b070 52 59 3f 20 20 20 20 20 20 20 4c 6f 61 64 20 61  RY?       Load a
1b080 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72  n extension libr
1b090 61 72 79 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  ary",.#endif.  "
1b0a0 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20  .log FILE|off   
1b0b0 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c 6f           Turn lo
1b0c0 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e  gging on or off.
1b0d0 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73 74    FILE can be st
1b0e0 64 65 72 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20  derr/stdout",.  
1b0f0 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42  ".mode MODE ?TAB
1b100 4c 45 3f 20 20 20 20 20 20 20 53 65 74 20 6f 75  LE?       Set ou
1b110 74 70 75 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20  tput mode",.  " 
1b120 20 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66    MODE is one of
1b130 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 73 63 69  :",.  "     asci
1b140 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77  i    Columns/row
1b150 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30  s delimited by 0
1b160 78 31 46 20 61 6e 64 20 30 78 31 45 22 2c 0a 20  x1F and 0x1E",. 
1b170 20 22 20 20 20 20 20 63 73 76 20 20 20 20 20 20   "     csv      
1b180 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20  Comma-separated 
1b190 76 61 6c 75 65 73 22 2c 0a 20 20 22 20 20 20 20  values",.  "    
1b1a0 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61   column   Left-a
1b1b0 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20  ligned columns. 
1b1c0 20 28 53 65 65 20 2e 77 69 64 74 68 29 22 2c 0a   (See .width)",.
1b1d0 20 20 22 20 20 20 20 20 68 74 6d 6c 20 20 20 20    "     html    
1b1e0 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f   HTML <table> co
1b1f0 64 65 22 2c 0a 20 20 22 20 20 20 20 20 69 6e 73  de",.  "     ins
1b200 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72 74  ert   SQL insert
1b210 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20   statements for 
1b220 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20  TABLE",.  "     
1b230 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76 61 6c  line     One val
1b240 75 65 20 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20  ue per line",.  
1b250 22 20 20 20 20 20 6c 69 73 74 20 20 20 20 20 56  "     list     V
1b260 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64 20  alues delimited 
1b270 62 79 20 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20  by \"|\"",.  "  
1b280 20 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61     quote    Esca
1b290 70 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f  pe answers as fo
1b2a0 72 20 53 51 4c 22 2c 0a 20 20 22 20 20 20 20 20  r SQL",.  "     
1b2b0 74 61 62 73 20 20 20 20 20 54 61 62 2d 73 65 70  tabs     Tab-sep
1b2c0 61 72 61 74 65 64 20 76 61 6c 75 65 73 22 2c 0a  arated values",.
1b2d0 20 20 22 20 20 20 20 20 74 63 6c 20 20 20 20 20    "     tcl     
1b2e0 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e   TCL list elemen
1b2f0 74 73 22 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c  ts",.  ".nullval
1b300 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20 20  ue STRING       
1b310 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70   Use STRING in p
1b320 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c  lace of NULL val
1b330 75 65 73 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28  ues",.  ".once (
1b340 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20 20 20 20  -e|-x|FILE)     
1b350 20 20 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65    Output for the
1b360 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e   next SQL comman
1b370 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c  d only to FILE",
1b380 0a 20 20 22 20 20 20 20 20 49 66 20 46 49 4c 45  .  "     If FILE
1b390 20 62 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27   begins with '|'
1b3a0 20 74 68 65 6e 20 6f 70 65 6e 20 61 73 20 61 20   then open as a 
1b3b0 70 69 70 65 22 2c 0a 20 20 22 20 20 20 20 20 4f  pipe",.  "     O
1b3c0 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a  ther options:",.
1b3d0 20 20 22 20 20 20 20 20 20 20 2d 65 20 20 20 20    "       -e    
1b3e0 49 6e 76 6f 6b 65 20 73 79 73 74 65 6d 20 74 65  Invoke system te
1b3f0 78 74 20 65 64 69 74 6f 72 22 2c 0a 20 20 22 20  xt editor",.  " 
1b400 20 20 20 20 20 20 2d 78 20 20 20 20 4f 70 65 6e        -x    Open
1b410 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65   in a spreadshee
1b420 74 22 2c 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50  t",.  ".open ?OP
1b430 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20  TIONS? ?FILE?   
1b440 43 6c 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64  Close existing d
1b450 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70  atabase and reop
1b460 65 6e 20 46 49 4c 45 22 2c 0a 20 20 22 20 20 20  en FILE",.  "   
1b470 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22    Options:",.  "
1b480 20 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64          --append
1b490 20 20 20 20 20 20 20 20 55 73 65 20 61 70 70 65          Use appe
1b4a0 6e 64 76 66 73 20 74 6f 20 61 70 70 65 6e 64 20  ndvfs to append 
1b4b0 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20  database to the 
1b4c0 65 6e 64 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69  end of FILE",.#i
1b4d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b4e0 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
1b4f0 20 22 20 20 20 20 20 20 20 20 2d 2d 64 65 73 65   "        --dese
1b500 72 69 61 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69  rialize   Load i
1b510 6e 74 6f 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e  nto memory usein
1b520 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  g sqlite3_deseri
1b530 61 6c 69 7a 65 28 29 22 2c 0a 20 20 22 20 20 20  alize()",.  "   
1b540 20 20 20 20 20 2d 2d 68 65 78 64 62 20 20 20 20       --hexdb    
1b550 20 20 20 20 20 4c 6f 61 64 20 74 68 65 20 6f 75       Load the ou
1b560 74 70 75 74 20 6f 66 20 5c 22 64 62 74 6f 74 78  tput of \"dbtotx
1b570 74 5c 22 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  t\" as an in-mem
1b580 6f 72 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ory database",. 
1b590 20 22 20 20 20 20 20 20 20 20 2d 2d 6d 61 78 73   "        --maxs
1b5a0 69 7a 65 20 4e 20 20 20 20 20 4d 61 78 69 6d 75  ize N     Maximu
1b5b0 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78  m size for --hex
1b5c0 64 62 20 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c  db or --deserial
1b5d0 69 7a 65 64 20 64 61 74 61 62 61 73 65 22 2c 0a  ized database",.
1b5e0 23 65 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20  #endif.  "      
1b5f0 20 20 2d 2d 6e 65 77 20 20 20 20 20 20 20 20 20    --new         
1b600 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c    Initialize FIL
1b610 45 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 64 61  E to an empty da
1b620 74 61 62 61 73 65 22 2c 0a 20 20 22 20 20 20 20  tabase",.  "    
1b630 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20      --readonly  
1b640 20 20 20 20 4f 70 65 6e 20 46 49 4c 45 20 72 65      Open FILE re
1b650 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20  adonly",.  "    
1b660 20 20 20 20 2d 2d 7a 69 70 20 20 20 20 20 20 20      --zip       
1b670 20 20 20 20 46 49 4c 45 20 69 73 20 61 20 5a 49      FILE is a ZI
1b680 50 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 2e  P archive",.  ".
1b690 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f 20 20 20  output ?FILE?   
1b6a0 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75 74          Send out
1b6b0 70 75 74 20 74 6f 20 46 49 4c 45 20 6f 72 20 73  put to FILE or s
1b6c0 74 64 6f 75 74 20 69 66 20 46 49 4c 45 20 69 73  tdout if FILE is
1b6d0 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20 22 20 20   omitted",.  "  
1b6e0 20 20 20 49 66 20 46 49 4c 45 20 62 65 67 69 6e     If FILE begin
1b6f0 73 20 77 69 74 68 20 27 7c 27 20 74 68 65 6e 20  s with '|' then 
1b700 6f 70 65 6e 20 69 74 20 61 73 20 61 20 70 69 70  open it as a pip
1b710 65 2e 22 2c 0a 20 20 22 2e 70 61 72 61 6d 65 74  e.",.  ".paramet
1b720 65 72 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20  er CMD ...      
1b730 20 4d 61 6e 61 67 65 20 53 51 4c 20 70 61 72 61   Manage SQL para
1b740 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 22 2c  meter bindings",
1b750 0a 20 20 22 20 20 20 63 6c 65 61 72 20 20 20 20  .  "   clear    
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
1b770 72 61 73 65 20 61 6c 6c 20 62 69 6e 64 69 6e 67  rase all binding
1b780 73 22 2c 0a 20 20 22 20 20 20 69 6e 69 74 20 20  s",.  "   init  
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
1b7b0 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74   TEMP table that
1b7c0 20 68 6f 6c 64 73 20 62 69 6e 64 69 6e 67 73 22   holds bindings"
1b7d0 2c 0a 20 20 22 20 20 20 6c 69 73 74 20 20 20 20  ,.  "   list    
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 4c 69 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  List the current
1b800 20 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69   parameter bindi
1b810 6e 67 73 22 2c 0a 20 20 22 20 20 20 73 65 74 20  ngs",.  "   set 
1b820 50 41 52 41 4d 45 54 45 52 20 56 41 4c 55 45 20  PARAMETER VALUE 
1b830 20 20 20 20 47 69 76 65 6e 20 53 51 4c 20 70 61      Given SQL pa
1b840 72 61 6d 65 74 65 72 20 50 41 52 41 4d 45 54 45  rameter PARAMETE
1b850 52 20 61 20 76 61 6c 75 65 20 6f 66 20 56 41 4c  R a value of VAL
1b860 55 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20  UE",.  "        
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 50 41 52 41 4d 45 54 45 52 20 73 68 6f     PARAMETER sho
1b890 75 6c 64 20 73 74 61 72 74 20 77 69 74 68 20 27  uld start with '
1b8a0 24 27 2c 20 27 3a 27 2c 20 27 40 27 2c 20 6f 72  $', ':', '@', or
1b8b0 20 27 3f 27 22 2c 0a 20 20 22 20 20 20 75 6e 73   '?'",.  "   uns
1b8c0 65 74 20 50 41 52 41 4d 45 54 45 52 20 20 20 20  et PARAMETER    
1b8d0 20 20 20 20 20 52 65 6d 6f 76 65 20 50 41 52 41       Remove PARA
1b8e0 4d 45 54 45 52 20 66 72 6f 6d 20 74 68 65 20 62  METER from the b
1b8f0 69 6e 64 69 6e 67 20 74 61 62 6c 65 22 2c 0a 20  inding table",. 
1b900 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e   ".print STRING.
1b910 2e 2e 20 20 20 20 20 20 20 20 20 50 72 69 6e 74  ..         Print
1b920 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47 22   literal STRING"
1b930 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1b940 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
1b950 41 4c 4c 42 41 43 4b 0a 20 20 22 2e 70 72 6f 67  ALLBACK.  ".prog
1b960 72 65 73 73 20 4e 20 20 20 20 20 20 20 20 20 20  ress N          
1b970 20 20 20 20 49 6e 76 6f 6b 65 20 70 72 6f 67 72      Invoke progr
1b980 65 73 73 20 68 61 6e 64 6c 65 72 20 61 66 74 65  ess handler afte
1b990 72 20 65 76 65 72 79 20 4e 20 6f 70 63 6f 64 65  r every N opcode
1b9a0 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c 69 6d 69  s",.  "   --limi
1b9b0 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  t N             
1b9c0 20 20 20 20 49 6e 74 65 72 72 75 70 74 20 61 66      Interrupt af
1b9d0 74 65 72 20 4e 20 70 72 6f 67 72 65 73 73 20 63  ter N progress c
1b9e0 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20 22 20 20  allbacks",.  "  
1b9f0 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20 20 20 20   --once         
1ba00 20 20 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f             Do no
1ba10 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
1ba20 72 6f 67 72 65 73 73 20 69 6e 74 65 72 72 75 70  rogress interrup
1ba30 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71 75 69 65  t",.  "   --quie
1ba40 74 7c 2d 71 20 20 20 20 20 20 20 20 20 20 20 20  t|-q            
1ba50 20 20 20 20 4e 6f 20 6f 75 74 70 75 74 20 65 78      No output ex
1ba60 63 65 70 74 20 61 74 20 69 6e 74 65 72 72 75 70  cept at interrup
1ba70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d 72 65 73  ts",.  "   --res
1ba80 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
1ba90 20 20 20 20 20 52 65 73 65 74 20 74 68 65 20 63       Reset the c
1baa0 6f 75 6e 74 20 66 6f 72 20 65 61 63 68 20 69 6e  ount for each in
1bab0 70 75 74 20 61 6e 64 20 69 6e 74 65 72 72 75 70  put and interrup
1bac0 74 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 70  t",.#endif.  ".p
1bad0 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49  rompt MAIN CONTI
1bae0 4e 55 45 20 20 20 20 52 65 70 6c 61 63 65 20 74  NUE    Replace t
1baf0 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f 6d  he standard prom
1bb00 70 74 73 22 2c 0a 20 20 22 2e 71 75 69 74 20 20  pts",.  ".quit  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
1bb30 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61 64 20 46  ram",.  ".read F
1bb40 49 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ILE             
1bb50 20 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f    Read input fro
1bb60 6d 20 46 49 4c 45 22 2c 0a 23 69 66 20 21 64 65  m FILE",.#if !de
1bb70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bb80 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
1bb90 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
1bba0 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
1bbb0 56 54 41 42 29 0a 20 20 22 2e 72 65 63 6f 76 65  VTAB).  ".recove
1bbc0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1bbd0 20 20 52 65 63 6f 76 65 72 20 61 73 20 6d 75 63    Recover as muc
1bbe0 68 20 64 61 74 61 20 61 73 20 70 6f 73 73 69 62  h data as possib
1bbf0 6c 65 20 66 72 6f 6d 20 63 6f 72 72 75 70 74 20  le from corrupt 
1bc00 64 62 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  db.",.#endif.  "
1bc10 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
1bc20 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f 72 65  LE       Restore
1bc30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
1bc40 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
1bc50 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20  ) from FILE",.  
1bc60 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20  ".save FILE     
1bc70 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1bc80 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1bc90 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20  se into FILE",. 
1bca0 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
1bcb0 6f 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20  off        Turn 
1bcc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
1bcd0 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63  nstatus() metric
1bce0 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  s on or off",.  
1bcf0 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52  ".schema ?PATTER
1bd00 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74  N?        Show t
1bd10 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
1bd20 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41  ents matching PA
1bd30 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20  TTERN",.  "     
1bd40 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1bd50 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20         --indent 
1bd60 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 74             Try t
1bd70 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74  o pretty-print t
1bd80 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e  he schema",.  ".
1bd90 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e  selftest ?OPTION
1bda0 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65 73 74  S?      Run test
1bdb0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
1bdc0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22   SELFTEST table"
1bdd0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1bde0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  :",.  "       --
1bdf0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
1be00 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
1be10 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c  SELFTEST table",
1be20 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20 20 20  .  "       -v   
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c  Verbose output",
1be50 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43  .  ".separator C
1be60 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61  OL ?ROW?     Cha
1be70 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  nge the column a
1be80 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  nd row separator
1be90 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s",.#if defined(
1bea0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1beb0 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
1bec0 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e  on ?NAME? CMD ..
1bed0 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e  .  Create or con
1bee0 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a  trol sessions",.
1bef0 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64    "   Subcommand
1bf00 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74  s:",.  "     att
1bf10 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
1bf20 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
1bf30 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61  LE",.  "     cha
1bf40 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20  ngeset FILE     
1bf50 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68        Write a ch
1bf60 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c  angeset into FIL
1bf70 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73  E",.  "     clos
1bf80 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1bf90 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73       Close one s
1bfa0 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20  ession",.  "    
1bfb0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1bfc0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1bfd0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1bfe0 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20  e bit",.  "     
1bff0 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20  filter GLOB...  
1c000 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20           Reject 
1c010 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1c020 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20  GLOBs",.  "     
1c030 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
1c040 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
1c050 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
1c060 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22  ect status",.  "
1c070 20 20 20 20 20 69 73 65 6d 70 74 79 20 20 20 20       isempty    
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
1c090 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
1c0a0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
1c0b0 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20  ",.  "     list 
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74      List current
1c0e0 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20  ly open session 
1c0f0 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20  names",.  "     
1c100 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20  open DB NAME    
1c110 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20           Open a 
1c120 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44  new session on D
1c130 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63  B",.  "     patc
1c140 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
1c150 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
1c160 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22  chset into FILE"
1c170 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45  ,.  "   If ?NAME
1c180 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
1c190 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
1c1a0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
1c1b0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1c1c0 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20  a3sum ...       
1c1d0 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20        Compute a 
1c1e0 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
1c1f0 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a  abase content",.
1c200 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22    "    Options:"
1c210 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68  ,.  "      --sch
1c220 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20  ema             
1c230 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
1c240 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1c250 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  le",.  "      --
1c260 73 68 61 33 2d 32 32 34 20 20 20 20 20 20 20 20  sha3-224        
1c270 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1c280 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c  -224 algorithm",
1c290 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33  .  "      --sha3
1c2a0 2d 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20  -256            
1c2b0 55 73 65 20 74 68 65 20 73 68 61 33 2d 32 35 36  Use the sha3-256
1c2c0 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69   algorithm.  Thi
1c2d0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
1c2e0 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  .",.  "      --s
1c2f0 68 61 33 2d 33 38 34 20 20 20 20 20 20 20 20 20  ha3-384         
1c300 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1c310 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  384 algorithm",.
1c320 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d    "      --sha3-
1c330 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 55  512            U
1c340 73 65 20 74 68 65 20 73 68 61 33 2d 35 31 32 20  se the sha3-512 
1c350 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20  algorithm",.  " 
1c360 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67     Any other arg
1c370 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20  ument is a LIKE 
1c380 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c  pattern for tabl
1c390 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66  es to hash",.#if
1c3a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1c3b0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68  VE_SYSTEM.  ".sh
1c3c0 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
1c3d0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1c3e0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1c3f0 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1c400 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1c420 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
1c430 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
1c440 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e   settings",.  ".
1c450 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
1c460 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
1c470 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
1c480 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66   on or off",.#if
1c490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1c4a0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79  VE_SYSTEM.  ".sy
1c4b0 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e  stem CMD ARGS...
1c4c0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1c4d0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1c4e0 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1c4f0 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42  .  ".tables ?TAB
1c500 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73  LE?          Lis
1c510 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
1c520 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20  s matching LIKE 
1c530 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a  pattern TABLE",.
1c540 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d    ".testcase NAM
1c550 45 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  E           Begi
1c560 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75  n redirecting ou
1c570 74 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73  tput to 'testcas
1c580 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22  e-out.txt'",.  "
1c590 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1c5a0 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
1c5b0 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
1c5c0 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
1c5d0 65 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d  econds",.  ".tim
1c5e0 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  er on|off       
1c5f0 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
1c600 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  mer on or off",.
1c610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c620 4d 49 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72  MIT_TRACE.  ".tr
1c630 61 63 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20  ace ?OPTIONS?   
1c640 20 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63        Output eac
1c650 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
1c660 61 73 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20  as it is run",. 
1c670 20 22 20 20 20 20 46 49 4c 45 20 20 20 20 20 20   "    FILE      
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
1c690 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
1c6a0 45 22 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75  E",.  "    stdou
1c6b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c6c0 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
1c6d0 6f 20 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20  o stdout",.  "  
1c6e0 20 20 73 74 64 65 72 72 20 20 20 20 20 20 20 20    stderr        
1c6f0 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f            Send o
1c700 75 74 70 75 74 20 74 6f 20 73 74 64 65 72 72 22  utput to stderr"
1c710 2c 0a 20 20 22 20 20 20 20 6f 66 66 20 20 20 20  ,.  "    off    
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 44 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67   Disable tracing
1c740 22 2c 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61  ",.  "    --expa
1c750 6e 64 65 64 20 20 20 20 20 20 20 20 20 20 20 20  nded            
1c760 20 20 45 78 70 61 6e 64 20 71 75 65 72 79 20 70    Expand query p
1c770 61 72 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64  arameters",.#ifd
1c780 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c790 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20  _NORMALIZE.  "  
1c7a0 20 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20    --normalized  
1c7b0 20 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c            Normal
1c7c0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1c7d0 6e 74 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  nts",.#endif.  "
1c7e0 20 20 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20      --plain     
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1c800 20 53 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e   SQL as it is in
1c810 70 75 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73  put",.  "    --s
1c820 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
1c830 20 20 20 20 20 54 72 61 63 65 20 73 74 61 74 65       Trace state
1c840 6d 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28  ment execution (
1c850 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
1c860 54 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72  T)",.  "    --pr
1c870 6f 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  ofile           
1c880 20 20 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74      Profile stat
1c890 65 6d 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54  ements (SQLITE_T
1c8a0 52 41 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a  RACE_PROFILE)",.
1c8b0 20 20 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20    "    --row    
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1c8d0 72 61 63 65 20 65 61 63 68 20 72 6f 77 20 28 53  race each row (S
1c8e0 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29  QLITE_TRACE_ROW)
1c8f0 22 2c 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73  ",.  "    --clos
1c900 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1c910 20 20 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69    Trace connecti
1c920 6f 6e 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45  on close (SQLITE
1c930 5f 54 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a  _TRACE_CLOSE)",.
1c940 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c950 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20  _OMIT_TRACE */. 
1c960 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f   ".vfsinfo ?AUX?
1c970 20 20 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72             Infor
1c980 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1c990 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c   top-level VFS",
1c9a0 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20  .  ".vfslist    
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1c9c0 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  t all available 
1c9d0 56 46 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e  VFSes",.  ".vfsn
1c9e0 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20  ame ?AUX?       
1c9f0 20 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61      Print the na
1ca00 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74  me of the VFS st
1ca10 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20  ack",.  ".width 
1ca20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
1ca30 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64    Set column wid
1ca40 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e  ths for \"column
1ca50 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20  \" mode",.  "   
1ca60 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65    Negative value
1ca70 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22  s right-justify"
1ca80 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  ,.};../*.** Outp
1ca90 75 74 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a  ut help text..**
1caa0 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73  .** zPattern des
1cab0 63 72 69 62 65 73 20 74 68 65 20 73 65 74 20 6f  cribes the set o
1cac0 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77  f commands for w
1cad0 68 69 63 68 20 68 65 6c 70 20 74 65 78 74 20 69  hich help text i
1cae0 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49  s provided..** I
1caf0 66 20 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55  f zPattern is NU
1cb00 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  LL, then show al
1cb10 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20  l commands, but 
1cb20 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d  only give a one-
1cb30 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  line.** descript
1cb40 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a  ion of each..**.
1cb50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1cb60 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e  mber of matches.
1cb70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1cb80 68 6f 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75  howHelp(FILE *ou
1cb90 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1cba0 50 61 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20  Pattern){.  int 
1cbb0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d  i = 0;.  int j =
1cbc0 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   0;.  int n = 0;
1cbd0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20  .  char *zPat;. 
1cbe0 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30   if( zPattern==0
1cbf0 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b  .   || zPattern[
1cc00 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74  0]=='0'.   || st
1cc10 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d  rcmp(zPattern,"-
1cc20 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72  a")==0.   || str
1cc30 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61  cmp(zPattern,"-a
1cc40 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  ll")==0.  ){.   
1cc50 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d   /* Show all com
1cc60 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20  mands, but only 
1cc70 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d  one line per com
1cc80 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  mand */.    if( 
1cc90 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50  zPattern==0 ) zP
1cca0 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20  attern = "";.   
1ccb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1ccc0 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69  ySize(azHelp); i
1ccd0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
1cce0 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27  zHelp[i][0]=='.'
1ccf0 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20   || zPattern[0] 
1cd00 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1cd10 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1cd20 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a  n", azHelp[i]);.
1cd30 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
1cd40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1cd50 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  se{.    /* Look 
1cd60 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  for commands tha
1cd70 74 20 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74  t for which zPat
1cd80 74 65 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74  tern is an exact
1cd90 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a   prefix */.    z
1cda0 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Pat = sqlite3_mp
1cdb0 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50  rintf(".%s*", zP
1cdc0 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72  attern);.    for
1cdd0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1cde0 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b  e(azHelp); i++){
1cdf0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1ce00 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c  e3_strglob(zPat,
1ce10 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29   azHelp[i])==0 )
1ce20 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1ce30 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1ce40 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20  ", azHelp[i]);. 
1ce50 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a         j = i+1;.
1ce60 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
1ce70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1ce80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1ce90 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a  );.    if( n ){.
1cea0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29        if( n==1 )
1ceb0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65  {.        /* whe
1cec0 6e 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20  n zPattern is a 
1ced0 70 72 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c  prefix of exactl
1cee0 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74  y one command, t
1cef0 68 65 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a  hen include the.
1cf00 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69          ** detai
1cf10 6c 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61  ls of that comma
1cf20 6e 64 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  nd, which should
1cf30 20 62 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74   begin at offset
1cf40 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68   j */.        wh
1cf50 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1cf60 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1cf70 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20  Help[j][0]!='.' 
1cf80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
1cf90 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1cfa0 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29  s\n", azHelp[j])
1cfb0 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
1cfc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cfd0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1cfe0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  n;.    }.    /* 
1cff0 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64  Look for command
1d000 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a  s that contain z
1d010 50 61 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65  Pattern anywhere
1d020 2e 20 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  .  Show the comp
1d030 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74  lete.    ** text
1d040 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73   of all commands
1d050 20 74 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a   that match. */.
1d060 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74      zPat = sqlit
1d070 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73  e3_mprintf("%%%s
1d080 25 25 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a  %%", zPattern);.
1d090 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1d0a0 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1d0b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1d0c0 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d  ( azHelp[i][0]==
1d0d0 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20  '.' ) j = i;.   
1d0e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1d0f0 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48  trlike(zPat, azH
1d100 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b  elp[i], 0)==0 ){
1d110 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1d120 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1d130 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20  , azHelp[j]);.  
1d140 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1d150 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1d160 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31  -1 && azHelp[j+1
1d170 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20  ][0]!='.' ){.   
1d180 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
1d190 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1d1a0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61  f(out, "%s\n", a
1d1b0 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20  zHelp[j]);.     
1d1c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d     }.        i =
1d1d0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b   j;.        n++;
1d1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d1f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d200 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zPat);.  }.  ret
1d210 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn n;.}../* For
1d220 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
1d230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1d240 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c  cess_input(Shell
1d250 53 74 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a  State *p);../*.*
1d260 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1d270 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65  nt of file zName
1d280 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
1d290 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1d2a0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a  e3_malloc64().**
1d2b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
1d2c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66  inter to the buf
1d2d0 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  fer. The caller 
1d2e0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1d2f0 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68  or freeing.** th
1d300 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  e memory..**.** 
1d310 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42  If parameter pnB
1d320 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  yte is not NULL,
1d330 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65   (*pnByte) is se
1d340 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1d350 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
1d360 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76  ..**.** For conv
1d370 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74  enience, a nul-t
1d380 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
1d390 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65  s always appende
1d3a0 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65  d to the data re
1d3b0 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ad.** from the f
1d3c0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  ile before the b
1d3d0 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65  uffer is returne
1d3e0 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
1d3f0 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  not included in.
1d400 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c  ** the final val
1d410 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c  ue of (*pnByte),
1d420 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a   if applicable..
1d430 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  **.** NULL is re
1d440 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72  turned if any er
1d450 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1d460 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  ed. The final va
1d470 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a  lue of *pnByte.*
1d480 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
1d490 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
1d4a0 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1d4b0 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  dFile(const char
1d4c0 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e   *zName, int *pn
1d4d0 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  Byte){.  FILE *i
1d4e0 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  n = fopen(zName,
1d4f0 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e   "rb");.  long n
1d500 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65  In;.  size_t nRe
1d510 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66  ad;.  char *pBuf
1d520 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
1d530 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65  return 0;.  fsee
1d540 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
1d550 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c  D);.  nIn = ftel
1d560 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
1d570 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  in);.  pBuf = sq
1d580 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
1d590 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  nIn+1 );.  if( p
1d5a0 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65  Buf==0 ){ fclose
1d5b0 28 69 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20  (in); return 0; 
1d5c0 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  }.  nRead = frea
1d5d0 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1d5e0 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1d5f0 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1d600 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1d610 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1d620 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d630 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1d640 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1d650 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
1d660 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
1d670 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d680 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1d690 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
1d6a0 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
1d6b0 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
1d6c0 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
1d6d0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1d6e0 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
1d6f0 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
1d700 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
1d710 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
1d720 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
1d730 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
1d740 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
1d750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1d760 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
1d770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
1d780 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
1d790 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1d7a0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1d7b0 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
1d7c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1d7d0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
1d7e0 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
1d7f0 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
1d800 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
1d810 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1d820 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
1d830 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
1d840 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1d850 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
1d860 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
1d870 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d880 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1d890 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1d8a0 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
1d8b0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
1d8c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1d8d0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
1d8e0 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
1d8f0 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
1d900 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
1d910 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
1d920 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d930 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1d940 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
1d950 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1d960 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
1d970 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
1d980 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
1d990 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
1d9a0 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
1d9b0 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
1d9c0 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
1d9d0 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
1d9e0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1d9f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1da00 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
1da10 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
1da20 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
1da30 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1da40 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1da50 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
1da60 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
1da70 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1da80 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1da90 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
1daa0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1dab0 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
1dac0 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
1dad0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1dae0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1daf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1db00 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
1db10 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
1db20 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
1db30 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
1db40 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
1db50 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
1db60 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a   constants..**.*
1db70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * If the file do
1db80 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1db90 69 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73  is empty but its
1dba0 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65   name looks like
1dbb0 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76   a ZIP.** archiv
1dbc0 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69  e and the dfltZi
1dbd0 70 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  p flag is true, 
1dbe0 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69  then assume it i
1dbf0 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e  s a ZIP archive.
1dc00 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1dc10 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72  ssume an ordinar
1dc20 79 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72  y database regar
1dc30 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c  dless of the fil
1dc40 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20  ename if.** the 
1dc50 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  type cannot be d
1dc60 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63  etermined from c
1dc70 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ontent..*/.int d
1dc80 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1dc90 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
1dca0 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70  ame, int dfltZip
1dcb0 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  ){.  FILE *f = f
1dcc0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
1dcd0 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  );.  size_t n;. 
1dce0 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f   int rc = SHELL_
1dcf0 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63  OPEN_UNSPEC;.  c
1dd00 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1dd10 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1dd20 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20   if( dfltZip && 
1dd30 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1dd40 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1dd50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65  ==0 ){.       re
1dd60 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1dd70 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1dd80 73 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72  se{.       retur
1dd90 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1dda0 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MAL;.    }.  }. 
1ddb0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1ddc0 20 31 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   16, 1, f);.  if
1ddd0 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
1dde0 28 7a 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66  (zBuf, "SQLite f
1ddf0 6f 72 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30  ormat 3", 16)==0
1de00 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66   ){.    fclose(f
1de10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48  );.    return SH
1de20 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b  ELL_OPEN_NORMAL;
1de30 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20  .  }.  fseek(f, 
1de40 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -25, SEEK_END);.
1de50 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
1de60 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69  , 25, 1, f);.  i
1de70 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d  f( n==1 && memcm
1de80 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f  p(zBuf, "Start-O
1de90 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29  f-SQLite3-", 17)
1dea0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1deb0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
1dec0 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DVFS;.  }else{. 
1ded0 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c     fseek(f, -22,
1dee0 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20   SEEK_END);.    
1def0 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1df00 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69  22, 1, f);.    i
1df10 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b  f( n==1 && zBuf[
1df20 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66  0]==0x50 && zBuf
1df30 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75  [1]==0x4b && zBu
1df40 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20  f[2]==0x05.     
1df50 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78    && zBuf[3]==0x
1df60 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  06 ){.      rc =
1df70 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1df80 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ILE;.    }else i
1df90 66 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a  f( n==0 && dfltZ
1dfa0 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ip && sqlite3_st
1dfb0 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e  rlike("%.zip",zN
1dfc0 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
1dfd0 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1dfe0 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1dff0 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  }.  }.  fclose(f
1e000 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
1e010 20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   .}..#ifdef SQLI
1e020 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1e030 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ALIZE./*.** Reco
1e040 6e 73 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65  nstruct an in-me
1e050 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 75 73  mory database us
1e060 69 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 66  ing the output f
1e070 72 6f 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74  rom the "dbtotxt
1e080 22 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52  ".** program.  R
1e090 65 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ead content from
1e0a0 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e   the file in p->
1e0b0 7a 44 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66  zDbFilename.  If
1e0c0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a   p->zDbFilename.
1e0d0 2a 2a 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65  ** is 0, then re
1e0e0 61 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64  ad from standard
1e0f0 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69   input..*/.stati
1e100 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
1e110 2a 72 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c  *readHexDb(Shell
1e120 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70  State *p, int *p
1e130 6e 44 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e  nData){.  unsign
1e140 65 64 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a  ed char *a = 0;.
1e150 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69    int nLine;.  i
1e160 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
1e170 70 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pgsz = 0;.  int 
1e180 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69  iOffset = 0;.  i
1e190 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72  nt j, k;.  int r
1e1a0 63 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  c;.  FILE *in;. 
1e1b0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 5b   unsigned int x[
1e1c0 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  16];.  char zLin
1e1d0 65 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 70  e[1000];.  if( p
1e1e0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29 7b  ->zDbFilename ){
1e1f0 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
1e200 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1e210 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  "r");.    if( in
1e220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
1e230 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1e240 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22   "cannot open \"
1e250 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67  %s\" for reading
1e260 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  \n", p->zDbFilen
1e270 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1e280 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1e290 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nLine = 0;.  }el
1e2a0 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d 3e  se{.    in = p->
1e2b0 69 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20  in;.    nLine = 
1e2c0 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 69  p->lineno;.    i
1e2d0 66 28 20 69 6e 3d 3d 30 20 29 20 69 6e 20 3d 20  f( in==0 ) in = 
1e2e0 73 74 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a 70 6e  stdin;.  }.  *pn
1e2f0 44 61 74 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e  Data = 0;.  nLin
1e300 65 2b 2b 3b 0a 20 20 69 66 28 20 66 67 65 74 73  e++;.  if( fgets
1e310 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1e320 4c 69 6e 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20  Line), in)==0 ) 
1e330 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65  goto readHexDb_e
1e340 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 73 73 63  rror;.  rc = ssc
1e350 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69  anf(zLine, "| si
1e360 7a 65 20 25 64 20 70 61 67 65 73 69 7a 65 20 25  ze %d pagesize %
1e370 64 22 2c 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a  d", &n, &pgsz);.
1e380 20 20 69 66 28 20 72 63 21 3d 32 20 29 20 67 6f    if( rc!=2 ) go
1e390 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e3a0 6f 72 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20  or;.  if( n<0 ) 
1e3b0 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65  goto readHexDb_e
1e3c0 72 72 6f 72 3b 0a 20 20 61 20 3d 20 73 71 6c 69  rror;.  a = sqli
1e3d0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 20 3f 20  te3_malloc( n ? 
1e3e0 6e 20 3a 20 31 20 29 3b 0a 20 20 69 66 28 20 61  n : 1 );.  if( a
1e3f0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
1e400 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1e410 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e  Out of memory!\n
1e420 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61  ");.    goto rea
1e430 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20  dHexDb_error;.  
1e440 7d 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c  }.  memset(a, 0,
1e450 20 6e 29 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c   n);.  if( pgsz<
1e460 35 31 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33  512 || pgsz>6553
1e470 36 20 7c 7c 20 28 70 67 73 7a 20 26 20 28 70 67  6 || (pgsz & (pg
1e480 73 7a 2d 31 29 29 21 3d 30 20 29 7b 0a 20 20 20  sz-1))!=0 ){.   
1e490 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1e4a0 65 72 72 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  err, "invalid pa
1e4b0 67 65 73 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20  gesize\n");.    
1e4c0 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65  goto readHexDb_e
1e4d0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rror;.  }.  for(
1e4e0 6e 4c 69 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a  nLine++; fgets(z
1e4f0 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
1e500 6e 65 29 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69  ne), in)!=0; nLi
1e510 6e 65 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20  ne++){.    rc = 
1e520 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c  sscanf(zLine, "|
1e530 20 70 61 67 65 20 25 64 20 6f 66 66 73 65 74 20   page %d offset 
1e540 25 64 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20  %d", &j, &k);.  
1e550 20 20 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20    if( rc==2 ){. 
1e560 20 20 20 20 20 69 4f 66 66 73 65 74 20 3d 20 6b       iOffset = k
1e570 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1e580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e590 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  strncmp(zLine, "
1e5a0 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29  | end ", 6)==0 )
1e5b0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1e5c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73     }.    rc = ss
1e5d0 63 61 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64  canf(zLine,"| %d
1e5e0 3a 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  : %x %x %x %x %x
1e5f0 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
1e600 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e610 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
1e620 20 20 20 20 26 6a 2c 20 26 78 5b 30 5d 2c 20 26      &j, &x[0], &
1e630 78 5b 31 5d 2c 20 26 78 5b 32 5d 2c 20 26 78 5b  x[1], &x[2], &x[
1e640 33 5d 2c 20 26 78 5b 34 5d 2c 20 26 78 5b 35 5d  3], &x[4], &x[5]
1e650 2c 20 26 78 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a  , &x[6], &x[7],.
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 26 78 5b 38 5d 2c 20 26 78 5b 39 5d 2c 20 26 78  &x[8], &x[9], &x
1e680 5b 31 30 5d 2c 20 26 78 5b 31 31 5d 2c 20 26 78  [10], &x[11], &x
1e690 5b 31 32 5d 2c 20 26 78 5b 31 33 5d 2c 20 26 78  [12], &x[13], &x
1e6a0 5b 31 34 5d 2c 20 26 78 5b 31 35 5d 29 3b 0a 20  [14], &x[15]);. 
1e6b0 20 20 20 69 66 28 20 72 63 3d 3d 31 37 20 29 7b     if( rc==17 ){
1e6c0 0a 20 20 20 20 20 20 6b 20 3d 20 69 4f 66 66 73  .      k = iOffs
1e6d0 65 74 2b 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  et+j;.      if( 
1e6e0 6b 2b 31 36 3c 3d 6e 20 29 7b 0a 20 20 20 20 20  k+16<=n ){.     
1e6f0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1e700 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1e710 31 36 3b 20 69 69 2b 2b 29 20 61 5b 6b 2b 69 69  16; ii++) a[k+ii
1e720 5d 20 3d 20 78 5b 69 69 5d 26 30 78 66 66 3b 0a  ] = x[ii]&0xff;.
1e730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e740 7d 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b  }.  *pnData = n;
1e750 0a 20 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e  .  if( in!=p->in
1e760 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69   ){.    fclose(i
1e770 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
1e780 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69   p->lineno = nLi
1e790 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
1e7a0 20 61 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65   a;..readHexDb_e
1e7b0 72 72 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d  rror:.  if( in!=
1e7c0 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c  p->in ){.    fcl
1e7d0 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  ose(in);.  }else
1e7e0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 67 65  {.    while( fge
1e7f0 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
1e800 28 7a 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21  (zLine), p->in)!
1e810 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e  =0 ){.      nLin
1e820 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74  e++;.      if(st
1e830 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20  rncmp(zLine, "| 
1e840 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62  end ", 6)==0 ) b
1e850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e860 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e  p->lineno = nLin
1e870 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
1e880 5f 66 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38  _free(a);.  utf8
1e890 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
1e8a0 45 72 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64  Error on line %d
1e8b0 20 6f 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75   of --hexdb inpu
1e8c0 74 5c 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  t\n", nLine);.  
1e8d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1e8e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1e8f0 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20  BLE_DESERIALIZE 
1e900 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72  */../*.** Scalar
1e910 20 66 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c   function "shell
1e920 5f 69 6e 74 33 32 22 2e 20 54 68 65 20 66 69 72  _int32". The fir
1e930 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  st argument to t
1e940 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1e950 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 2e 20  must be a blob. 
1e960 54 68 65 20 73 65 63 6f 6e 64 20 61 20 6e 6f 6e  The second a non
1e970 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
1e980 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1e990 0a 2a 2a 20 72 65 61 64 73 20 61 6e 64 20 72 65  .** reads and re
1e9a0 74 75 72 6e 73 20 61 20 33 32 2d 62 69 74 20 62  turns a 32-bit b
1e9b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1e9c0 72 20 66 72 6f 6d 20 62 79 74 65 0a 2a 2a 20 6f  r from byte.** o
1e9d0 66 66 73 65 74 20 28 34 2a 3c 61 72 67 32 3e 29  ffset (4*<arg2>)
1e9e0 20 6f 66 20 74 68 65 20 62 6c 6f 62 2e 0a 2a 2f   of the blob..*/
1e9f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
1ea00 6c 6c 49 6e 74 33 32 28 0a 20 20 73 71 6c 69 74  llInt32(.  sqlit
1ea10 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1ea20 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
1ea30 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
1ea40 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
1ea50 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ea60 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ar *pBlob;.  int
1ea70 20 6e 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 49   nBlob;.  int iI
1ea80 6e 74 3b 0a 20 20 0a 20 20 6e 42 6c 6f 62 20 3d  nt;.  .  nBlob =
1ea90 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
1eaa0 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
1eab0 20 70 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20   pBlob = (const 
1eac0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 73  unsigned char*)s
1ead0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
1eae0 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49  b(argv[0]);.  iI
1eaf0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  nt = sqlite3_val
1eb00 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b  ue_int(argv[1]);
1eb10 0a 0a 20 20 69 66 28 20 69 49 6e 74 3e 3d 30 20  ..  if( iInt>=0 
1eb20 26 26 20 28 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e  && (iInt+1)*4<=n
1eb30 42 6c 6f 62 20 29 7b 0a 20 20 20 20 63 6f 6e 73  Blob ){.    cons
1eb40 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1eb50 2a 61 20 3d 20 26 70 42 6c 6f 62 5b 69 49 6e 74  *a = &pBlob[iInt
1eb60 2a 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *4];.    sqlite3
1eb70 5f 69 6e 74 36 34 20 69 56 61 6c 20 3d 20 28 28  _int64 iVal = ((
1eb80 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b  sqlite3_int64)a[
1eb90 30 5d 3c 3c 32 34 29 0a 20 20 20 20 20 20 20 20  0]<<24).        
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1ebb0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
1ebc0 29 61 5b 31 5d 3c 3c 31 36 29 0a 20 20 20 20 20  )a[1]<<16).     
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e    + ((sqlite3_in
1ebf0 74 36 34 29 61 5b 32 5d 3c 3c 20 38 29 0a 20 20  t64)a[2]<< 8).  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 2b 20 28 28 73 71 6c 69 74 65 33       + ((sqlite3
1ec20 5f 69 6e 74 36 34 29 61 5b 33 5d 3c 3c 20 30 29  _int64)a[3]<< 0)
1ec30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
1ec40 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
1ec50 78 74 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d  xt, iVal);.  }.}
1ec60 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66  ../*.** Scalar f
1ec70 75 6e 63 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 65  unction "shell_e
1ec80 73 63 61 70 65 5f 63 72 6e 6c 22 20 75 73 65 64  scape_crnl" used
1ec90 20 62 79 20 74 68 65 20 2e 72 65 63 6f 76 65 72   by the .recover
1eca0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 54 68 65   command..** The
1ecb0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1ecc0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1ecd0 6e 20 69 73 20 74 68 65 20 6f 75 74 70 75 74 20  n is the output 
1ece0 6f 66 20 62 75 69 6c 74 2d 69 6e 0a 2a 2a 20 66  of built-in.** f
1ecf0 75 6e 63 74 69 6f 6e 20 71 75 6f 74 65 28 29 2e  unction quote().
1ed00 20 49 66 20 74 68 65 20 66 69 72 73 74 20 63 68   If the first ch
1ed10 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69  aracter of the i
1ed20 6e 70 75 74 20 69 73 20 22 27 22 2c 20 0a 2a 2a  nput is "'", .**
1ed30 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1ed40 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
1ed50 64 20 74 6f 20 71 75 6f 74 65 28 29 20 77 61 73  d to quote() was
1ed60 20 61 20 74 65 78 74 20 76 61 6c 75 65 2c 0a 2a   a text value,.*
1ed70 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
1ed80 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
1ed90 65 20 69 6e 70 75 74 20 66 6f 72 20 22 5c 6e 22  e input for "\n"
1eda0 20 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63   and "\r" charac
1edb0 74 65 72 73 0a 2a 2a 20 61 6e 64 20 61 64 64 73  ters.** and adds
1edc0 20 61 20 77 72 61 70 70 65 72 20 73 69 6d 69 6c   a wrapper simil
1edd0 61 72 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ar to the follow
1ede0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 72 65 70  ing:.**.**   rep
1edf0 6c 61 63 65 28 72 65 70 6c 61 63 65 28 3c 69 6e  lace(replace(<in
1ee00 70 75 74 3e 2c 20 27 5c 6e 27 2c 20 63 68 61 72  put>, '\n', char
1ee10 28 31 30 29 2c 20 27 5c 72 27 2c 20 63 68 61 72  (10), '\r', char
1ee20 28 31 33 29 29 3b 0a 2a 2a 0a 2a 2a 20 4f 72 2c  (13));.**.** Or,
1ee30 20 69 66 20 74 68 65 20 66 69 72 73 74 20 63 68   if the first ch
1ee40 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 69  aracter of the i
1ee50 6e 70 75 74 20 69 73 20 6e 6f 74 20 22 27 22 2c  nput is not "'",
1ee60 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
1ee70 6f 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  of the input is 
1ee80 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1ee90 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 73  tic void shellEs
1eea0 63 61 70 65 43 72 6e 6c 28 0a 20 20 73 71 6c 69  capeCrnl(.  sqli
1eeb0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
1eec0 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
1eed0 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  c, .  sqlite3_va
1eee0 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1eef0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
1ef00 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
1ef10 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1ef20 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
1ef30 69 66 28 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 5c  if( zText[0]=='\
1ef40 27 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  '' ){.    int nT
1ef50 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ext = sqlite3_va
1ef60 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1ef70 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ]);.    int i;. 
1ef80 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30     char zBuf1[20
1ef90 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ];.    char zBuf
1efa0 32 5b 32 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74  2[20];.    const
1efb0 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a   char *zNL = 0;.
1efc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1efd0 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zCR = 0;.    int
1efe0 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e   nCR = 0;.    in
1eff0 74 20 6e 4e 4c 20 3d 20 30 3b 0a 0a 20 20 20 20  t nNL = 0;..    
1f000 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
1f010 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
1f020 66 28 20 7a 4e 4c 3d 3d 30 20 26 26 20 7a 54 65  f( zNL==0 && zTe
1f030 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  xt[i]=='\n' ){. 
1f040 20 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75         zNL = unu
1f050 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74  sed_string(zText
1f060 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22  , "\\n", "\\012"
1f070 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 20 20  , zBuf1);.      
1f080 20 20 6e 4e 4c 20 3d 20 28 69 6e 74 29 73 74 72    nNL = (int)str
1f090 6c 65 6e 28 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  len(zNL);.      
1f0a0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52 3d  }.      if( zCR=
1f0b0 3d 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d  =0 && zText[i]==
1f0c0 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f0d0 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
1f0e0 69 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 72 22  ing(zText, "\\r"
1f0f0 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
1f100 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 52 20 3d  );.        nCR =
1f110 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 52   (int)strlen(zCR
1f120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f130 0a 0a 20 20 20 20 69 66 28 20 7a 4e 4c 20 7c 7c  ..    if( zNL ||
1f140 20 7a 43 52 20 29 7b 0a 20 20 20 20 20 20 69 6e   zCR ){.      in
1f150 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t iOut = 0;.    
1f160 20 20 69 36 34 20 6e 4d 61 78 20 3d 20 28 6e 4e    i64 nMax = (nN
1f170 4c 20 3e 20 6e 43 52 29 20 3f 20 6e 4e 4c 20 3a  L > nCR) ? nNL :
1f180 20 6e 43 52 3b 0a 20 20 20 20 20 20 69 36 34 20   nCR;.      i64 
1f190 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 61 78 20 2a 20  nAlloc = nMax * 
1f1a0 6e 54 65 78 74 20 2b 20 28 6e 4d 61 78 2b 36 34  nText + (nMax+64
1f1b0 29 2a 32 3b 0a 20 20 20 20 20 20 63 68 61 72 20  )*2;.      char 
1f1c0 2a 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 73  *zOut = (char*)s
1f1d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1f1e0 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  nAlloc);.      i
1f1f0 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
1f200 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1f210 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1f220 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
1f230 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1f240 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   }..      if( zN
1f250 4c 20 26 26 20 7a 43 52 20 29 7b 0a 20 20 20 20  L && zCR ){.    
1f260 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f270 5b 69 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65  [iOut], "replace
1f280 28 72 65 70 6c 61 63 65 28 22 2c 20 31 36 29 3b  (replace(", 16);
1f290 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d  .        iOut +=
1f2a0 20 31 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   16;.      }else
1f2b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1f2c0 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72  (&zOut[iOut], "r
1f2d0 65 70 6c 61 63 65 28 22 2c 20 38 29 3b 0a 20 20  eplace(", 8);.  
1f2e0 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 38 3b        iOut += 8;
1f2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1f300 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d  or(i=0; zText[i]
1f310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f320 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c  if( zText[i]=='\
1f330 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n' ){.          
1f340 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f350 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 0a 20  t], zNL, nNL);. 
1f360 20 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d           iOut +=
1f370 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65   nNL;.        }e
1f380 6c 73 65 20 69 66 28 20 7a 54 65 78 74 5b 69 5d  lse if( zText[i]
1f390 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
1f3a0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f3b0 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f3c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75  );.          iOu
1f3d0 74 20 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20  t += nCR;.      
1f3e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f3f0 20 20 20 7a 4f 75 74 5b 69 4f 75 74 5d 20 3d 20     zOut[iOut] = 
1f400 7a 54 65 78 74 5b 69 5d 3b 0a 20 20 20 20 20 20  zText[i];.      
1f410 20 20 20 20 69 4f 75 74 2b 2b 3b 0a 20 20 20 20      iOut++;.    
1f420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1f430 20 20 20 20 20 69 66 28 20 7a 4e 4c 20 29 7b 0a       if( zNL ){.
1f440 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f450 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22  zOut[iOut], ",'"
1f460 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b  , 2); iOut += 2;
1f470 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f480 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c  &zOut[iOut], zNL
1f490 2c 20 6e 4e 4c 29 3b 20 69 4f 75 74 20 2b 3d 20  , nNL); iOut += 
1f4a0 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nNL;.        mem
1f4b0 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f4c0 20 22 27 2c 20 63 68 61 72 28 31 30 29 29 22 2c   "', char(10))",
1f4d0 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32   12); iOut += 12
1f4e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f4f0 69 66 28 20 7a 43 52 20 29 7b 0a 20 20 20 20 20  if( zCR ){.     
1f500 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f510 69 4f 75 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b  iOut], ",'", 2);
1f520 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20   iOut += 2;.    
1f530 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f540 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f550 29 3b 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a  ); iOut += nCR;.
1f560 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f570 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20  zOut[iOut], "', 
1f580 63 68 61 72 28 31 33 29 29 22 2c 20 31 32 29 3b  char(13))", 12);
1f590 20 69 4f 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20   iOut += 12;.   
1f5a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1f5b0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1f5c0 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 69  context, zOut, i
1f5d0 4f 75 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Out, SQLITE_TRAN
1f5e0 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
1f5f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
1f600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1f610 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1f620 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1f630 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
1f640 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20 46 6c 61 67 73  0]);.}../* Flags
1f650 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a   for open_db()..
1f660 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f670 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70  t behavior of op
1f680 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78  en_db() is to ex
1f690 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61 74  it(1) if the dat
1f6a0 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a  abase fails to.*
1f6b0 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45  * open.  The OPE
1f6c0 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66  N_DB_KEEPALIVE f
1f6d0 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61 74  lag changes that
1f6e0 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e   so that it prin
1f6f0 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62  ts an error.** b
1f700 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  ut still returns
1f710 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
1f720 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   exit..**.** The
1f730 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45   OPEN_DB_ZIPFILE
1f740 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65   flag causes ope
1f750 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65 72  n_db() to prefer
1f760 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61   to open files a
1f770 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69  s a.** ZIP archi
1f780 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  ve if the file d
1f790 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
1f7a0 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74   is empty and it
1f7b0 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a  s name matches.*
1f7c0 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74  * the *.zip patt
1f7d0 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ern..*/.#define 
1f7e0 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1f7f0 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52  E   0x001   /* R
1f800 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f  eturn after erro
1f810 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65  r if true */.#de
1f820 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50  fine OPEN_DB_ZIP
1f830 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20 20  FILE     0x002  
1f840 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20   /* Open as ZIP 
1f850 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  if name matches 
1f860 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *.zip */../*.** 
1f870 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
1f880 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
1f890 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1f8a0 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
1f8b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1f8c0 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
1f8d0 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
1f8e0 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
1f8f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f900 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
1f910 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46  te *p, int openF
1f920 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e  lags){.  if( p->
1f930 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  db==0 ){.    if(
1f940 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1f950 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20  ELL_OPEN_UNSPEC 
1f960 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1f970 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  zDbFilename==0 |
1f980 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  | p->zDbFilename
1f990 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1f9a0 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
1f9b0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1f9c0 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  L;.      }else{.
1f9d0 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
1f9e0 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65  ode = (u8)deduce
1f9f0 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
1fa00 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  zDbFilename, .  
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e             (open
1fa30 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
1fa40 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20  ZIPFILE)!=0);.  
1fa50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fa60 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d  switch( p->openM
1fa70 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
1fa80 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  e SHELL_OPEN_APP
1fa90 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20  ENDVFS: {.      
1faa0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1fab0 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1fac0 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  , &p->db, .     
1fad0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1fae0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1faf0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1fb00 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20  "apndvfs");.    
1fb10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fb20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1fb30 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a  ELL_OPEN_HEXDB:.
1fb40 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1fb50 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1fb60 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1fb70 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d  ite3_open(0, &p-
1fb80 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1fb90 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fba0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1fbb0 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20  EN_ZIPFILE: {.  
1fbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1fbd0 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
1fbe0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1fbf0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fc00 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
1fc10 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b  OPEN_READONLY: {
1fc20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fc30 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
1fc40 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
1fc50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1fc60 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
1fc70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fc80 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
1fc90 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a  LL_OPEN_UNSPEC:.
1fca0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1fcb0 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a  _OPEN_NORMAL: {.
1fcc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1fcd0 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
1fce0 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
1fcf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fd00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67     }.    }.    g
1fd10 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b  lobalDb = p->db;
1fd20 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
1fd30 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 || SQLITE_OK!=
1fd40 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1fd50 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
1fd60 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1fd70 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c  rr,"Error: unabl
1fd80 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
1fd90 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
1fda0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ,.          p->z
1fdb0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
1fdc0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1fdd0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ));.      if( op
1fde0 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44  enFlags & OPEN_D
1fdf0 42 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20  B_KEEPALIVE ){. 
1fe00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
1fe10 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20  pen(":memory:", 
1fe20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
1fe30 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
1fe40 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
1fe50 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1fe60 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
1fe70 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c  XTENSION.    sql
1fe80 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
1fe90 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
1fea0 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 1);.#endif.   
1feb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
1fec0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1fed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1fee0 68 61 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e  hathree_init(p->
1fef0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
1ff00 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f  qlite3_completio
1ff10 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  n_init(p->db, 0,
1ff20 20 30 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65   0);.#if !define
1ff30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1ff40 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
1ff50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1ff60 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42  ABLE_DBPAGE_VTAB
1ff70 29 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ).    sqlite3_db
1ff80 64 61 74 61 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  data_init(p->db,
1ff90 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23   0, 0);.#endif.#
1ffa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
1ffb0 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74  E_ZLIB.    sqlit
1ffc0 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28  e3_zipfile_init(
1ffd0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1ffe0 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
1fff0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
20000 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
20010 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
20020 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
20030 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c  ell_add_schema",
20040 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
20050 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61  shellAddSchemaNa
20080 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  me, 0, 0);.    s
20090 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
200a0 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
200b0 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65  hell_module_sche
200c0 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ma", 1, SQLITE_U
200d0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53      shellModuleS
20100 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20  chema, 0, 0);.  
20110 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
20120 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
20130 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c   "shell_putsnl",
20140 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
20150 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   p,.            
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20170 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30  shellPutsFunc, 0
20180 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20190 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
201a0 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f  n(p->db, "shell_
201b0 65 73 63 61 70 65 5f 63 72 6e 6c 22 2c 20 31 2c  escape_crnl", 1,
201c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
201d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
201f0 6c 6c 45 73 63 61 70 65 43 72 6e 6c 2c 20 30 2c  llEscapeCrnl, 0,
20200 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
20210 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
20220 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 69  (p->db, "shell_i
20230 6e 74 33 32 22 2c 20 32 2c 20 53 51 4c 49 54 45  nt32", 2, SQLITE
20240 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 20 20 20 20 73 68 65 6c 6c 49 6e 74 33 32        shellInt32
20270 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
20280 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
20290 59 53 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65  YSTEM.    sqlite
202a0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
202b0 6e 28 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c  n(p->db, "edit",
202c0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
202d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 65 64 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  editFunc, 0, 0);
20300 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
20310 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
20320 64 62 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53  db, "edit", 2, S
20330 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46             editF
20360 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  unc, 0, 0);.#end
20370 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  if.    if( p->op
20380 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
20390 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20  EN_ZIPFILE ){.  
203a0 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
203b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
203c0 28 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41  (.         "CREA
203d0 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
203e0 20 7a 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69   zip USING zipfi
203f0 6c 65 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62  le(%Q);", p->zDb
20400 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
20410 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
20420 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
20430 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
20440 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
20450 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
20460 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
20470 41 4c 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20  ALIZE.    else. 
20480 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f     if( p->openMo
20490 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44  de==SHELL_OPEN_D
204a0 45 53 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d  ESERIALIZE || p-
204b0 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c  >openMode==SHELL
204c0 5f 4f 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20  _OPEN_HEXDB ){. 
204d0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
204e0 20 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30     int nData = 0
204f0 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
20500 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
20510 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
20520 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
20530 44 45 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20  DESERIALIZE ){. 
20540 20 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 28         aData = (
20550 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72  unsigned char*)r
20560 65 61 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69  eadFile(p->zDbFi
20570 6c 65 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b  lename, &nData);
20580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20590 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 72 65        aData = re
205a0 61 64 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74  adHexDb(p, &nDat
205b0 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
205c0 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
205d0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
205e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
205f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20600 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70  e3_deserialize(p
20610 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44  ->db, "main", aD
20620 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74  ata, nData, nDat
20630 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
20640 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53        SQLITE_DES
20650 45 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41  ERIALIZE_RESIZEA
20660 42 4c 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  BLE |.          
20670 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20680 44 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45  DESERIALIZE_FREE
20690 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20  ONCLOSE);.      
206a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
206b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
206c0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71  derr, "Error: sq
206d0 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
206e0 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  e() returns %d\n
206f0 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  ", rc);.      }.
20700 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
20710 61 78 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ax>0 ){.        
20720 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
20730 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69  trol(p->db, "mai
20740 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
20750 5f 53 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d  _SIZE_LIMIT, &p-
20760 3e 73 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d  >szMax);.      }
20770 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20780 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
20790 70 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  pt to close the 
207a0 64 61 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74  databaes connect
207b0 69 6f 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72  ion.  Report err
207c0 6f 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f  ors..*/.void clo
207d0 73 65 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64  se_db(sqlite3 *d
207e0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
207f0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
20800 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
20810 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
20820 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71  derr, "Error: sq
20830 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65  lite3_close() re
20840 74 75 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c  turns %d: %s\n",
20850 0a 20 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c  .        rc, sql
20860 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
20870 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41  ;.  } .}..#if HA
20880 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48  VE_READLINE || H
20890 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a  AVE_EDITLINE./*.
208a0 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70  ** Readline comp
208b0 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  letion callbacks
208c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
208d0 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
208e0 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63  tion_generator(c
208f0 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c  onst char *text,
20900 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73   int state){.  s
20910 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
20920 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
20930 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69   char *zRet;.  i
20940 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20  f( state==0 ){. 
20950 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
20960 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
20970 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
20980 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
20990 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
209a0 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
209b0 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
209c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
209e0 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
209f0 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
20a00 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69   text);.    sqli
20a10 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
20a20 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d  lobalDb, zSql, -
20a30 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
20a40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20a50 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  zSql);.  }.  if(
20a60 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
20a70 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
20a80 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   ){.    zRet = s
20a90 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61  trdup((const cha
20aa0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
20ab0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
20ac0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20ad0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20ae0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
20af0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74  mt = 0;.    zRet
20b00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
20b10 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69  rn zRet;.}.stati
20b20 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e  c char **readlin
20b30 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
20b40 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
20b50 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
20b60 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65  iEnd){.  rl_atte
20b70 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e  mpted_completion
20b80 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74  _over = 1;.  ret
20b90 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f  urn rl_completio
20ba0 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c  n_matches(zText,
20bb0 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65   readline_comple
20bc0 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b  tion_generator);
20bd0 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  .}..#elif HAVE_L
20be0 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c  INENOISE./*.** L
20bf0 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74  inenoise complet
20c00 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  ion callback.*/.
20c10 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65  static void line
20c20 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  noise_completion
20c30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
20c40 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d  ne, linenoiseCom
20c50 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20  pletions *lc){. 
20c60 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72   int nLine = str
20c70 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
20c80 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
20c90 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20ca0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
20cb0 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a   *zSql;.  char z
20cc0 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  Buf[1000];..  if
20cd0 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a  ( nLine>sizeof(z
20ce0 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e  Buf)-30 ) return
20cf0 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d  ;.  if( zLine[0]
20d00 3d 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30  =='.' || zLine[0
20d10 5d 3d 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a  ]=='#') return;.
20d20 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b    for(i=nLine-1;
20d30 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75   i>=0 && (isalnu
20d40 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a  m(zLine[i]) || z
20d50 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69  Line[i]=='_'); i
20d60 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e  --){}.  if( i==n
20d70 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b  Line-1 ) return;
20d80 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b  .  iStart = i+1;
20d90 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
20da0 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a  zLine, iStart);.
20db0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
20dc0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
20dd0 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
20de0 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
20df0 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
20e10 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
20e20 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20  %Q,%Q) ORDER BY 
20e30 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c               &zL
20e50 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69  ine[iStart], zLi
20e60 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ne);.  sqlite3_p
20e70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
20e80 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
20e90 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
20ea0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
20eb0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
20ec0 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41  lobalDb, "PRAGMA
20ed0 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c   page_count", 0,
20ee0 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20   0, 0); /* Load 
20ef0 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
20f00 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
20f10 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
20f20 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
20f30 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c  nst char *zCompl
20f40 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63  etion = (const c
20f50 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
20f60 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
20f70 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d  0);.    int nCom
20f80 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  pletion = sqlite
20f90 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
20fa0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
20fb0 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65  ( iStart+nComple
20fc0 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42  tion < sizeof(zB
20fd0 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  uf)-1 ){.      m
20fe0 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72  emcpy(zBuf+iStar
20ff0 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20  t, zCompletion, 
21000 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a  nCompletion+1);.
21010 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41        linenoiseA
21020 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c  ddCompletion(lc,
21030 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
21040 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
21050 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23  lize(pStmt);.}.#
21060 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
21070 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65  C-language style
21080 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a   dequoting..**.*
21090 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c  *    \a    -> al
210a0 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20  arm.**    \b    
210b0 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20  -> backspace.** 
210c0 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
210d0 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
210e0 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20  ewline.**    \v 
210f0 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74     -> vertical t
21100 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d  ab.**    \f    -
21110 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20  > form feed.**  
21120 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
21130 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
21140 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a   \s    -> space.
21150 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22  **    \"    -> "
21160 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20  .**    \'    -> 
21170 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  '.**    \\    ->
21180 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20   backslash.**   
21190 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
211a0 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
211b0 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63   octal.*/.static
211c0 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
211d0 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
211e0 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
211f0 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c    char c;.  whil
21200 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c  e( *z && *z!='\\
21210 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69  ' ) z++;.  for(i
21220 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
21230 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  !=0; i++, j++){.
21240 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
21250 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a  && z[i+1]!=0 ){.
21260 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
21270 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
21280 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  a' ){.        c 
21290 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65  = '\a';.      }e
212a0 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29  lse if( c=='b' )
212b0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
212c0 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  b';.      }else 
212d0 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
212e0 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
212f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21300 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20  c=='n' ){.      
21310 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
21320 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
21330 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  v' ){.        c 
21340 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65  = '\v';.      }e
21350 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
21360 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
21370 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f';.      }else 
21380 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
21390 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
213a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
213b0 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
213c0 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20    c = '"';.     
213d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
213e0 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  '' ){.        c 
213f0 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65  = '\'';.      }e
21400 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
21410 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
21420 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
21430 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
21440 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
21450 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
21460 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
21470 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
21480 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
21490 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
214a0 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
214b0 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
214c0 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
214d0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
214e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
214f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
21500 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
21510 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
21520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21540 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
21550 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20   if( j<i ) z[j] 
21560 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
21570 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
21580 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
21590 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76  r or a boolean v
215a0 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20  alue.  Return 1 
215b0 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45  or 0.** for TRUE
215c0 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74   and FALSE.  Ret
215d0 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  urn the integer 
215e0 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72  value if appropr
215f0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
21600 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
21610 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
21620 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
21630 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
21640 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
21650 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
21660 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
21670 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b  rg[i])>=0; i++){
21680 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
21690 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e  or(i=0; zArg[i]>
216a0 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c  ='0' && zArg[i]<
216b0 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  ='9'; i++){}.  }
216c0 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41  .  if( i>0 && zA
216d0 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  rg[i]==0 ) retur
216e0 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56  n (int)(integerV
216f0 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66  alue(zArg) & 0xf
21700 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20  fffffff);.  if( 
21710 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21720 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c  zArg, "on")==0 |
21730 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
21740 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30  p(zArg,"yes")==0
21750 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
21760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
21770 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
21780 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73  , "off")==0 || s
21790 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
217a0 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a  Arg,"no")==0 ){.
217b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
217c0 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  }.  utf8_printf(
217d0 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
217e0 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  Not a boolean va
217f0 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73  lue: \"%s\". Ass
21800 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22  uming \"no\".\n"
21810 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  ,.          zArg
21820 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
21830 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
21840 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61  lear a shell fla
21850 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  g according to a
21860 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
21870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
21880 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68  etOrClearFlag(Sh
21890 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73  ellState *p, uns
218a0 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e  igned mFlag, con
218b0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
218c0 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
218d0 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  ue(zArg) ){.    
218e0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
218f0 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  mFlag);.  }else{
21900 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46  .    ShellClearF
21910 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20  lag(p, mFlag);. 
21920 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
21930 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  e an output file
21940 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73  , assuming it is
21950 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73   not stderr or s
21960 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  tdout.*/.static 
21970 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65  void output_file
21980 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b  _close(FILE *f){
21990 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73  .  if( f && f!=s
219a0 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65  tdout && f!=stde
219b0 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a  rr ) fclose(f);.
219c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
219d0 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66  open an output f
219e0 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73  ile.   The names
219f0 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73   "stdout" and "s
21a00 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65  tderr" are.** re
21a10 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20  cognized and do 
21a20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e  the right thing.
21a30 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
21a40 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
21a50 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  .** filename is 
21a60 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  "off"..*/.static
21a70 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69   FILE *output_fi
21a80 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  le_open(const ch
21a90 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62  ar *zFile, int b
21aa0 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c  TextMode){.  FIL
21ab0 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63  E *f;.  if( strc
21ac0 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74  mp(zFile,"stdout
21ad0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
21ae0 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65   stdout;.  }else
21af0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
21b00 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20  e, "stderr")==0 
21b10 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72  ){.    f = stder
21b20 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  r;.  }else if( s
21b30 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66  trcmp(zFile, "of
21b40 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  f")==0 ){.    f 
21b50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21b60 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c    f = fopen(zFil
21b70 65 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22  e, bTextMode ? "
21b80 77 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20  w" : "wb");.    
21b90 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
21ba0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
21bb0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
21bc0 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
21bd0 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
21be0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21bf0 66 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  f;.}..#ifndef SQ
21c00 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
21c10 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20  /*.** A routine 
21c20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74  for handling out
21c30 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  put from sqlite3
21c40 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61  _trace()..*/.sta
21c50 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63  tic int sql_trac
21c60 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e  e_callback(.  un
21c70 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20  signed mType,   
21c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61        /* The tra
21c90 63 65 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69  ce type */.  voi
21ca0 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  d *pArg,        
21cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c       /* The Shel
21cc0 6c 53 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a  lState pointer *
21cd0 2f 0a 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20  /.  void *pP,   
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
21cf0 73 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  sually a pointer
21d00 20 74 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20   to sqlite_stmt 
21d10 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20  */.  void *pX   
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d30 41 75 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74  Auxiliary output
21d40 20 2a 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74   */.){.  ShellSt
21d50 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
21d60 74 61 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71  tate*)pArg;.  sq
21d70 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21d80 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
21d90 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71  *zSql;.  int nSq
21da0 6c 3b 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63  l;.  if( p->trac
21db0 65 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  eOut==0 ) return
21dc0 20 30 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d   0;.  if( mType=
21dd0 3d 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c  =SQLITE_TRACE_CL
21de0 4f 53 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  OSE ){.    utf8_
21df0 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f  printf(p->traceO
21e00 75 74 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20  ut, "-- closing 
21e10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21e20 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ion\n");.    ret
21e30 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
21e40 20 6d 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54   mType!=SQLITE_T
21e50 52 41 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f  RACE_ROW && ((co
21e60 6e 73 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d  nst char*)pX)[0]
21e70 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71  =='-' ){.    zSq
21e80 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
21e90 29 70 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )pX;.  }else{.  
21ea0 20 20 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74    pStmt = (sqlit
21eb0 65 33 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20  e3_stmt*)pP;.   
21ec0 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61   switch( p->eTra
21ed0 63 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ceType ){.      
21ee0 63 61 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  case SHELL_TRACE
21ef0 5f 45 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20  _EXPANDED: {.   
21f00 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
21f10 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c  te3_expanded_sql
21f20 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
21f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
21f50 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20  ABLE_NORMALIZE. 
21f60 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
21f70 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
21f80 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c  : {.        zSql
21f90 20 3d 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61   = sqlite3_norma
21fa0 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29  lized_sql(pStmt)
21fb0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
21fc0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21fd0 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
21fe0 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  .        zSql = 
21ff0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
22000 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
22010 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
22020 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d  .  }.  if( zSql=
22030 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22040 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30   nSql = strlen30
22050 28 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28  (zSql);.  while(
22060 20 6e 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b   nSql>0 && zSql[
22070 6e 53 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20  nSql-1]==';' ){ 
22080 6e 53 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74  nSql--; }.  swit
22090 63 68 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20  ch( mType ){.   
220a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41   case SQLITE_TRA
220b0 43 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65  CE_ROW:.    case
220c0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54   SQLITE_TRACE_ST
220d0 4d 54 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38  MT: {.      utf8
220e0 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65  _printf(p->trace
220f0 4f 75 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20  Out, "%.*s;\n", 
22100 6e 53 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  nSql, zSql);.   
22110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
22120 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22130 54 52 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b  TRACE_PROFILE: {
22140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
22150 6e 74 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20  nt64 nNanosec = 
22160 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
22170 29 70 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  )pX;.      utf8_
22180 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f  printf(p->traceO
22190 75 74 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c  ut, "%.*s; -- %l
221a0 6c 64 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20  ld ns\n", nSql, 
221b0 7a 53 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b  zSql, nNanosec);
221c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
221d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
221e0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
221f0 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74  .** A no-op rout
22200 69 6e 65 20 74 68 61 74 20 72 75 6e 73 20 77 69  ine that runs wi
22210 74 68 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f  th the ".breakpo
22220 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64  int" doc-command
22230 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20  .  This is.** a 
22240 75 73 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73  useful spot to s
22250 65 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72  et a debugger br
22260 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  eakpoint..*/.sta
22270 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72  tic void test_br
22280 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a  eakpoint(void){.
22290 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61    static int nCa
222a0 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b  ll = 0;.  nCall+
222b0 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  +;.}../*.** An o
222c0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
222d0 61 64 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68  ad a CSV and oth
222e0 65 72 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70  er files for imp
222f0 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ort..*/.typedef 
22300 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78  struct ImportCtx
22310 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75   ImportCtx;.stru
22320 63 74 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20  ct ImportCtx {. 
22330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
22340 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  le;  /* Name of 
22350 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
22360 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
22370 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
22380 74 68 65 20 43 53 56 20 74 65 78 74 20 66 72 6f  the CSV text fro
22390 6d 20 74 68 69 73 20 69 6e 70 75 74 20 73 74 72  m this input str
223a0 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  eam */.  char *z
223b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
223c0 41 63 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74  Accumulated text
223d0 20 66 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a   for a field */.
223e0 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
223f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22400 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f  of bytes in z */
22410 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
22420 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
22430 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b  allocated for z[
22440 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  ] */.  int nLine
22450 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
22460 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65  rrent line numbe
22470 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46  r */.  int bNotF
22480 69 72 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  irst;      /* Tr
22490 75 65 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ue if one or mor
224a0 65 20 62 79 74 65 73 20 61 6c 72 65 61 64 79 20  e bytes already 
224b0 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54  read */.  int cT
224c0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  erm;          /*
224d0 20 43 68 61 72 61 63 74 65 72 20 74 68 61 74 20   Character that 
224e0 74 65 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d  terminated the m
224f0 6f 73 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64  ost recent field
22500 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65   */.  int cColSe
22510 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
22520 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
22530 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
22540 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20  sually ",") */. 
22550 20 69 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20   int cRowSep;   
22560 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20       /* The row 
22570 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
22580 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
22590 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41  \n") */.};../* A
225a0 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62  ppend a single b
225b0 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74  yte to z[] */.st
225c0 61 74 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74  atic void import
225d0 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70  _append_char(Imp
225e0 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63  ortCtx *p, int c
225f0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e  ){.  if( p->n+1>
22600 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  =p->nAlloc ){.  
22610 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70    p->nAlloc += p
22620 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a  ->nAlloc + 100;.
22630 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74      p->z = sqlit
22640 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
22650 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20  z, p->nAlloc);. 
22660 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29     if( p->z==0 )
22670 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
22680 6d 6f 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d  mory();.  }.  p-
22690 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68  >z[p->n++] = (ch
226a0 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  ar)c;.}../* Read
226b0 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
226c0 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f  of CSV text.  Co
226d0 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72 66  mpatible with rf
226e0 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64  c4180 and extend
226f0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f  ed.** with the o
22700 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20  ption of having 
22710 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65  a separator othe
22720 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a  r than ","..**.*
22730 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
22740 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
22750 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
22760 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
22770 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
22780 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
22790 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
227a0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
227b0 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  oc64()..**   +  
227c0 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74  Use p->cSep as t
227d0 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  he column separa
227e0 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
227f0 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b  t is ","..**   +
22800 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73    Use p->rSep as
22810 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
22820 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
22830 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b   is "\n"..**   +
22840 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20    Keep track of 
22850 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
22860 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20  in p->nLine..** 
22870 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63    +  Store the c
22880 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
22890 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65  rminates the fie
228a0 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20  ld in p->cTerm. 
228b0 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45   Store.**      E
228c0 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c  OF on end-of-fil
228d0 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72  e..**   +  Repor
228e0 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20  t syntax errors 
228f0 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61  on stderr.*/.sta
22900 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45  tic char *SQLITE
22910 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f  _CDECL csv_read_
22920 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
22930 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
22940 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
22950 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
22960 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
22970 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
22980 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
22990 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
229a0 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
229b0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
229c0 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
229d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
229e0 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69   c=='"' ){.    i
229f0 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20  nt pc, ppc;.    
22a00 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20  int startLine = 
22a10 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e  p->nLine;.    in
22a20 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20  t cQuote = c;.  
22a30 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a    pc = ppc = 0;.
22a40 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
22a50 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
22a60 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  p->in);.      if
22a70 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e  ( c==rSep ) p->n
22a80 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Line++;.      if
22a90 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20  ( c==cQuote ){. 
22aa0 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63         if( pc==c
22ab0 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Quote ){.       
22ac0 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20     pc = 0;.     
22ad0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
22ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22af0 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63  .      if( (c==c
22b00 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
22b10 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
22b20 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75  =rSep && pc==cQu
22b30 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
22b40 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27  c==rSep && pc=='
22b50 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f  \r' && ppc==cQuo
22b60 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
22b70 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75  ==EOF && pc==cQu
22b80 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ote).      ){.  
22b90 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d        do{ p->n--
22ba0 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70  ; }while( p->z[p
22bb0 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a  ->n]!=cQuote );.
22bc0 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d          p->cTerm
22bd0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72   = c;.        br
22be0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
22bf0 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74     if( pc==cQuot
22c00 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a  e && c!='\r' ){.
22c10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
22c20 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
22c30 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63  %d: unescaped %c
22c40 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20   character\n",. 
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22c60 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e  ->zFile, p->nLin
22c70 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  e, cQuote);.    
22c80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
22c90 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20  =EOF ){.        
22ca0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22cb0 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65  rr, "%s:%d: unte
22cc0 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74  rminated %c-quot
22cd0 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20  ed field\n",.   
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
22cf0 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65  zFile, startLine
22d00 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20  , cQuote);.     
22d10 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
22d20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d        }.      im
22d40 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
22d50 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70  (p, c);.      pp
22d60 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63  c = pc;.      pc
22d70 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = c;.    }.  }e
22d80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
22d90 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
22da0 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72   field being par
22db0 73 65 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e  sed and it begin
22dc0 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a  s with the.    *
22dd0 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78  * UTF-8 BOM  (0x
22de0 45 46 20 42 42 20 42 46 29 20 74 68 65 6e 20 73  EF BB BF) then s
22df0 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20  kip the BOM */. 
22e00 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d     if( (c&0xff)=
22e10 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74  =0xef && p->bNot
22e20 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
22e30 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
22e40 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
22e50 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
22e60 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63  n);.      if( (c
22e70 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a  &0xff)==0xbb ){.
22e80 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61          import_a
22e90 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
22ea0 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66 67  ;.        c = fg
22eb0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
22ec0 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
22ed0 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20  ==0xbf ){.      
22ee0 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74      p->bNotFirst
22ef0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
22f00 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  p->n = 0;.      
22f10 20 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72      return csv_r
22f20 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29  ead_one_field(p)
22f30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68    }.    }.    wh
22f50 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63  ile( c!=EOF && c
22f60 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65  !=cSep && c!=rSe
22f70 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72  p ){.      impor
22f80 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
22f90 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66   c);.      c = f
22fa0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
22fb0 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53   }.    if( c==rS
22fc0 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ep ){.      p->n
22fd0 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Line++;.      if
22fe0 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a  ( p->n>0 && p->z
22ff0 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29  [p->n-1]=='\r' )
23000 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   p->n--;.    }. 
23010 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b     p->cTerm = c;
23020 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20  .  }.  if( p->z 
23030 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30  ) p->z[p->n] = 0
23040 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74  ;.  p->bNotFirst
23050 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
23060 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20  ->z;.}../* Read 
23070 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f  a single field o
23080 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65  f ASCII delimite
23090 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  d text..**.**   
230a0 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66  +  Input comes f
230b0 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20  rom p->in..**   
230c0 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  +  Store results
230d0 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67   in p->z of leng
230e0 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20  th p->n.  Space 
230f0 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d  to hold p->z com
23100 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  es.**      from 
23110 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
23120 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20  ()..**   +  Use 
23130 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20 63  p->cSep as the c
23140 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e  olumn separator.
23150 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
23160 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1F"..**   + 
23170 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20   Use p->rSep as 
23180 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  the row separato
23190 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
231a0 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20  is "\x1E"..**   
231b0 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  +  Keep track of
231c0 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20   the row number 
231d0 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20  in p->nLine..** 
231e0 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63    +  Store the c
231f0 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
23200 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69 65  rminates the fie
23210 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20  ld in p->cTerm. 
23220 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45   Store.**      E
23230 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c  OF on end-of-fil
23240 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72  e..**   +  Repor
23250 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20  t syntax errors 
23260 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61  on stderr.*/.sta
23270 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45  tic char *SQLITE
23280 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61  _CDECL ascii_rea
23290 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f  d_one_field(Impo
232a0 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74  rtCtx *p){.  int
232b0 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d   c;.  int cSep =
232c0 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69   p->cColSep;.  i
232d0 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f  nt rSep = p->cRo
232e0 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30  wSep;.  p->n = 0
232f0 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d  ;.  c = fgetc(p-
23300 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45  >in);.  if( c==E
23310 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72  OF || seenInterr
23320 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54  upt ){.    p->cT
23330 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72  erm = EOF;.    r
23340 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77  eturn 0;.  }.  w
23350 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
23360 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53  c!=cSep && c!=rS
23370 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74  ep ){.    import
23380 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
23390 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74  c);.    c = fget
233a0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20  c(p->in);.  }.  
233b0 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20  if( c==rSep ){. 
233c0 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20     p->nLine++;. 
233d0 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20   }.  p->cTerm = 
233e0 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20  c;.  if( p->z ) 
233f0 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
23400 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d    return p->z;.}
23410 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74  ../*.** Try to t
23420 72 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72  ransfer data for
23430 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20   table zTable.  
23440 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  If an error is s
23450 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76  een while.** mov
23460 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79  ing forward, try
23470 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73   to go backwards
23480 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72 64 73  .  The backwards
23490 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a   movement won't.
234a0 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48  ** work for WITH
234b0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
234c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
234d0 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28   tryToCloneData(
234e0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
234f0 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77  ,.  sqlite3 *new
23500 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
23510 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71   *zTable.){.  sq
23520 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65  lite3_stmt *pQue
23530 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ry = 0;.  sqlite
23540 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20  3_stmt *pInsert 
23550 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75  = 0;.  char *zQu
23560 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ery = 0;.  char 
23570 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20  *zInsert = 0;.  
23580 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c  int rc;.  int i,
23590 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61   j, n;.  int nTa
235a0 62 6c 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  ble = strlen30(z
235b0 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20  Table);.  int k 
235c0 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  = 0;.  int cnt =
235d0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   0;.  const int 
235e0 73 70 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30  spinRate = 10000
235f0 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71  ;..  zQuery = sq
23600 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
23610 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
23620 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  w\"", zTable);. 
23630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
23640 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
23650 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
23660 65 72 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ery, 0);.  if( r
23670 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
23680 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
23690 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
236a0 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
236b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
236c0 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  ded_errcode(p->d
236d0 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
236e0 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20  sg(p->db),.     
236f0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
23700 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
23710 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20  a_xfer;.  }.  n 
23720 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
23730 5f 63 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a  _count(pQuery);.
23740 20 20 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69    zInsert = sqli
23750 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30  te3_malloc64(200
23760 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29   + nTable + n*3)
23770 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d  ;.  if( zInsert=
23780 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
23790 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71  f_memory();.  sq
237a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
237b0 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72  00+nTable,zInser
237c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
237d0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
237e0 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25   IGNORE INTO \"%
237f0 73 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  s\" VALUES(?", z
23800 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74  Table);.  i = st
23810 72 6c 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b  rlen30(zInsert);
23820 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b  .  for(j=1; j<n;
23830 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70   j++){.    memcp
23840 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f  y(zInsert+i, ",?
23850 22 2c 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20  ", 2);.    i += 
23860 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  2;.  }.  memcpy(
23870 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c  zInsert+i, ");",
23880 20 33 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   3);.  rc = sqli
23890 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e  te3_prepare_v2(n
238a0 65 77 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d  ewDb, zInsert, -
238b0 31 2c 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b  1, &pInsert, 0);
238c0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
238d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
238e0 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20  err, "Error %d: 
238f0 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20  %s on [%s]\n",. 
23900 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23910 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
23920 6f 64 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69  ode(newDb), sqli
23930 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
23940 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
23950 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f  Query);.    goto
23960 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
23970 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b    }.  for(k=0; k
23980 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68  <2; k++){.    wh
23990 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
239a0 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
239b0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
239c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
239d0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
239e0 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65    switch( sqlite
239f0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51  3_column_type(pQ
23a00 75 65 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20  uery, i) ){.    
23a10 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
23a20 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  E_NULL: {.      
23a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
23a40 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c  nd_null(pInsert,
23a50 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20   i+1);.         
23a60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23a80 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
23a90 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
23aa0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
23ab0 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69  int64(pInsert, i
23ac0 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
23ad0 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c  mn_int64(pQuery,
23ae0 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i));.           
23af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23b00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
23b10 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
23b20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
23b30 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
23b40 6c 65 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  le(pInsert, i+1,
23b50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23b60 64 6f 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29  double(pQuery,i)
23b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
23b80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23b90 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
23ba0 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a   SQLITE_TEXT: {.
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23bc0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49  te3_bind_text(pI
23bd0 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20  nsert, i+1,.    
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20           (const 
23c00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
23c10 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
23c20 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41    -1, SQLITE_STA
23c50 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
23c60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
23c80 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
23c90 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
23ca0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
23cb0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
23cc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
23cd0 6f 62 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  ob(pQuery,i),.  
23ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23d10 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
23d20 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41        SQLITE_STA
23d60 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
23d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23d90 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f       } /* End fo
23da0 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  r */.      rc = 
23db0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e  sqlite3_step(pIn
23dc0 73 65 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28  sert);.      if(
23dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
23de0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
23df0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44   && rc!=SQLITE_D
23e00 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ONE ){.        u
23e10 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
23e20 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
23e30 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74  \n", sqlite3_ext
23e40 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65  ended_errcode(ne
23e50 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  wDb),.          
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23e70 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
23e80 44 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Db));.      }.  
23e90 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
23ea0 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  t(pInsert);.    
23eb0 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69    cnt++;.      i
23ec0 66 28 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65  f( (cnt%spinRate
23ed0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23ee0 70 72 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22  printf("%c\b", "
23ef0 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e  |/-\\"[(cnt/spin
23f00 52 61 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20  Rate)%4]);.     
23f10 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
23f20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23f30 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f   /* End while */
23f40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23f50 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b  ITE_DONE ) break
23f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
23f70 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
23f80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23f90 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51  (zQuery);.    zQ
23fa0 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d  uery = sqlite3_m
23fb0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
23fc0 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44   FROM \"%w\" ORD
23fd0 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
23fe0 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;",.            
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63   zTable);.    rc
24010 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
24020 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
24030 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
24040 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
24050 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
24060 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
24070 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73  arning: cannot s
24080 74 65 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77  tep \"%s\" backw
24090 61 72 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ards", zTable);.
240a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
240b0 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f   }.  } /* End fo
240c0 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e  r(k=0...) */..en
240d0 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73  d_data_xfer:.  s
240e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
240f0 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
24100 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73  e3_finalize(pIns
24110 65 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ert);.  sqlite3_
24120 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
24130 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e  sqlite3_free(zIn
24140 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  sert);.}.../*.**
24150 20 54 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72   Try to transfer
24160 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
24170 20 73 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74   schema that mat
24180 63 68 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a  ch zWhere.  For.
24190 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76  ** each row, inv
241a0 6f 6b 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f  oke xForEach() o
241b0 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66  n the object def
241c0 69 6e 65 64 20 62 79 20 74 68 61 74 20 72 6f 77  ined by that row
241d0 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
241e0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
241f0 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72  while moving for
24200 77 61 72 64 20 74 68 72 6f 75 67 68 20 74 68 65  ward through the
24210 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  .** sqlite_maste
24220 72 20 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61  r table, try aga
24230 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61  in moving backwa
24240 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rds..*/.static v
24250 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63  oid tryToCloneSc
24260 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61  hema(.  ShellSta
24270 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  te *p,.  sqlite3
24280 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74   *newDb,.  const
24290 20 63 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20   char *zWhere,. 
242a0 20 76 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68   void (*xForEach
242b0 29 28 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71  )(ShellState*,sq
242c0 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61  lite3*,const cha
242d0 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
242e0 5f 73 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20  _stmt *pQuery = 
242f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
24300 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
24310 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
24320 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  d char *zName;. 
24330 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
24340 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
24350 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
24360 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c  ..  zQuery = sql
24370 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
24380 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
24390 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
243a0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
243c0 57 48 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72  WHERE %s", zWher
243d0 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
243e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
243f0 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
24400 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
24410 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
24420 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24430 2c 20 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25  , "Error: (%d) %
24440 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
24470 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
24480 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
24490 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51                zQ
244b0 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
244c0 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b  end_schema_xfer;
244d0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72  .  }.  while( (r
244e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
244f0 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
24500 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61  E_ROW ){.    zNa
24510 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  me = sqlite3_col
24520 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
24530 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20   0);.    zSql = 
24540 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24550 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a  ext(pQuery, 1);.
24560 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e      printf("%s..
24570 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c  . ", zName); ffl
24580 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
24590 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
245a0 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
245b0 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  *)zSql, 0, 0, &z
245c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
245d0 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
245e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
245f0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
24600 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  \nSQL: [%s]\n", 
24610 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrMsg, zSql);.
24620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24630 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
24640 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
24650 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46      }.    if( xF
24660 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20  orEach ){.      
24670 78 46 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44  xForEach(p, newD
24680 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
24690 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
246a0 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e    printf("done\n
246b0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ");.  }.  if( rc
246c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  !=SQLITE_DONE ){
246d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
246e0 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
246f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24700 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75  zQuery);.    zQu
24710 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
24720 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61  rintf("SELECT na
24730 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  me, sql FROM sql
24740 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
24750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24760 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
24770 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77   %s ORDER BY row
24780 69 64 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65  id DESC", zWhere
24790 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
247a0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
247b0 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
247c0 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
247d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
247e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
247f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
24800 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
24810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
24820 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24830 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
24840 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
24850 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
24860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24870 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
24880 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
24890 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20  chema_xfer;.    
248a0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
248b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
248c0 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
248d0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e  _ROW ){.      zN
248e0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ame = sqlite3_co
248f0 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
24900 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c  , 0);.      zSql
24910 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24920 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31  n_text(pQuery, 1
24930 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
24940 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
24950 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
24960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24970 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e  exec(newDb, (con
24980 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30  st char*)zSql, 0
24990 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
249a0 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73        if( zErrMs
249b0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  g ){.        utf
249c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
249d0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c   "Error: %s\nSQL
249e0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d  : [%s]\n", zErrM
249f0 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  sg, zSql);.     
24a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24a10 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
24a20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
24a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24a40 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20   xForEach ){.   
24a50 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
24a60 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
24a70 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
24a80 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
24a90 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20  f("done\n");.   
24aa0 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d   }.  }.end_schem
24ab0 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65  a_xfer:.  sqlite
24ac0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
24ad0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
24ae0 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f  ee(zQuery);.}../
24af0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
24b00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
24b10 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54  med "zNewDb".  T
24b20 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73  ry to recover as
24b30 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f   much informatio
24b40 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65  n.** as possible
24b50 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
24b60 20 64 61 74 61 62 61 73 65 20 28 77 68 69 63 68   database (which
24b70 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
24b80 74 29 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a  t) and write it.
24b90 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a  ** into zNewDb..
24ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
24bb0 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53  ryToClone(ShellS
24bc0 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
24bd0 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20  har *zNewDb){.  
24be0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
24bf0 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20  3 *newDb = 0;.  
24c00 69 66 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44  if( access(zNewD
24c10 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  b,0)==0 ){.    u
24c20 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
24c30 72 2c 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20  r, "File \"%s\" 
24c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c  already exists.\
24c50 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20  n", zNewDb);.   
24c60 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
24c70 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
24c80 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29  (zNewDb, &newDb)
24c90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
24ca0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
24cb0 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72  derr, "Cannot cr
24cc0 65 61 74 65 20 6f 75 74 70 75 74 20 64 61 74 61  eate output data
24cd0 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  base: %s\n",.   
24ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24cf0 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b  _errmsg(newDb));
24d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
24d10 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
24d20 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
24d30 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20  le_schema=ON;", 
24d40 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
24d50 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
24d60 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49  , "BEGIN EXCLUSI
24d70 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  VE;", 0, 0, 0);.
24d80 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63      tryToCloneSc
24d90 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22  hema(p, newDb, "
24da0 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74  type='table'", t
24db0 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a  ryToCloneData);.
24dc0 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63      tryToCloneSc
24dd0 68 65 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22  hema(p, newDb, "
24de0 74 79 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20  type!='table'", 
24df0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
24e00 65 78 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d  exec(newDb, "COM
24e10 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MIT;", 0, 0, 0);
24e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
24e30 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
24e40 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
24e50 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29  =OFF;", 0, 0, 0)
24e60 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62  ;.  }.  close_db
24e70 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (newDb);.}../*.*
24e80 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74  * Change the out
24e90 70 75 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  put file back to
24ea0 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49   stdout..**.** I
24eb0 66 20 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70  f the p->doXdgOp
24ec0 65 6e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  en flag is set, 
24ed0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f  that means the o
24ee0 75 74 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a  utput was being.
24ef0 2a 2a 20 72 65 64 69 72 65 63 74 65 64 20 74 6f  ** redirected to
24f00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
24f10 65 20 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54  e named by p->zT
24f20 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61  empFile.  In tha
24f30 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63  t case,.** launc
24f40 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67  h start/open/xdg
24f50 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65  -open on that te
24f60 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f  mporary file..*/
24f70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
24f80 70 75 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53  put_reset(ShellS
24f90 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  tate *p){.  if( 
24fa0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27  p->outfile[0]=='
24fb0 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  |' ){.#ifndef SQ
24fc0 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a  LITE_OMIT_POPEN.
24fd0 20 20 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75      pclose(p->ou
24fe0 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  t);.#endif.  }el
24ff0 73 65 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66  se{.    output_f
25000 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74  ile_close(p->out
25010 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
25020 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
25030 20 20 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67      if( p->doXdg
25040 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f  Open ){.      co
25050 6e 73 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70  nst char *zXdgOp
25060 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69  enCmd =.#if defi
25070 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20  ned(_WIN32).    
25080 20 20 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66    "start";.#elif
25090 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
250a0 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22  __).      "open"
250b0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78  ;.#else.      "x
250c0 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66  dg-open";.#endif
250d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d  .      char *zCm
250e0 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20  d;.      zCmd = 
250f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
25100 22 25 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65  "%s %s", zXdgOpe
25110 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69  nCmd, p->zTempFi
25120 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  le);.      if( s
25130 79 73 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20  ystem(zCmd) ){. 
25140 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
25150 74 66 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c  tf(stderr, "Fail
25160 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d  ed: [%s]\n", zCm
25170 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
25180 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25190 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  Cmd);.      outp
251a0 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20  utModePop(p);.  
251b0 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e      p->doXdgOpen
251c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 0;.    }.#end
251d0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
251e0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
251f0 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20 20 70 2d  TEM) */.  }.  p-
25200 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30 3b  >outfile[0] = 0;
25210 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f  .  p->out = stdo
25220 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  ut;.}../*.** Run
25230 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20   an SQL command 
25240 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
25250 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72 65  ingle integer re
25260 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
25270 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c 6c  int db_int(Shell
25280 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
25290 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73  char *zSql){.  s
252a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
252b0 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  mt;.  int res = 
252c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  0;.  sqlite3_pre
252d0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
252e0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
252f0 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74   0);.  if( pStmt
25300 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70   && sqlite3_step
25310 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
25320 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  ROW ){.    res =
25330 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
25340 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20  int(pStmt,0);.  
25350 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
25360 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72  lize(pStmt);.  r
25370 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
25380 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32 2d  .** Convert a 2-
25390 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20 62  byte or 4-byte b
253a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
253b0 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65 20  r into a native 
253c0 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74 69  integer.*/.stati
253d0 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67  c unsigned int g
253e0 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69 67  et2byteInt(unsig
253f0 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
25400 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38 29  return (a[0]<<8)
25410 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74 69   + a[1];.}.stati
25420 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 67  c unsigned int g
25430 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69 67  et4byteInt(unsig
25440 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20 20  ned char *a){.  
25450 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32 34  return (a[0]<<24
25460 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20 2b  ) + (a[1]<<16) +
25470 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b 33   (a[2]<<8) + a[3
25480 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ];.}../*.** Impl
25490 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
254a0 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e  e ".info" comman
254b0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
254c0 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f  1 on error, 2 to
254d0 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68   exit, and 0 oth
254e0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
254f0 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69 6e  c int shell_dbin
25500 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c  fo_command(Shell
25510 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e 41  State *p, int nA
25520 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
25530 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
25540 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
25550 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69 6e   char *zName; in
25560 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c 64  t ofst; } aField
25570 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 66  [] = {.     { "f
25580 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
25590 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20 20  er:",  24  },.  
255a0 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 20 70     { "database p
255b0 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32 38  age count:",  28
255c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72 65    },.     { "fre
255d0 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e 74  elist page count
255e0 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20 20  :",  36  },.    
255f0 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b 69   { "schema cooki
25600 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20 20  e:",        40  
25610 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
25620 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20 20  a format:",     
25630 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20 7b     44  },.     {
25640 20 22 64 65 66 61 75 6c 74 20 63 61 63 68 65 20   "default cache 
25650 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d 2c  size:",   48  },
25660 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61 63  .     { "autovac
25670 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c 20  uum top root:", 
25680 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   52  },.     { "
25690 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
256a0 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a 20  um:",   64  },. 
256b0 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63 6f      { "text enco
256c0 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20 35  ding:",        5
256d0 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73  6  },.     { "us
256e0 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20  er version:",   
256f0 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20 20        60  },.   
25700 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f 6e    { "application
25710 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38 20   id:",       68 
25720 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66 74   },.     { "soft
25730 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c 20  ware version:", 
25740 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b 0a      96  },.  };.
25750 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
25760 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68  truct { const ch
25770 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73 74  ar *zName; const
25780 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20 61   char *zSql; } a
25790 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20  Query[] = {.    
257a0 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 61   { "number of ta
257b0 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  bles:",.       "
257c0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
257d0 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
257e0 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a 20  pe='table'" },. 
257f0 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
25800 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20 20   indexes:",.    
25810 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
25820 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
25830 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 20  E type='index'" 
25840 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65  },.     { "numbe
25850 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22 2c  r of triggers:",
25860 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  .       "SELECT 
25870 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73  count(*) FROM %s
25880 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69   WHERE type='tri
25890 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20 7b  gger'" },.     {
258a0 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65 77   "number of view
258b0 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  s:",.       "SEL
258c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
258d0 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d  M %s WHERE type=
258e0 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20 20  'view'" },.     
258f0 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a 22  { "schema size:"
25900 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
25910 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73 71   total(length(sq
25920 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c 0a  l)) FROM %s" },.
25930 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63    };.  int i, rc
25940 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61  ;.  unsigned iDa
25950 74 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61  taVersion;.  cha
25960 72 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20  r *zSchemaTab;. 
25970 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72   char *zDb = nAr
25980 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g>=2 ? azArg[1] 
25990 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69  : "main";.  sqli
259a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
259b0 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
259c0 63 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a  char aHdr[100];.
259d0 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
259e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
259f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 63  ) return 1;.  rc
25a00 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
25a10 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20  re_v2(p->db,.   
25a20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
25a30 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69  T data FROM sqli
25a40 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48  te_dbpage(?1) WH
25a50 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20  ERE pgno=1",.   
25a60 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
25a70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
25a80 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 73  rc ){.    if( !s
25a90 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
25aa0 74 69 6f 6e 5f 75 73 65 64 28 22 45 4e 41 42 4c  tion_used("ENABL
25ab0 45 5f 44 42 50 41 47 45 5f 56 54 41 42 22 29 20  E_DBPAGE_VTAB") 
25ac0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
25ad0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 74 68  intf(stderr, "th
25ae0 65 20 5c 22 2e 64 62 69 6e 66 6f 5c 22 20 63 6f  e \".dbinfo\" co
25af0 6d 6d 61 6e 64 20 72 65 71 75 69 72 65 73 20 74  mmand requires t
25b00 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  he ".           
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25b20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
25b30 44 42 50 41 47 45 5f 56 54 41 42 20 63 6f 6d 70  DBPAGE_VTAB comp
25b40 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
25b50 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  \n");.    }else{
25b60 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
25b70 74 66 28 73 74 64 65 72 72 2c 20 22 65 72 72 6f  tf(stderr, "erro
25b80 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
25b90 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
25ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25bb0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
25bc0 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  mt);.    return 
25bd0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
25be0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
25bf0 2c 20 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51  , 1, zDb, -1, SQ
25c00 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
25c10 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
25c20 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
25c30 52 4f 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ROW.   && sqlite
25c40 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
25c50 53 74 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b  Stmt,0)>100.  ){
25c60 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72  .    memcpy(aHdr
25c70 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
25c80 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20  _blob(pStmt,0), 
25c90 31 30 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  100);.    sqlite
25ca0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
25cb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25cc0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
25cd0 72 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65  r, "unable to re
25ce0 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
25cf0 65 72 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69  er\n");.    sqli
25d00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
25d10 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  mt);.    return 
25d20 31 3b 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74  1;.  }.  i = get
25d30 32 62 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36  2byteInt(aHdr+16
25d40 29 3b 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20  );.  if( i==1 ) 
25d50 69 20 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66  i = 65536;.  utf
25d60 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
25d70 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22   "%-20s %d\n", "
25d80 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
25d90 7a 65 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38  ze:", i);.  utf8
25da0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
25db0 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77  "%-20s %d\n", "w
25dc0 72 69 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61  rite format:", a
25dd0 48 64 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38  Hdr[18]);.  utf8
25de0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
25df0 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72  "%-20s %d\n", "r
25e00 65 61 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48  ead format:", aH
25e10 64 72 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f  dr[19]);.  utf8_
25e20 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
25e30 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65  %-20s %d\n", "re
25e40 73 65 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20  served bytes:", 
25e50 61 48 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72  aHdr[20]);.  for
25e60 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
25e70 65 28 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b  e(aField); i++){
25e80 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20  .    int ofst = 
25e90 61 46 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a  aField[i].ofst;.
25ea0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
25eb0 20 76 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49   val = get4byteI
25ec0 6e 74 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b  nt(aHdr + ofst);
25ed0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
25ee0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
25ef0 25 75 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a  %u", aField[i].z
25f00 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20  Name, val);.    
25f10 73 77 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a  switch( ofst ){.
25f20 20 20 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b        case 56: {
25f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
25f40 3d 3d 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==1 ) raw_printf
25f50 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38  (p->out, " (utf8
25f60 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )");.        if(
25f70 20 76 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72   val==2 ) raw_pr
25f80 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28  intf(p->out, " (
25f90 75 74 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20  utf16le)");.    
25fa0 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29      if( val==3 )
25fb0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
25fc0 75 74 2c 20 22 20 28 75 74 66 31 36 62 65 29 22  ut, " (utf16be)"
25fd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25fe0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
25ff0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
26000 20 7d 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20   }.  if( zDb==0 
26010 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  ){.    zSchemaTa
26020 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
26030 6e 74 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65  ntf("main.sqlite
26040 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
26050 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44  se if( strcmp(zD
26060 62 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a  b,"temp")==0 ){.
26070 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
26080 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26090 28 22 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74  ("%s", "sqlite_t
260a0 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20  emp_master");.  
260b0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65  }else{.    zSche
260c0 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
260d0 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e  mprintf("\"%w\".
260e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
260f0 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  zDb);.  }.  for(
26100 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
26110 28 61 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a  (aQuery); i++){.
26120 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
26130 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26140 28 61 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c  (aQuery[i].zSql,
26150 20 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20   zSchemaTab);.  
26160 20 20 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69    int val = db_i
26170 6e 74 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  nt(p, zSql);.   
26180 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
26190 71 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  ql);.    utf8_pr
261a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
261b0 32 30 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72  20s %d\n", aQuer
261c0 79 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29  y[i].zName, val)
261d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
261e0 66 72 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29  free(zSchemaTab)
261f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
26200 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20  _control(p->db, 
26210 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
26220 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f 4e 2c 20  L_DATA_VERSION, 
26230 26 69 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a  &iDataVersion);.
26240 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
26250 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 5c  >out, "%-20s %u\
26260 6e 22 2c 20 22 64 61 74 61 20 76 65 72 73 69 6f  n", "data versio
26270 6e 22 2c 20 69 44 61 74 61 56 65 72 73 69 6f 6e  n", iDataVersion
26280 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
26290 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
262a0 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
262b0 33 5f 65 72 72 6d 73 67 28 29 20 76 61 6c 75 65  3_errmsg() value
262c0 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
262d0 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74  eturn 1..*/.stat
262e0 69 63 20 69 6e 74 20 73 68 65 6c 6c 44 61 74 61  ic int shellData
262f0 62 61 73 65 45 72 72 6f 72 28 73 71 6c 69 74 65  baseError(sqlite
26300 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
26310 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c  char *zErr = sql
26320 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 3b  ite3_errmsg(db);
26330 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
26340 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
26350 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72  s\n", zErr);.  r
26360 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
26370 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61  * Compare the pa
26380 74 74 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d  ttern in zGlob[]
26390 20 61 67 61 69 6e 73 74 20 74 68 65 20 74 65 78   against the tex
263a0 74 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72  t in z[].  Retur
263b0 6e 20 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65  n TRUE.** if the
263c0 79 20 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53  y match and FALS
263d0 45 20 28 30 29 20 69 66 20 74 68 65 79 20 64 6f  E (0) if they do
263e0 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a   not match..**.*
263f0 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73  * Globbing rules
26400 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27  :.**.**      '*'
26410 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
26420 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a  ny sequence of z
26430 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  ero or more char
26440 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
26450 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74     '?'       Mat
26460 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  ches exactly one
26470 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a   character..**.*
26480 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20  *     [...]     
26490 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
264a0 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20  racter from the 
264b0 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66  enclosed list of
264c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
264d0 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a     characters..*
264e0 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20  *.**     [^...] 
264f0 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
26500 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e  character not in
26510 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
26520 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  st..**.**      '
26530 23 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  #'       Matches
26540 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
26550 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67   one or more dig
26560 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20  its with an.**  
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
26580 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69  tional + or - si
26590 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a  gn in front.**.*
265a0 2a 20 20 20 20 20 20 27 20 27 20 20 20 20 20 20  *      ' '      
265b0 20 41 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69   Any span of whi
265c0 74 65 73 70 61 63 65 20 6d 61 74 63 68 65 73 20  tespace matches 
265d0 61 6e 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f  any other span o
265e0 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
265f0 20 20 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a      whitespace..
26600 2a 2a 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74  **.** Extra whit
26610 65 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e  espace at the en
26620 64 20 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f  d of z[] is igno
26630 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
26640 6e 74 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62  nt testcase_glob
26650 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c  (const char *zGl
26660 6f 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ob, const char *
26670 7a 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b  z){.  int c, c2;
26680 0a 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20  .  int invert;. 
26690 20 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68   int seen;..  wh
266a0 69 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c  ile( (c = (*(zGl
266b0 6f 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20  ob++)))!=0 ){.  
266c0 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
266d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49   ){.      if( !I
266e0 73 53 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74  sSpace(*z) ) ret
266f0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69  urn 0;.      whi
26700 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c  le( IsSpace(*zGl
26710 6f 62 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20  ob) ) zGlob++;. 
26720 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
26730 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
26740 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
26750 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69  '*' ){.      whi
26760 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b  le( (c=(*(zGlob+
26770 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63  +))) == '*' || c
26780 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='?' ){.       
26790 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28   if( c=='?' && (
267a0 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74  *(z++))==0 ) ret
267b0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
267c0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
267d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
267e0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
267f0 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
26800 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26       while( *z &
26810 26 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  & testcase_glob(
26820 7a 47 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b  zGlob-1,z)==0 ){
26830 0a 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a  .          z++;.
26840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26850 20 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30    return (*z)!=0
26860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26870 77 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28  while( (c2 = (*(
26880 7a 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  z++)))!=0 ){.   
26890 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d       while( c2!=
268a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  c ){.          c
268b0 32 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  2 = *(z++);.    
268c0 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
268d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
268e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
268f0 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  ( testcase_glob(
26900 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72  zGlob,z) ) retur
26910 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
26920 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
26930 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f   }else if( c=='?
26940 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ' ){.      if( (
26950 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74  *(z++))==0 ) ret
26960 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
26970 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20   if( c=='[' ){. 
26980 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63       int prior_c
26990 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e   = 0;.      seen
269a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65   = 0;.      inve
269b0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20  rt = 0;.      c 
269c0 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
269d0 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
269e0 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20  n 0;.      c2 = 
269f0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
26a00 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b    if( c2=='^' ){
26a10 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72 74 20  .        invert 
26a20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
26a30 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
26a40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26a50 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2==']' ){.     
26a60 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
26a70 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
26a80 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
26a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
26aa0 20 77 68 69 6c 65 28 20 63 32 20 26 26 20 63 32   while( c2 && c2
26ab0 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
26ac0 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20   if( c2=='-' && 
26ad0 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26  zGlob[0]!=']' &&
26ae0 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20   zGlob[0]!=0 && 
26af0 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20  prior_c>0 ){.   
26b00 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
26b10 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  lob++);.        
26b20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63    if( c>=prior_c
26b30 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e   && c<=c2 ) seen
26b40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
26b50 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
26b60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26b70 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20        if( c==c2 
26b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
26b90 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
26ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
26bb0 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20  rior_c = c2;.   
26bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
26bd0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
26be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26bf0 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e  ( c2==0 || (seen
26c00 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20   ^ invert)==0 ) 
26c10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
26c20 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29  lse if( c=='#' )
26c30 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30  {.      if( (z[0
26c40 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d  ]=='-' || z[0]==
26c50 27 2b 27 29 20 26 26 20 49 73 44 69 67 69 74 28  '+') && IsDigit(
26c60 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  z[1]) ) z++;.   
26c70 20 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28     if( !IsDigit(
26c80 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[0]) ) return 0
26c90 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  ;.      z++;.   
26ca0 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
26cb0 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20  t(z[0]) ){ z++; 
26cc0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
26cd0 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b     if( c!=(*(z++
26ce0 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  )) ) return 0;. 
26cf0 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65     }.  }.  while
26d00 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b  ( IsSpace(*z) ){
26d10 20 7a 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e   z++; }.  return
26d20 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   *z==0;.}.../*.*
26d30 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74  * Compare the st
26d40 72 69 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e  ring as a comman
26d50 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69  d-line option wi
26d60 74 68 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72  th either one or
26d70 20 74 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   two.** initial 
26d80 22 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a  "-" characters..
26d90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
26da0 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
26db0 63 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73  char *zStr, cons
26dc0 74 20 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20  t char *zOpt){. 
26dd0 20 69 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d   if( zStr[0]!='-
26de0 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
26df0 7a 53 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53  zStr++;.  if( zS
26e00 74 72 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74  tr[0]=='-' ) zSt
26e10 72 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74  r++;.  return st
26e20 72 63 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29  rcmp(zStr, zOpt)
26e30 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ==0;.}../*.** De
26e40 6c 65 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lete a file..*/.
26e50 69 6e 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46  int shellDeleteF
26e60 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ile(const char *
26e70 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  zFilename){.  in
26e80 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49  t rc;.#ifdef _WI
26e90 4e 33 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a  N32.  wchar_t *z
26ea0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
26eb0 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
26ec0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72  (zFilename);.  r
26ed0 63 20 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b  c = _wunlink(z);
26ee0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26ef0 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  z);.#else.  rc =
26f00 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
26f10 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  e);.#endif.  ret
26f20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26f30 20 54 72 79 20 74 6f 20 64 65 6c 65 74 65 20 74   Try to delete t
26f40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
26f50 65 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f  e (if there is o
26f60 6e 65 29 20 61 6e 64 20 66 72 65 65 20 74 68 65  ne) and free the
26f70 0a 2a 2a 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  .** memory used 
26f80 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
26f90 20 6f 66 20 74 68 65 20 74 65 6d 70 20 66 69 6c   of the temp fil
26fa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26fb0 64 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28  d clearTempFile(
26fc0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
26fd0 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69    if( p->zTempFi
26fe0 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  le==0 ) return;.
26ff0 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
27000 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  en ) return;.  i
27010 66 28 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69  f( shellDeleteFi
27020 6c 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  le(p->zTempFile)
27030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
27040 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65  ite3_free(p->zTe
27050 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54  mpFile);.  p->zT
27060 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 7d 0a 0a  empFile = 0;.}..
27070 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
27080 65 77 20 74 65 6d 70 20 66 69 6c 65 20 6e 61 6d  ew temp file nam
27090 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  e with the given
270a0 20 73 75 66 66 69 78 2e 0a 2a 2f 0a 73 74 61 74   suffix..*/.stat
270b0 69 63 20 76 6f 69 64 20 6e 65 77 54 65 6d 70 46  ic void newTempF
270c0 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ile(ShellState *
270d0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
270e0 53 75 66 66 69 78 29 7b 0a 20 20 63 6c 65 61 72  Suffix){.  clear
270f0 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 20 20 73  TempFile(p);.  s
27100 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
27110 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  TempFile);.  p->
27120 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
27130 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20   if( p->db ){.  
27140 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
27150 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 30 2c  ontrol(p->db, 0,
27160 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
27170 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 70 2d 3e  MPFILENAME, &p->
27180 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  zTempFile);.  }.
27190 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69    if( p->zTempFi
271a0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
271b0 69 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20  ite3_uint64 r;. 
271c0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
271d0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c  mness(sizeof(r),
271e0 20 26 72 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 65   &r);.    p->zTe
271f0 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  mpFile = sqlite3
27200 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c  _mprintf("temp%l
27210 6c 78 2e 25 73 22 2c 20 72 2c 20 7a 53 75 66 66  lx.%s", r, zSuff
27220 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ix);.  }else{.  
27230 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
27240 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27250 28 22 25 7a 2e 25 73 22 2c 20 70 2d 3e 7a 54 65  ("%z.%s", p->zTe
27260 6d 70 46 69 6c 65 2c 20 7a 53 75 66 66 69 78 29  mpFile, zSuffix)
27270 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
27280 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
27290 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
272a0 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65  derr, "out of me
272b0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mory\n");.    ex
272c0 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  it(1);.  }.}.../
272d0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
272e0 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 20 73  ntation of SQL s
272f0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
27300 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
27310 73 65 28 29 2c 20 75 73 65 64 0a 2a 2a 20 62 79  se(), used.** by
27320 20 74 68 65 20 22 2e 6c 69 6e 74 20 66 6b 65 79   the ".lint fkey
27330 2d 69 6e 64 65 78 65 73 22 20 63 6f 6d 6d 61 6e  -indexes" comman
27340 64 2e 20 54 68 69 73 20 73 63 61 6c 61 72 20 66  d. This scalar f
27350 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  unction is alway
27360 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
27370 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20   four arguments 
27380 2d 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  - the parent tab
27390 6c 65 20 6e 61 6d 65 2c 20 74 68 65 20 70 61 72  le name, the par
273a0 65 6e 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  ent column name,
273b0 0a 2a 2a 20 74 68 65 20 63 68 69 6c 64 20 74 61  .** the child ta
273c0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
273d0 20 63 68 69 6c 64 20 63 6f 6c 75 6d 6e 20 6e 61   child column na
273e0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6b 65 79  me..**.**   fkey
273f0 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
27400 27 70 61 72 65 6e 74 2d 74 61 62 27 2c 20 27 70  'parent-tab', 'p
27410 61 72 65 6e 74 2d 63 6f 6c 27 2c 20 27 63 68 69  arent-col', 'chi
27420 6c 64 2d 74 61 62 27 2c 20 27 63 68 69 6c 64 2d  ld-tab', 'child-
27430 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a 20 49 66 20 65  col').**.** If e
27440 69 74 68 65 72 20 6f 66 20 74 68 65 20 6e 61 6d  ither of the nam
27450 65 64 20 74 61 62 6c 65 73 20 6f 72 20 63 6f 6c  ed tables or col
27460 75 6d 6e 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  umns do not exis
27470 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
27480 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
27490 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 41 6e 20  mpty string. An 
274a0 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
274b0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
274c0 20 62 6f 74 68 20 74 61 62 6c 65 73 0a 2a 2a 20   both tables.** 
274d0 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 65 78 69 73  and columns exis
274e0 74 20 62 75 74 20 68 61 76 65 20 74 68 65 20 73  t but have the s
274f0 61 6d 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  ame default coll
27500 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20  ation sequence. 
27510 4f 72 2c 0a 2a 2a 20 69 66 20 62 6f 74 68 20 65  Or,.** if both e
27520 78 69 73 74 20 62 75 74 20 74 68 65 20 64 65 66  xist but the def
27530 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
27540 65 71 75 65 6e 63 65 73 20 61 72 65 20 64 69 66  equences are dif
27550 66 65 72 65 6e 74 2c 20 74 68 69 73 0a 2a 2a 20  ferent, this.** 
27560 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27570 20 74 68 65 20 73 74 72 69 6e 67 20 22 20 43 4f   the string " CO
27580 4c 4c 41 54 45 20 3c 70 61 72 65 6e 74 2d 63 6f  LLATE <parent-co
27590 6c 6c 61 74 69 6f 6e 3e 22 2c 20 77 68 65 72 65  llation>", where
275a0 0a 2a 2a 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c  .** <parent-coll
275b0 61 74 69 6f 6e 3e 20 69 73 20 74 68 65 20 64 65  ation> is the de
275c0 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
275d0 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20  sequence of the 
275e0 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 2e 0a 2a  parent column..*
275f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
27600 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c  ellFkeyCollateCl
27610 61 75 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  ause(.  sqlite3_
27620 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20  context *pCtx,. 
27630 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c   int nVal,.  sql
27640 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
27650 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  al.){.  sqlite3 
27660 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
27670 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
27680 70 43 74 78 29 3b 0a 20 20 63 6f 6e 73 74 20 63  pCtx);.  const c
27690 68 61 72 20 2a 7a 50 61 72 65 6e 74 3b 0a 20 20  har *zParent;.  
276a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
276b0 65 6e 74 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  entCol;.  const 
276c0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 53 65 71  char *zParentSeq
276d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
276e0 7a 43 68 69 6c 64 3b 0a 20 20 63 6f 6e 73 74 20  zChild;.  const 
276f0 63 68 61 72 20 2a 7a 43 68 69 6c 64 43 6f 6c 3b  char *zChildCol;
27700 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27710 43 68 69 6c 64 53 65 71 20 3d 20 30 3b 20 20 2f  ChildSeq = 0;  /
27720 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 6f 20  * Initialize to 
27730 61 76 6f 69 64 20 66 61 6c 73 65 2d 70 6f 73 69  avoid false-posi
27740 74 69 76 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  tive warning */.
27750 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
27760 65 72 74 28 20 6e 56 61 6c 3d 3d 34 20 29 3b 0a  ert( nVal==4 );.
27770 20 20 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e    zParent = (con
27780 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
27790 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
277a0 6c 5b 30 5d 29 3b 0a 20 20 7a 50 61 72 65 6e 74  l[0]);.  zParent
277b0 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
277c0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
277d0 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b  _text(apVal[1]);
277e0 0a 20 20 7a 43 68 69 6c 64 20 3d 20 28 63 6f 6e  .  zChild = (con
277f0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
27800 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
27810 6c 5b 32 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 43  l[2]);.  zChildC
27820 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
27830 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
27840 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a  text(apVal[3]);.
27850 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
27860 74 5f 74 65 78 74 28 70 43 74 78 2c 20 22 22 2c  t_text(pCtx, "",
27870 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
27880 49 43 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  IC);.  rc = sqli
27890 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
278a0 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
278b0 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 50 61   db, "main", zPa
278c0 72 65 6e 74 2c 20 7a 50 61 72 65 6e 74 43 6f 6c  rent, zParentCol
278d0 2c 20 30 2c 20 26 7a 50 61 72 65 6e 74 53 65 71  , 0, &zParentSeq
278e0 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  , 0, 0, 0.  );. 
278f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27900 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
27910 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
27920 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
27930 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22        db, "main"
27940 2c 20 7a 43 68 69 6c 64 2c 20 7a 43 68 69 6c 64  , zChild, zChild
27950 43 6f 6c 2c 20 30 2c 20 26 7a 43 68 69 6c 64 53  Col, 0, &zChildS
27960 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20  eq, 0, 0, 0.    
27970 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
27980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
27990 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
279a0 50 61 72 65 6e 74 53 65 71 2c 20 7a 43 68 69 6c  ParentSeq, zChil
279b0 64 53 65 71 29 20 29 7b 0a 20 20 20 20 63 68 61  dSeq) ){.    cha
279c0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  r *z = sqlite3_m
279d0 70 72 69 6e 74 66 28 22 20 43 4f 4c 4c 41 54 45  printf(" COLLATE
279e0 20 25 73 22 2c 20 7a 50 61 72 65 6e 74 53 65 71   %s", zParentSeq
279f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
27a00 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
27a10 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54   z, -1, SQLITE_T
27a20 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
27a30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
27a40 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
27a50 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
27a60 20 6f 66 20 64 6f 74 2d 63 6f 6d 6d 61 6e 64 20   of dot-command 
27a70 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
27a80 78 65 73 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xes"..*/.static 
27a90 69 6e 74 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65  int lintFkeyInde
27aa0 78 65 73 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xes(.  ShellStat
27ab0 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
27ac0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
27ad0 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
27ae0 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
27af0 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
27b00 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
27b10 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
27b20 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
27b30 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
27b40 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
27b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b60 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
27b70 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
27b80 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
27b90 53 74 61 74 65 2d 3e 64 62 3b 20 20 20 20 20 20  State->db;      
27ba0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
27bb0 64 6c 65 20 74 6f 20 71 75 65 72 79 20 22 6d 61  dle to query "ma
27bc0 69 6e 22 20 64 62 20 6f 66 20 2a 2f 0a 20 20 46  in" db of */.  F
27bd0 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74  ILE *out = pStat
27be0 65 2d 3e 6f 75 74 3b 20 20 20 20 20 20 20 20 2f  e->out;        /
27bf0 2a 20 53 74 72 65 61 6d 20 74 6f 20 77 72 69 74  * Stream to writ
27c00 65 20 6e 6f 6e 2d 65 72 72 6f 72 20 6f 75 74 70  e non-error outp
27c10 75 74 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62  ut to */.  int b
27c20 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20  Verbose = 0;    
27c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27c40 20 2d 76 65 72 62 6f 73 65 20 69 73 20 70 72 65   -verbose is pre
27c50 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 47  sent */.  int bG
27c60 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d 20 30  roupByParent = 0
27c70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
27c80 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 20 69  -groupbyparent i
27c90 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
27ca0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27cc0 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
27cd0 6f 75 67 68 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  ough azArg[] */.
27ce0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
27cf0 6e 64 65 6e 74 20 3d 20 22 22 3b 20 20 20 20 20  ndent = "";     
27d00 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 74 6f    /* How much to
27d10 20 69 6e 64 65 6e 74 20 43 52 45 41 54 45 20 49   indent CREATE I
27d20 4e 44 45 58 20 62 79 20 2a 2f 0a 20 20 69 6e 74  NDEX by */.  int
27d30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d50 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
27d60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27d70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sql = 0;        
27d80 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 76 65 72   /* Compiled ver
27d90 73 69 6f 6e 20 6f 66 20 53 51 4c 20 73 74 61 74  sion of SQL stat
27da0 65 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  ement below */..
27db0 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 53    /*.  ** This S
27dc0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27dd0 72 65 74 75 72 6e 73 20 6f 6e 65 20 72 6f 77 20  returns one row 
27de0 66 6f 72 20 65 61 63 68 20 66 6f 72 65 69 67 6e  for each foreign
27df0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
27e00 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 63 68 65    ** in the sche
27e10 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ma of the main d
27e20 61 74 61 62 61 73 65 2e 20 54 68 65 20 63 6f 6c  atabase. The col
27e30 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 3a 0a  umn values are:.
27e40 20 20 2a 2a 0a 20 20 2a 2a 20 30 2e 20 54 68 65    **.  ** 0. The
27e50 20 74 65 78 74 20 6f 66 20 61 6e 20 53 51 4c 20   text of an SQL 
27e60 73 74 61 74 65 6d 65 6e 74 20 73 69 6d 69 6c 61  statement simila
27e70 72 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  r to:.  **.  ** 
27e80 20 20 20 20 20 22 45 58 50 4c 41 49 4e 20 51 55       "EXPLAIN QU
27e90 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
27ea0 31 20 46 52 4f 4d 20 63 68 69 6c 64 5f 74 61 62  1 FROM child_tab
27eb0 6c 65 20 57 48 45 52 45 20 63 68 69 6c 64 5f 6b  le WHERE child_k
27ec0 65 79 3d 3f 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ey=?".  **.  ** 
27ed0 20 20 20 54 68 69 73 20 53 45 4c 45 43 54 20 69     This SELECT i
27ee0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
27ef0 20 6f 6e 65 20 74 68 61 74 20 74 68 65 20 66 6f   one that the fo
27f00 72 65 69 67 6e 20 6b 65 79 73 20 69 6d 70 6c 65  reign keys imple
27f10 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 2a 2a 20 20  mentation.  **  
27f20 20 20 6e 65 65 64 73 20 74 6f 20 72 75 6e 20 69    needs to run i
27f30 6e 74 65 72 6e 61 6c 6c 79 20 6f 6e 20 63 68 69  nternally on chi
27f40 6c 64 20 74 61 62 6c 65 73 2e 20 49 66 20 74 68  ld tables. If th
27f50 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
27f60 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 20 20  that can.  **   
27f70 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74 69   be used to opti
27f80 6d 69 7a 65 20 74 68 69 73 20 71 75 65 72 79 2c  mize this query,
27f90 20 74 68 65 6e 20 69 74 20 63 61 6e 20 61 6c 73   then it can als
27fa0 6f 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  o be used by the
27fb0 20 46 4b 0a 20 20 2a 2a 20 20 20 20 69 6d 70 6c   FK.  **    impl
27fc0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 6f 70  ementation to op
27fd0 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20 6f 72  timize DELETE or
27fe0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
27ff0 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ts on the parent
28000 0a 20 20 2a 2a 20 20 20 20 74 61 62 6c 65 2e 0a  .  **    table..
28010 20 20 2a 2a 0a 20 20 2a 2a 20 31 2e 20 41 20 47    **.  ** 1. A G
28020 4c 4f 42 20 70 61 74 74 65 72 6e 20 73 75 69 74  LOB pattern suit
28030 61 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  able for sqlite3
28040 5f 73 74 72 67 6c 6f 62 28 29 2e 20 49 66 20 74  _strglob(). If t
28050 68 65 20 70 6c 61 6e 20 6f 75 74 70 75 74 20 62  he plan output b
28060 79 0a 20 20 2a 2a 20 20 20 20 74 68 65 20 45 58  y.  **    the EX
28070 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28080 20 63 6f 6d 6d 61 6e 64 20 6d 61 74 63 68 65 73   command matches
28090 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
280a0 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 20  hen the schema. 
280b0 20 2a 2a 20 20 20 20 63 6f 6e 74 61 69 6e 73 20   **    contains 
280c0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  an index that ca
280d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74  n be used to opt
280e0 69 6d 69 7a 65 20 74 68 65 20 71 75 65 72 79 2e  imize the query.
280f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 2e 20 48 75  .  **.  ** 2. Hu
28100 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78  man readable tex
28110 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  t that describes
28120 20 74 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65   the child table
28130 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
28140 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
28150 20 20 20 22 63 68 69 6c 64 5f 74 61 62 6c 65 28     "child_table(
28160 63 68 69 6c 64 5f 6b 65 79 31 2c 20 63 68 69 6c  child_key1, chil
28170 64 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20 20  d_key2)".  **.  
28180 2a 2a 20 33 2e 20 48 75 6d 61 6e 20 72 65 61 64  ** 3. Human read
28190 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64  able text that d
281a0 65 73 63 72 69 62 65 73 20 74 68 65 20 70 61 72  escribes the par
281b0 65 6e 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ent table and co
281c0 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a  lumns. e.g..  **
281d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 70 61 72  .  **       "par
281e0 65 6e 74 5f 74 61 62 6c 65 28 70 61 72 65 6e 74  ent_table(parent
281f0 5f 6b 65 79 31 2c 20 70 61 72 65 6e 74 5f 6b 65  _key1, parent_ke
28200 79 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 34  y2)".  **.  ** 4
28210 2e 20 41 20 66 75 6c 6c 20 43 52 45 41 54 45 20  . A full CREATE 
28220 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
28230 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61  for an index tha
28240 74 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  t could be used 
28250 74 6f 0a 20 20 2a 2a 20 20 20 20 6f 70 74 69 6d  to.  **    optim
28260 69 7a 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50  ize DELETE or UP
28270 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
28280 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  on the parent ta
28290 62 6c 65 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  ble. e.g..  **. 
282a0 20 2a 2a 20 20 20 20 20 20 20 22 43 52 45 41 54   **       "CREAT
282b0 45 20 49 4e 44 45 58 20 63 68 69 6c 64 5f 74 61  E INDEX child_ta
282c0 62 6c 65 5f 63 68 69 6c 64 5f 6b 65 79 20 4f 4e  ble_child_key ON
282d0 20 63 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69   child_table(chi
282e0 6c 64 5f 6b 65 79 29 22 0a 20 20 2a 2a 0a 20 20  ld_key)".  **.  
282f0 2a 2a 20 35 2e 20 54 68 65 20 6e 61 6d 65 20 6f  ** 5. The name o
28300 66 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  f the parent tab
28310 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  le..  **.  ** Th
28320 65 73 65 20 73 69 78 20 76 61 6c 75 65 73 20 61  ese six values a
28330 72 65 20 75 73 65 64 20 62 79 20 74 68 65 20 43  re used by the C
28340 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 74 6f 20   logic below to 
28350 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 70  generate the rep
28360 6f 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73  ort..  */.  cons
28370 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 0a 20  t char *zSql =. 
28380 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22   "SELECT ".    "
28390 20 20 20 20 20 27 45 58 50 4c 41 49 4e 20 51 55       'EXPLAIN QU
283a0 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
283b0 31 20 46 52 4f 4d 20 27 20 7c 7c 20 71 75 6f 74  1 FROM ' || quot
283c0 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 20 57  e(s.name) || ' W
283d0 48 45 52 45 20 27 22 0a 20 20 20 20 22 20 20 7c  HERE '".    "  |
283e0 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71  | group_concat(q
283f0 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
28400 27 2e 27 20 7c 7c 20 71 75 6f 74 65 28 66 2e 5b  '.' || quote(f.[
28410 66 72 6f 6d 5d 29 20 7c 7c 20 27 3d 3f 27 20 22  from]) || '=?' "
28420 0a 20 20 20 20 22 20 20 7c 7c 20 66 6b 65 79 5f  .    "  || fkey_
28430 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 22  collate_clause("
28440 0a 20 20 20 20 22 20 20 20 20 20 20 20 66 2e 5b  .    "       f.[
28450 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45  table], COALESCE
28460 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65  (f.[to], p.[name
28470 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66  ]), s.name, f.[f
28480 72 6f 6d 5d 29 2c 27 20 41 4e 44 20 27 29 22 0a  rom]),' AND ')".
28490 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
284a0 20 20 20 27 53 45 41 52 43 48 20 54 41 42 4c 45     'SEARCH TABLE
284b0 20 27 20 7c 7c 20 73 2e 6e 61 6d 65 20 7c 7c 20   ' || s.name || 
284c0 27 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47  ' USING COVERING
284d0 20 49 4e 44 45 58 2a 28 27 22 0a 20 20 20 20 22   INDEX*('".    "
284e0 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
284f0 74 28 27 2a 3d 3f 27 2c 20 27 20 41 4e 44 20 27  t('*=?', ' AND '
28500 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
28510 20 22 0a 20 20 20 20 22 20 20 20 20 20 73 2e 6e   ".    "     s.n
28520 61 6d 65 20 20 7c 7c 20 27 28 27 20 7c 7c 20 67  ame  || '(' || g
28530 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
28540 72 6f 6d 5d 2c 20 20 27 2c 20 27 29 20 7c 7c 20  rom],  ', ') || 
28550 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
28560 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
28570 5d 20 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75  ] || '(' || grou
28580 70 5f 63 6f 6e 63 61 74 28 43 4f 41 4c 45 53 43  p_concat(COALESC
28590 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d  E(f.[to], p.[nam
285a0 65 5d 29 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  e])) || ')'".   
285b0 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
285c0 27 43 52 45 41 54 45 20 49 4e 44 45 58 20 27 20  'CREATE INDEX ' 
285d0 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 20  || quote(s.name 
285e0 7c 7c 27 5f 27 7c 7c 20 67 72 6f 75 70 5f 63 6f  ||'_'|| group_co
285f0 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 27  ncat(f.[from], '
28600 5f 27 29 29 22 0a 20 20 20 20 22 20 20 7c 7c 20  _'))".    "  || 
28610 27 20 4f 4e 20 27 20 7c 7c 20 71 75 6f 74 65 28  ' ON ' || quote(
28620 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 28 27 22 0a  s.name) || '('".
28630 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
28640 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 66 2e 5b  concat(quote(f.[
28650 66 72 6f 6d 5d 29 20 7c 7c 22 0a 20 20 20 20 22  from]) ||".    "
28660 20 20 20 20 20 20 20 20 66 6b 65 79 5f 63 6f 6c          fkey_col
28670 6c 61 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20  late_clause(".  
28680 20 20 22 20 20 20 20 20 20 20 20 20 20 66 2e 5b    "          f.[
28690 74 61 62 6c 65 5d 2c 20 43 4f 41 4c 45 53 43 45  table], COALESCE
286a0 28 66 2e 5b 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65  (f.[to], p.[name
286b0 5d 29 2c 20 73 2e 6e 61 6d 65 2c 20 66 2e 5b 66  ]), s.name, f.[f
286c0 72 6f 6d 5d 29 2c 20 27 2c 20 27 29 22 0a 20 20  rom]), ', ')".  
286d0 20 20 22 20 20 7c 7c 20 27 29 3b 27 22 0a 20 20    "  || ');'".  
286e0 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
286f0 20 66 2e 5b 74 61 62 6c 65 5d 20 22 0a 20 20 20   f.[table] ".   
28700 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
28710 73 74 65 72 20 41 53 20 73 2c 20 70 72 61 67 6d  ster AS s, pragm
28720 61 5f 66 6f 72 65 69 67 6e 5f 6b 65 79 5f 6c 69  a_foreign_key_li
28730 73 74 28 73 2e 6e 61 6d 65 29 20 41 53 20 66 20  st(s.name) AS f 
28740 22 0a 20 20 20 20 22 4c 45 46 54 20 4a 4f 49 4e  ".    "LEFT JOIN
28750 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e   pragma_table_in
28760 66 6f 20 41 53 20 70 20 4f 4e 20 28 70 6b 2d 31  fo AS p ON (pk-1
28770 3d 73 65 71 20 41 4e 44 20 70 2e 61 72 67 3d 66  =seq AND p.arg=f
28780 2e 5b 74 61 62 6c 65 5d 29 20 22 0a 20 20 20 20  .[table]) ".    
28790 22 47 52 4f 55 50 20 42 59 20 73 2e 6e 61 6d 65  "GROUP BY s.name
287a0 2c 20 66 2e 69 64 20 22 0a 20 20 20 20 22 4f 52  , f.id ".    "OR
287b0 44 45 52 20 42 59 20 28 43 41 53 45 20 57 48 45  DER BY (CASE WHE
287c0 4e 20 3f 20 54 48 45 4e 20 66 2e 5b 74 61 62 6c  N ? THEN f.[tabl
287d0 65 5d 20 45 4c 53 45 20 73 2e 6e 61 6d 65 20 45  e] ELSE s.name E
287e0 4e 44 29 22 0a 20 20 3b 0a 20 20 63 6f 6e 73 74  ND)".  ;.  const
287f0 20 63 68 61 72 20 2a 7a 47 6c 6f 62 49 50 4b 20   char *zGlobIPK 
28800 3d 20 22 53 45 41 52 43 48 20 54 41 42 4c 45 20  = "SEARCH TABLE 
28810 2a 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20  * USING INTEGER 
28820 50 52 49 4d 41 52 59 20 4b 45 59 20 28 72 6f 77  PRIMARY KEY (row
28830 69 64 3d 3f 29 22 3b 0a 0a 20 20 66 6f 72 28 69  id=?)";..  for(i
28840 3d 32 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =2; i<nArg; i++)
28850 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74  {.    int n = st
28860 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 69 5d 29  rlen30(azArg[i])
28870 3b 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26  ;.    if( n>1 &&
28880 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
28890 70 28 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a  p("-verbose", az
288a0 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b  Arg[i], n)==0 ){
288b0 0a 20 20 20 20 20 20 62 56 65 72 62 6f 73 65 20  .      bVerbose 
288c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  = 1;.    }.    e
288d0 6c 73 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73  lse if( n>1 && s
288e0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
288f0 22 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22  "-groupbyparent"
28900 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d  , azArg[i], n)==
28910 30 20 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75  0 ){.      bGrou
28920 70 42 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20  pByParent = 1;. 
28930 20 20 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22       zIndent = "
28940 20 20 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20      ";.    }.   
28950 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77   else{.      raw
28960 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28970 22 55 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d  "Usage: %s %s ?-
28980 76 65 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70  verbose? ?-group
28990 62 79 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20  byparent?\n",.  
289a0 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d          azArg[0]
289b0 2c 20 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20  , azArg[1].     
289c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
289d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
289e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
289f0 65 67 69 73 74 65 72 20 74 68 65 20 66 6b 65 79  egister the fkey
28a00 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28  _collate_clause(
28a10 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a  ) SQL function *
28a20 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
28a30 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
28a40 28 64 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61  (db, "fkey_colla
28a50 74 65 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53  te_clause", 4, S
28a60 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
28a70 20 20 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f    0, shellFkeyCo
28a80 6c 6c 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20  llateClause, 0, 
28a90 30 0a 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72  0.  );...  if( r
28aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28ac0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
28ad0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c  zSql, -1, &pSql,
28ae0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
28af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28b00 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
28b10 5f 69 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47  _int(pSql, 1, bG
28b20 72 6f 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20  roupByParent);. 
28b30 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
28b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
28b50 6e 74 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72  nt rc2;.    char
28b60 20 2a 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20   *zPrev = 0;.   
28b70 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
28b80 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
28b90 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
28ba0 69 6e 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20  int res = -1;.  
28bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
28bc0 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a   *pExplain = 0;.
28bd0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
28be0 20 2a 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20   *zEQP = (const 
28bf0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
28c00 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
28c10 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  0);.      const 
28c20 63 68 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63  char *zGlob = (c
28c30 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
28c40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28c50 53 71 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63  Sql, 1);.      c
28c60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d  onst char *zFrom
28c70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
28c80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
28c90 65 78 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20  ext(pSql, 2);.  
28ca0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28cb0 7a 54 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74  zTarget = (const
28cc0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
28cd0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
28ce0 20 33 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   3);.      const
28cf0 20 63 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f   char *zCI = (co
28d00 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
28d10 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
28d20 71 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 4);.      co
28d30 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
28d40 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
28d50 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
28d60 74 65 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a  text(pSql, 5);..
28d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28d80 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
28d90 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78  , zEQP, -1, &pEx
28da0 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
28db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28dc0 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
28dd0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
28de0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
28df0 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20  Explain) ){.    
28e00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28e10 7a 50 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63  zPlan = (const c
28e20 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
28e30 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69  umn_text(pExplai
28e40 6e 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72  n, 3);.        r
28e50 65 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20  es = (.         
28e60 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f       0==sqlite3_
28e70 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a  strglob(zGlob, z
28e80 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20  Plan).          
28e90 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   || 0==sqlite3_s
28ea0 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c  trglob(zGlobIPK,
28eb0 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20   zPlan).        
28ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
28ee0 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
28ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
28f00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
28f10 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  k;..      if( re
28f20 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s<0 ){.        r
28f30 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28f40 2c 20 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e  , "Error: intern
28f50 61 6c 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20  al error");.    
28f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28f80 69 66 28 20 62 47 72 6f 75 70 42 79 50 61 72 65  if( bGroupByPare
28f90 6e 74 0a 20 20 20 20 20 20 20 20 26 26 20 28 62  nt.        && (b
28fa0 56 65 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d  Verbose || res==
28fb0 30 29 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a  0).        && (z
28fc0 50 72 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Prev==0 || sqlit
28fd0 65 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65  e3_stricmp(zPare
28fe0 6e 74 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20  nt, zPrev)).    
28ff0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
29000 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
29010 20 22 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c   "-- Parent tabl
29020 65 20 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74  e %s\n", zParent
29030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
29040 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29  ite3_free(zPrev)
29050 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 72 65  ;.          zPre
29060 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  v = sqlite3_mpri
29070 6e 74 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e  ntf("%s", zParen
29080 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  t);.        }.. 
29090 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
290a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
290b0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
290c0 25 73 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20  %s%s --> %s\n", 
290d0 7a 49 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54  zIndent, zCI, zT
290e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
290f0 7d 65 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f  }else if( bVerbo
29100 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
29110 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
29120 22 25 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69  "%s/* no extra i
29130 6e 64 65 78 65 73 20 72 65 71 75 69 72 65 64 20  ndexes required 
29140 66 6f 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c  for %s -> %s */\
29150 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29160 20 20 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d    zIndent, zFrom
29170 2c 20 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20  , zTarget.      
29180 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
29190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
291a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
291b0 7a 50 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28  zPrev);..    if(
291c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
291d0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
291e0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
291f0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
29200 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  g(db));.    }.. 
29210 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
29220 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b  _finalize(pSql);
29230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
29240 49 54 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53  ITE_OK && rc2!=S
29250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29260 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
29270 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29280 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
29290 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
292a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
292b0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
292c0 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
292d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
292e0 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  b));.  }..  retu
292f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29300 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
29310 66 20 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f  f ".lint" dot co
29320 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
29330 20 69 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d   int lintDotComm
29340 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  and(.  ShellStat
29350 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20  e *pState,      
29360 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29370 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61  t shell tool sta
29380 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  te */.  char **a
29390 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  zArg,           
293a0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
293b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
293c0 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d  ssed to dot comm
293d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  and */.  int nAr
293e0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
293f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29400 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
29410 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20   azArg[] */.){. 
29420 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e   int n;.  n = (n
29430 41 72 67 3e 3d 32 20 3f 20 73 74 72 6c 65 6e 33  Arg>=2 ? strlen3
29440 30 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  0(azArg[1]) : 0)
29450 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73  ;.  if( n<1 || s
29460 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
29470 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d  azArg[1], "fkey-
29480 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67  indexes", n) ) g
29490 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74  oto usage;.  ret
294a0 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65  urn lintFkeyInde
294b0 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72  xes(pState, azAr
294c0 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67  g, nArg);.. usag
294d0 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  e:.  raw_printf(
294e0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20 25  stderr, "Usage %
294f0 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73  s sub-command ?s
29500 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20  witches...?\n", 
29510 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77  azArg[0]);.  raw
29520 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29530 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61  "Where sub-comma
29540 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20  nds are:\n");.  
29550 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29560 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64  r, "    fkey-ind
29570 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75  exes\n");.  retu
29580 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
29590 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
295a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
295b0 54 55 41 4c 54 41 42 4c 45 0a 73 74 61 74 69 63  TUALTABLE.static
295c0 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61   void shellPrepa
295d0 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
295e0 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  b, .  int *pRc, 
295f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
29600 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  Sql, .  sqlite3_
29610 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b  stmt **ppStmt.){
29620 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
29630 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
29640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
29650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
29660 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
29670 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30  l, -1, ppStmt, 0
29680 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
296a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
296b0 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a  err, "sql error:
296c0 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20   %s (%d)\n", .  
296d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
296e0 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69  errmsg(db), sqli
296f0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a  te3_errcode(db).
29700 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a        );.      *
29710 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  pRc = rc;.    }.
29720 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
29730 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  id shellPrepareP
29740 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33  rintf(.  sqlite3
29750 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
29760 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  c, .  sqlite3_st
29770 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63  mt **ppStmt,.  c
29780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
29790 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70   .  ....){.  *pp
297a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
297b0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
297c0 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  ){.    va_list a
297d0 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  p;.    char *z;.
297e0 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
297f0 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20   zFmt);.    z = 
29800 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
29810 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
29820 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
29830 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
29840 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
29850 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
29860 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65  {.      shellPre
29870 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c  pare(db, pRc, z,
29880 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20   ppStmt);.      
29890 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
298a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
298b0 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46  atic void shellF
298c0 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a  inalize(.  int *
298d0 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
298e0 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
298f0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
29900 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
29910 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
29920 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e  e(pStmt);.    in
29930 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66  t rc = sqlite3_f
29940 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
29950 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51      if( *pRc==SQ
29960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  OK ){.        ra
29990 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
299a0 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
299b0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
299c0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d  sg(db));.      }
299d0 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63  .      *pRc = rc
299e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
299f0 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
29a00 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52  Reset(.  int *pR
29a10 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  c, .  sqlite3_st
29a20 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69  mt *pStmt.){.  i
29a30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29a40 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
29a50 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
29a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
29a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
29a90 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  b = sqlite3_db_h
29aa0 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20  andle(pStmt);.  
29ab0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29ac0 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
29ad0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
29ae0 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
29af0 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20     }.    *pRc = 
29b00 72 63 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  rc;.  }.}.#endif
29b10 20 2f 2a 20 21 64 65 66 69 6e 65 64 20 53 51 4c   /* !defined SQL
29b20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29b30 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 20 21 64  TABLE */..#if !d
29b40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29b50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
29b60 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
29b70 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a  TE_HAVE_ZLIB)./*
29b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bd0 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76  .** The ".archiv
29be0 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
29bf0 61 6e 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 74  and..*/./*.** St
29c00 72 75 63 74 75 72 65 20 72 65 70 72 65 73 65 6e  ructure represen
29c10 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e  ting a single ".
29c20 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
29c30 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41  typedef struct A
29c40 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61  rCommand ArComma
29c50 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d  nd;.struct ArCom
29c60 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64  mand {.  u8 eCmd
29c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41           /* An A
29c90 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f  R_CMD_* value */
29ca0 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20  .  u8 bVerbose; 
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
29cd0 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20  verbose */.  u8 
29ce0 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  bZip;           
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d00 54 72 75 65 20 69 66 20 74 68 65 20 61 72 63 68  True if the arch
29d10 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a  ive is a ZIP */.
29d20 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20    u8 bDryRun;   
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64    /* True if --d
29d50 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62  ry-run */.  u8 b
29d60 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20  Append;         
29d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29d80 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20  rue if --append 
29d90 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43 6d 64 4c  */.  u8 fromCmdL
29da0 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
29db0 20 20 20 20 20 2f 2a 20 52 75 6e 20 66 72 6f 6d       /* Run from
29dc0 20 2d 41 20 69 6e 73 74 65 61 64 20 6f 66 20 2e   -A instead of .
29dd0 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69 6e 74  archive */.  int
29de0 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e00 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e  Number of comman
29e10 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
29e20 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62 6c 65   char *zSrcTable
29e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29e40 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22 7a 69   /* "sqlar", "zi
29e50 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20 6f 72  pfile($file)" or
29e60 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f 6e 73   "zip" */.  cons
29e70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
29e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d              /* -
29e90 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74 2c 20  -file argument, 
29ea0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
29eb0 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 20 20  st char *zDir;  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ed0 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72 67 75  --directory argu
29ee0 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ment, or NULL */
29ef0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b  .  char **azArg;
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
29f20 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
29f30 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
29f40 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
29f50 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73        /* Shell s
29f60 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
29f70 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
29f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
29f90 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
29fa0 20 74 68 65 20 61 72 63 68 69 76 65 20 2a 2f 0a   the archive */.
29fb0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  };../*.** Print 
29fc0 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20  a usage message 
29fd0 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
29fe0 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
29ff0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
2a000 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
2a010 20 69 6e 74 20 61 72 55 73 61 67 65 28 46 49 4c   int arUsage(FIL
2a020 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77 48 65 6c  E *f){.  showHel
2a030 70 28 66 2c 22 61 72 63 68 69 76 65 22 29 3b 0a  p(f,"archive");.
2a040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a050 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
2a060 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  Print an error m
2a070 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e  essage for the .
2a080 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74  ar command to st
2a090 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
2a0a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
2a0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a0c0 61 72 45 72 72 6f 72 4d 73 67 28 41 72 43 6f 6d  arErrorMsg(ArCom
2a0d0 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74  mand *pAr, const
2a0e0 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
2a0f0 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2a100 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61  .  char *z;.  va
2a110 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
2a120 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
2a130 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
2a140 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2a150 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
2a160 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2a170 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69 66 28  %s\n", z);.  if(
2a180 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c 69 6e   pAr->fromCmdLin
2a190 65 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  e ){.    utf8_pr
2a1a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2a1b0 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20 6d 6f 72  e \"-A\" for mor
2a1c0 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 65  e help\n");.  }e
2a1d0 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
2a1e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2a1f0 65 20 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d 68  e \".archive --h
2a200 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65 20 68  elp\" for more h
2a210 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 73  elp\n");.  }.  s
2a220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
2a230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a240 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
2a250 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d  Values for ArCom
2a260 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64  mand.eCmd..*/.#d
2a270 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45  efine AR_CMD_CRE
2a280 41 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66  ATE       1.#def
2a290 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ine AR_CMD_UPDAT
2a2a0 45 20 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e  E       2.#defin
2a2b0 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 20  e AR_CMD_INSERT 
2a2c0 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
2a2d0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 20  AR_CMD_EXTRACT  
2a2e0 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52      4.#define AR
2a2f0 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20 20 20  _CMD_LIST       
2a300 20 20 35 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    5.#define AR_C
2a310 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20  MD_HELP         
2a320 36 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28  6../*.** Other (
2a330 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69  non-command) swi
2a340 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tches..*/.#defin
2a350 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  e AR_SWITCH_VERB
2a360 4f 53 45 20 20 20 20 20 37 0a 23 64 65 66 69 6e  OSE     7.#defin
2a370 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
2a380 20 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e          8.#defin
2a390 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
2a3a0 43 54 4f 52 59 20 20 20 39 0a 23 64 65 66 69 6e  CTORY   9.#defin
2a3b0 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
2a3c0 4e 44 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e  ND     10.#defin
2a3d0 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52  e AR_SWITCH_DRYR
2a3e0 55 4e 20 20 20 20 20 31 31 0a 0a 73 74 61 74 69  UN     11..stati
2a3f0 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53  c int arProcessS
2a400 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20  witch(ArCommand 
2a410 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63  *pAr, int eSwitc
2a420 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
2a430 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
2a440 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63  eSwitch ){.    c
2a450 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
2a460 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
2a470 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
2a480 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
2a490 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
2a4a0 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61  D_UPDATE:.    ca
2a4b0 73 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54  se AR_CMD_INSERT
2a4c0 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
2a4d0 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66  D_HELP:.      if
2a4e0 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20  ( pAr->eCmd ){. 
2a4f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
2a500 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d  ErrorMsg(pAr, "m
2a510 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20  ultiple command 
2a520 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20  options");.     
2a530 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43   }.      pAr->eC
2a540 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20  md = eSwitch;.  
2a550 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
2a560 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44  case AR_SWITCH_D
2a570 52 59 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72  RYRUN:.      pAr
2a580 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20  ->bDryRun = 1;. 
2a590 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a5a0 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56  case AR_SWITCH_V
2a5b0 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41  ERBOSE:.      pA
2a5c0 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  r->bVerbose = 1;
2a5d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2a5e0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
2a5f0 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70  _APPEND:.      p
2a600 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b  Ar->bAppend = 1;
2a610 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
2a620 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20  hru into --file 
2a630 2a 2f 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53  */.    case AR_S
2a640 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20  WITCH_FILE:.    
2a650 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a    pAr->zFile = z
2a660 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Arg;.      break
2a670 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
2a680 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a  ITCH_DIRECTORY:.
2a690 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20        pAr->zDir 
2a6a0 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
2a6b0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
2a6c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a6d0 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65  ./*.** Parse the
2a6e0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f   command line fo
2a6f0 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61  r an ".ar" comma
2a700 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20  nd. The results 
2a710 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
2a720 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a  .** structure (*
2a730 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pAr). SQLITE_OK 
2a740 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
2a750 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
2a760 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63  is parsed.** suc
2a770 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72  cessfully, other
2a780 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  wise an error me
2a790 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
2a7a0 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a   to stderr and .
2a7b0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
2a7c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2a7d0 74 69 63 20 69 6e 74 20 61 72 50 61 72 73 65 43  tic int arParseC
2a7e0 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a  ommand(.  char *
2a7f0 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
2a800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2a810 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
2a820 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
2a830 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
2a840 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
2a850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a860 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2a870 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20  in azArg[] */.  
2a880 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20  ArCommand *pAr  
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
2a8b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
2a8c0 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
2a8d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2a8e0 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61   *zLong;.    cha
2a8f0 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38  r cShort;.    u8
2a900 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38   eSwitch;.    u8
2a910 20 62 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74   bArg;.  } aSwit
2a920 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ch[] = {.    { "
2a930 63 72 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c  create",    'c',
2a940 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20   AR_CMD_CREATE, 
2a950 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2a960 20 22 65 78 74 72 61 63 74 22 2c 20 20 20 27 78   "extract",   'x
2a970 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ', AR_CMD_EXTRAC
2a980 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  T,      0 },.   
2a990 20 7b 20 22 69 6e 73 65 72 74 22 2c 20 20 20 20   { "insert",    
2a9a0 27 69 27 2c 20 41 52 5f 43 4d 44 5f 49 4e 53 45  'i', AR_CMD_INSE
2a9b0 52 54 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  RT,       0 },. 
2a9c0 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20 20 20     { "list",    
2a9d0 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49    't', AR_CMD_LI
2a9e0 53 54 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ST,         0 },
2a9f0 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65 22 2c  .    { "update",
2aa00 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f      'u', AR_CMD_
2aa10 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 30 20  UPDATE,       0 
2aa20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70 22 2c  },.    { "help",
2aa30 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f 43 4d        'h', AR_CM
2aa40 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20 20 20  D_HELP,         
2aa50 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72 62  0 },.    { "verb
2aa60 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41 52 5f  ose",   'v', AR_
2aa70 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c 20  SWITCH_VERBOSE, 
2aa80 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69    0 },.    { "fi
2aa90 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c 20 41  le",      'f', A
2aaa0 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 20  R_SWITCH_FILE,  
2aab0 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22      1 },.    { "
2aac0 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61 27 2c  append",    'a',
2aad0 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e   AR_SWITCH_APPEN
2aae0 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b  D,    1 },.    {
2aaf0 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20 27 43   "directory", 'C
2ab00 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  ', AR_SWITCH_DIR
2ab10 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20  ECTORY, 1 },.   
2ab20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20 20 20   { "dryrun",    
2ab30 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44  'n', AR_SWITCH_D
2ab40 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20  RYRUN,    0 },. 
2ab50 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74 63   };.  int nSwitc
2ab60 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69 74  h = sizeof(aSwit
2ab70 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74 72  ch) / sizeof(str
2ab80 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a 20  uct ArSwitch);. 
2ab90 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
2aba0 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74 63   *pEnd = &aSwitc
2abb0 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69  h[nSwitch];..  i
2abc0 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20  f( nArg<=1 ){.  
2abd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2abe0 64 65 72 72 2c 20 22 57 72 6f 6e 67 20 6e 75 6d  derr, "Wrong num
2abf0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2ac00 2e 20 20 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 20  .  Usage:\n");. 
2ac10 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67     return arUsag
2ac20 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c  e(stderr);.  }el
2ac30 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  se{.    char *z 
2ac40 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
2ac50 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
2ac60 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74  .      /* Tradit
2ac70 69 6f 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72  ional style [tar
2ac80 5d 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  ] invocation */.
2ac90 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
2aca0 20 20 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b     int iArg = 2;
2acb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2acc0 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
2acd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ace0 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  zArg = 0;.      
2acf0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
2ad00 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20  h *pOpt;.       
2ad10 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
2ad20 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
2ad30 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
2ad40 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70       if( z[i]==p
2ad50 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72  Opt->cShort ) br
2ad60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2ad70 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d         if( pOpt=
2ad80 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
2ad90 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2ada0 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63  rMsg(pAr, "unrec
2adb0 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
2adc0 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20  %c", z[i]);.    
2add0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2ade0 28 20 70 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a  ( pOpt->bArg ){.
2adf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41            if( iA
2ae00 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg>=nArg ){.    
2ae10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2ae20 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2ae30 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
2ae40 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22  an argument: %c"
2ae50 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ,z[i]);.        
2ae60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41    }.          zA
2ae70 72 67 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b  rg = azArg[iArg+
2ae80 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +];.        }.  
2ae90 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
2aea0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
2aeb0 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
2aec0 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
2aed0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2aee0 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41   }.      pAr->nA
2aef0 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a  rg = nArg-iArg;.
2af00 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e        if( pAr->n
2af10 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
2af20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
2af30 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20  zArg[iArg];.    
2af40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2af50 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64       /* Non-trad
2af60 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69  itional invocati
2af70 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
2af80 69 41 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  iArg;.      for(
2af90 69 41 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72  iArg=1; iArg<nAr
2afa0 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20  g; iArg++){.    
2afb0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2afc0 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72     z = azArg[iAr
2afd0 67 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g];.        if( 
2afe0 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[0]!='-' ){.   
2aff0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65         /* All re
2b000 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20  maining command 
2b010 6c 69 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63  line words are c
2b020 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2b030 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
2b040 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
2b050 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
2b060 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20      pAr->nArg = 
2b070 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20  nArg-iArg;.     
2b080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b090 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20      }.        n 
2b0a0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a  = strlen30(z);..
2b0b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d          if( z[1]
2b0c0 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  !='-' ){.       
2b0d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2b0e0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
2b0f0 72 65 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73  re short options
2b100 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
2b110 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=1; i<n; i++)
2b120 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2b130 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
2b140 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2b150 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
2b160 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20  *pOpt;.         
2b170 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77     for(pOpt=&aSw
2b180 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45  itch[0]; pOpt<pE
2b190 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20  nd; pOpt++){.   
2b1a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2b1b0 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72  [i]==pOpt->cShor
2b1c0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
2b1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b1e0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
2b1f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
2b200 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
2b210 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72  rorMsg(pAr, "unr
2b220 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e  ecognized option
2b230 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20  : %c", z[i]);.  
2b240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b250 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
2b260 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
2b270 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e          if( i<(n
2b280 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
2b290 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 26 7a         zArg = &z
2b2a0 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i+1];.         
2b2b0 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20         i = n;.  
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
2b2d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
2b2e0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
2b2f0 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
2b300 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b310 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2b320 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  , "option requir
2b330 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
2b340 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  %c",z[i]);.     
2b350 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
2b370 67 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67  g = azArg[++iArg
2b380 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
2b390 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b3b0 20 61 72 50 72 6f 63 65 73 73 53 77 69 74 63 68   arProcessSwitch
2b3c0 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69  (pAr, pOpt->eSwi
2b3d0 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74  tch, zArg) ) ret
2b3e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2b3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b400 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b410 7a 5b 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20  z[2]=='\0' ){.  
2b420 20 20 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20          /* A -- 
2b430 6f 70 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69  option, indicati
2b440 6e 67 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61  ng that all rema
2b450 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
2b460 6e 65 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20  ne words.       
2b470 20 20 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e     ** are comman
2b480 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f  d arguments.  */
2b490 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
2b4a0 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69  azArg = &azArg[i
2b4b0 41 72 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Arg+1];.        
2b4c0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
2b4d0 72 67 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20  rg-iArg-1;.     
2b4e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b500 20 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f       /* A long o
2b510 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2b520 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b530 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Arg = 0;        
2b540 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
2b550 20 66 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20   for option, if 
2b560 61 6e 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  any */.         
2b570 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
2b580 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20   *pMatch = 0;   
2b590 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f     /* Matching o
2b5a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2b5b0 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
2b5c0 63 68 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20  ch *pOpt;       
2b5d0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2b5e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f   */.          fo
2b5f0 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b  r(pOpt=&aSwitch[
2b600 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70  0]; pOpt<pEnd; p
2b610 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Opt++){.        
2b620 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b630 7a 4c 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c  zLong = pOpt->zL
2b640 6f 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ong;.           
2b650 20 69 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c   if( (n-2)<=strl
2b660 65 6e 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30  en30(zLong) && 0
2b670 3d 3d 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20  ==memcmp(&z[2], 
2b680 7a 4c 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20  zLong, n-2) ){. 
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2b6a0 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20   pMatch ){.     
2b6b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b6c0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41 72  n arErrorMsg(pAr
2b6d0 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6f 70 74  , "ambiguous opt
2b6e0 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a 20 20 20  ion: %s",z);.   
2b6f0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2b700 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b710 20 20 70 4d 61 74 63 68 20 3d 20 70 4f 70 74 3b    pMatch = pOpt;
2b720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b740 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
2b750 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2b760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b770 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2b780 72 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63  rMsg(pAr, "unrec
2b790 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
2b7a0 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
2b7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2b7c0 66 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20  f( pMatch->bArg 
2b7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2b7e0 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
2b7f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2b800 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2b810 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f  rMsg(pAr, "optio
2b820 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
2b830 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b  gument: %s", z);
2b840 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b850 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
2b860 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
2b870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b880 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
2b890 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
2b8a0 70 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c  pMatch->eSwitch,
2b8b0 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
2b8c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2b8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b8e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2b8f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b900 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b910 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2b920 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73  at all arguments
2b930 20 77 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f   within the ArCo
2b940 6d 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a  mmand.azArg[].**
2b950 20 61 72 72 61 79 20 72 65 66 65 72 20 74 6f 20   array refer to 
2b960 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c  archive members,
2b970 20 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78   as for the --ex
2b980 74 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20  tract or --list 
2b990 63 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74  commands. .** It
2b9a0 20 63 68 65 63 6b 73 20 74 68 61 74 20 65 61 63   checks that eac
2b9b0 68 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72  h of them are pr
2b9c0 65 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70  esent. If any sp
2b9d0 65 63 69 66 69 65 64 20 66 69 6c 65 20 69 73 20  ecified file is 
2b9e0 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69  not.** present i
2b9f0 6e 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61  n the archive, a
2ba00 6e 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74  n error is print
2ba10 65 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  ed to stderr and
2ba20 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64   an error.** cod
2ba30 65 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  e returned. Othe
2ba40 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70  rwise, if all sp
2ba50 65 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74  ecified argument
2ba60 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e  s are present in
2ba70 0a 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c  .** the archive,
2ba80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2ba90 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2baa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69  is function stri
2bab0 70 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ps any trailing 
2bac0 27 2f 27 20 63 68 61 72 61 63 74 65 72 73 20 66  '/' characters f
2bad0 72 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e  rom each argumen
2bae0 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  t..** This is co
2baf0 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
2bb00 65 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20  e way the [tar] 
2bb10 63 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f  command seems to
2bb20 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75   work on.** Linu
2bb30 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
2bb40 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
2bb50 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
2bb60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2bb70 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72  TE_OK;.  if( pAr
2bb80 2d 3e 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 6e  ->nArg ){.    in
2bb90 74 20 69 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69  t i, j;.    sqli
2bba0 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73 74 20  te3_stmt *pTest 
2bbb0 3d 20 30 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50  = 0;..    shellP
2bbc0 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72  reparePrintf(pAr
2bbd0 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73  ->db, &rc, &pTes
2bbe0 74 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  t,.        "SELE
2bbf0 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20  CT name FROM %s 
2bc00 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65  WHERE name=$name
2bc10 22 2c 20 0a 20 20 20 20 20 20 20 20 70 41 72 2d  ", .        pAr-
2bc20 3e 7a 53 72 63 54 61 62 6c 65 0a 20 20 20 20 29  >zSrcTable.    )
2bc30 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
2bc40 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2bc50 5f 69 6e 64 65 78 28 70 54 65 73 74 2c 20 22 24  _index(pTest, "$
2bc60 6e 61 6d 65 22 29 3b 0a 20 20 20 20 66 6f 72 28  name");.    for(
2bc70 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67  i=0; i<pAr->nArg
2bc80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2bc90 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  K; i++){.      c
2bca0 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a  har *z = pAr->az
2bcb0 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e  Arg[i];.      in
2bcc0 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  t n = strlen30(z
2bcd0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  );.      int bOk
2bce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
2bcf0 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
2bd00 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  =='/' ) n--;.   
2bd10 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a     z[n] = '\0';.
2bd20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
2bd30 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20 6a  nd_text(pTest, j
2bd40 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  , z, -1, SQLITE_
2bd50 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 69  STATIC);.      i
2bd60 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
2bd70 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65 73  qlite3_step(pTes
2bd80 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 4f  t) ){.        bO
2bd90 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
2bda0 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28       shellReset(
2bdb0 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20  &rc, pTest);.   
2bdc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdd0 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29  E_OK && bOk==0 )
2bde0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2bdf0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e  rintf(stderr, "n
2be00 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63 68  ot found in arch
2be10 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ive: %s\n", z);.
2be20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2be30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2be40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65   }.    }.    she
2be50 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
2be60 70 54 65 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65  pTest);.  }.  re
2be70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2be80 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45 52 45  * Format a WHERE
2be90 20 63 6c 61 75 73 65 20 74 68 61 74 20 63 61 6e   clause that can
2bea0 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 73 74   be used against
2beb0 20 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62   the "sqlar" tab
2bec0 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66  le to.** identif
2bed0 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65  y all archive me
2bee0 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74 63 68  mbers that match
2bef0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67   the command arg
2bf00 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69  uments held.** i
2bf10 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76 65 20  n (*pAr). Leave 
2bf20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61 75 73  this WHERE claus
2bf30 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65 29 20  e in (*pzWhere) 
2bf40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2bf50 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  ..** The caller 
2bf60 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2bf70 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  or eventually ca
2bf80 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
2bf90 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e  ee() on.** any n
2bfa0 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72  on-NULL (*pzWher
2bfb0 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  e) value..*/.sta
2bfc0 74 69 63 20 76 6f 69 64 20 61 72 57 68 65 72 65  tic void arWhere
2bfd0 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20 2a 70  Clause(.  int *p
2bfe0 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  Rc, .  ArCommand
2bff0 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72 20 2a   *pAr, .  char *
2c000 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20 20 20  *pzWhere        
2c010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2c020 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c 61 75  : New WHERE clau
2c030 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  se */.){.  char 
2c040 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69  *zWhere = 0;.  i
2c050 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
2c060 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  OK ){.    if( pA
2c070 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20  r->nArg==0 ){.  
2c080 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c      zWhere = sql
2c090 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 31 22  ite3_mprintf("1"
2c0a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c0b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2c0c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
2c0d0 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66 6f  p = "";.      fo
2c0e0 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
2c0f0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2c100 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2c110 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
2c120 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 20  .        zWhere 
2c130 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c140 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 7a  f(.          "%z
2c150 25 73 20 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f  %s name = '%q' O
2c160 52 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c  R substr(name,1,
2c170 25 64 29 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20  %d) = '%q/'", . 
2c180 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c           zWhere,
2c190 20 7a 53 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e   zSep, z, strlen
2c1a0 33 30 28 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20  30(z)+1, z.     
2c1b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2c1c0 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20  ( zWhere==0 ){. 
2c1d0 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20           *pRc = 
2c1e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c1f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2c200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c210 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a   zSep = " OR ";.
2c220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c230 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a  }.  *pzWhere = z
2c240 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Where;.}../*.** 
2c250 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2c260 66 20 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d  f .ar "lisT" com
2c270 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mand. .*/.static
2c280 20 69 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61   int arListComma
2c290 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  nd(ArCommand *pA
2c2a0 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
2c2b0 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
2c2c0 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52   %s FROM %s WHER
2c2d0 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20  E %s"; .  const 
2c2e0 63 68 61 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d  char *azCols[] =
2c2f0 20 7b 0a 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20   {.    "name",. 
2c300 20 20 20 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29     "lsmode(mode)
2c310 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d  , sz, datetime(m
2c320 74 69 6d 65 2c 20 27 75 6e 69 78 65 70 6f 63 68  time, 'unixepoch
2c330 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a  '), name".  };..
2c340 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
2c350 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
2c360 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
2c370 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
2c380 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
2c390 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
2c3a0 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
2c3b0 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c  zWhere);..  shel
2c3c0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
2c3d0 41 72 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  Ar->db, &rc, &pS
2c3e0 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73  ql, zSql, azCols
2c3f0 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c  [pAr->bVerbose],
2c400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c410 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54        pAr->zSrcT
2c420 61 62 6c 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20  able, zWhere);. 
2c430 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52 75   if( pAr->bDryRu
2c440 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  n ){.    utf8_pr
2c450 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
2c460 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
2c470 33 5f 73 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20  3_sql(pSql));.  
2c480 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2c490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c4a0 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2c4b0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
2c4c0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
2c4d0 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a  Ar->bVerbose ){.
2c4e0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2c4f0 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
2c500 20 22 25 73 20 25 20 31 30 64 20 20 25 73 20 20   "%s % 10d  %s  
2c510 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2c520 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
2c530 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 2c  n_text(pSql, 0),
2c540 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2c550 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2c560 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20  pSql, 1), .     
2c570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2c580 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2c590 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   2),.           
2c5a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c5b0 74 65 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20  text(pSql, 3).  
2c5c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2c5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
2c5e0 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2c5f0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73  ->out, "%s\n", s
2c600 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2c610 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20  xt(pSql, 0));.  
2c620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c630 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2c640 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 73 71  &rc, pSql);.  sq
2c650 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65 72  lite3_free(zWher
2c660 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2c670 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
2c680 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72  mentation of .ar
2c690 20 22 65 58 74 72 61 63 74 22 20 63 6f 6d 6d 61   "eXtract" comma
2c6a0 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
2c6b0 6e 74 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d  nt arExtractComm
2c6c0 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  and(ArCommand *p
2c6d0 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ar){.  const cha
2c6e0 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20  r *zSql1 = .    
2c6f0 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20  "SELECT ".    " 
2c700 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22  ($dir || name),"
2c710 0a 20 20 20 20 22 20 77 72 69 74 65 66 69 6c 65  .    " writefile
2c720 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c  (($dir || name),
2c730 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65   %s, mode, mtime
2c740 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73  ) ".    "FROM %s
2c750 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44 20   WHERE (%s) AND 
2c760 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52  (data IS NULL OR
2c770 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22 0a   $dirOnly = 0)".
2c780 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e      " AND name N
2c790 4f 54 20 47 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c  OT GLOB '*..[/\\
2c7a0 5d 2a 27 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  ]*'";..  const c
2c7b0 68 61 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b  har *azExtraArg[
2c7c0 5d 20 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61  ] = { .    "sqla
2c7d0 72 5f 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74  r_uncompress(dat
2c7e0 61 2c 20 73 7a 29 22 2c 0a 20 20 20 20 22 64 61  a, sz)",.    "da
2c7f0 74 61 22 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69  ta".  };..  sqli
2c800 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
2c810 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
2c820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
2c830 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68   *zDir = 0;.  ch
2c840 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a  ar *zWhere = 0;.
2c850 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f    int i, j;..  /
2c860 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61  * If arguments a
2c870 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 68  re specified, ch
2c880 65 63 6b 20 74 68 61 74 20 74 68 65 79 20 61 63  eck that they ac
2c890 74 75 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74  tually exist wit
2c8a0 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63  hin.  ** the arc
2c8b0 68 69 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63  hive before proc
2c8c0 65 65 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d  eeding. And form
2c8d0 75 6c 61 74 65 20 61 20 57 48 45 52 45 20 63 6c  ulate a WHERE cl
2c8e0 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74  ause to.  ** mat
2c8f0 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72  ch them.  */.  r
2c900 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
2c910 65 73 28 70 41 72 29 3b 0a 20 20 61 72 57 68 65  es(pAr);.  arWhe
2c920 72 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41  reClause(&rc, pA
2c930 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20  r, &zWhere);..  
2c940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c950 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72  K ){.    if( pAr
2c960 2d 3e 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20  ->zDir ){.      
2c970 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
2c980 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41  printf("%s/", pA
2c990 72 2d 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65  r->zDir);.    }e
2c9a0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20  lse{.      zDir 
2c9b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c9c0 66 28 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f("");.    }.   
2c9d0 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72   if( zDir==0 ) r
2c9e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c9f0 3b 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72  ;.  }..  shellPr
2ca00 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d  eparePrintf(pAr-
2ca10 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c  >db, &rc, &pSql,
2ca20 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61   zSql1, .      a
2ca30 7a 45 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62  zExtraArg[pAr->b
2ca40 5a 69 70 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54  Zip], pAr->zSrcT
2ca50 61 62 6c 65 2c 20 7a 57 68 65 72 65 0a 20 20 29  able, zWhere.  )
2ca60 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2ca70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20  ITE_OK ){.    j 
2ca80 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
2ca90 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
2caa0 53 71 6c 2c 20 22 24 64 69 72 22 29 3b 0a 20 20  Sql, "$dir");.  
2cab0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2cac0 65 78 74 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69  ext(pSql, j, zDi
2cad0 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  r, -1, SQLITE_ST
2cae0 41 54 49 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  ATIC);..    /* R
2caf0 75 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  un the SELECT st
2cb00 61 74 65 6d 65 6e 74 20 74 77 69 63 65 2e 20 54  atement twice. T
2cb10 68 65 20 66 69 72 73 74 20 74 69 6d 65 2c 20 77  he first time, w
2cb20 72 69 74 65 66 69 6c 65 28 29 20 69 73 20 63 61  ritefile() is ca
2cb30 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  lled.    ** for 
2cb40 61 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62  all archive memb
2cb50 65 72 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ers that should 
2cb60 62 65 20 65 78 74 72 61 63 74 65 64 2e 20 54 68  be extracted. Th
2cb70 65 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20  e second time,. 
2cb80 20 20 20 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74     ** only for t
2cb90 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20  he directories. 
2cba0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2cbb0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66  the timestamps f
2cbc0 6f 72 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 63  or.    ** extrac
2cbd0 74 65 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  ted directories 
2cbe0 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 61 66  must be reset af
2cbf0 74 65 72 20 74 68 65 79 20 61 72 65 20 70 6f 70  ter they are pop
2cc00 75 6c 61 74 65 64 20 28 61 73 0a 20 20 20 20 2a  ulated (as.    *
2cc10 2a 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  * populating the
2cc20 6d 20 63 68 61 6e 67 65 73 20 74 68 65 20 74 69  m changes the ti
2cc30 6d 65 73 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20  mestamp).  */.  
2cc40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
2cc50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20  i++){.      j = 
2cc60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2cc70 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71  ameter_index(pSq
2cc80 6c 2c 20 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a  l, "$dirOnly");.
2cc90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
2cca0 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20  nd_int(pSql, j, 
2ccb0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  i);.      if( pA
2ccc0 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
2ccd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cce0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2ccf0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73  %s\n", sqlite3_s
2cd00 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20 20 20 20  ql(pSql));.     
2cd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2cd20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2cd30 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2cd40 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2cd50 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
2cd60 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
2cd70 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b  pAr->bVerbose ){
2cd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
2cd90 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
2cda0 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
2cdb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2cdc0 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20  t(pSql, 0));.   
2cdd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cde0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2cdf0 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c   shellReset(&rc,
2ce00 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSql);.    }.  
2ce10 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
2ce20 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a  &rc, pSql);.  }.
2ce30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2ce40 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zDir);.  sqlite3
2ce50 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20  _free(zWhere);. 
2ce60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ce70 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 53 51 4c  *.** Run the SQL
2ce80 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53   statement in zS
2ce90 71 6c 2e 20 20 4f 72 20 69 66 20 64 6f 69 6e 67  ql.  Or if doing
2cea0 20 61 20 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72   a --dryrun, mer
2ceb0 65 6c 79 20 70 72 69 6e 74 20 69 74 20 6f 75 74  ely print it out
2cec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ced0 61 72 45 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d  arExecSql(ArComm
2cee0 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20  and *pAr, const 
2cef0 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69  char *zSql){.  i
2cf00 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 41 72  nt rc;.  if( pAr
2cf10 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20  ->bDryRun ){.   
2cf20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2cf30 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  ->p->out, "%s\n"
2cf40 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 72 63 20  , zSql);.    rc 
2cf50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2cf60 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
2cf70 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  zErr = 0;.    rc
2cf80 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2cf90 70 41 72 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30  pAr->db, zSql, 0
2cfa0 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20  , 0, &zErr);.   
2cfb0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2cfc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2cfd0 74 64 6f 75 74 2c 20 22 45 52 52 4f 52 3a 20 25  tdout, "ERROR: %
2cfe0 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  s\n", zErr);.   
2cff0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d000 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zErr);.    }.  }
2d010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d020 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2d030 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63  tation of .ar "c
2d040 72 65 61 74 65 22 2c 20 22 69 6e 73 65 72 74 22  reate", "insert"
2d050 2c 20 61 6e 64 20 22 75 70 64 61 74 65 22 20 63  , and "update" c
2d060 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 20  ommands..**.**  
2d070 20 20 20 63 72 65 61 74 65 20 20 20 20 2d 3e 20     create    -> 
2d080 20 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77      Create a new
2d090 20 53 51 4c 20 61 72 63 68 69 76 65 0a 2a 2a 20   SQL archive.** 
2d0a0 20 20 20 20 69 6e 73 65 72 74 20 20 20 20 2d 3e      insert    ->
2d0b0 20 20 20 20 20 49 6e 73 65 72 74 20 6f 72 20 72       Insert or r
2d0c0 65 69 6e 73 65 72 74 20 61 6c 6c 20 66 69 6c 65  einsert all file
2d0d0 73 20 6c 69 73 74 65 64 0a 2a 2a 20 20 20 20 20  s listed.**     
2d0e0 75 70 64 61 74 65 20 20 20 20 2d 3e 20 20 20 20  update    ->    
2d0f0 20 49 6e 73 65 72 74 20 66 69 6c 65 73 20 74 68   Insert files th
2d100 61 74 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  at have changed 
2d110 6f 72 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  or that were not
2d120 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2d130 20 20 20 20 20 20 20 20 20 70 72 65 76 69 6f 75           previou
2d140 73 6c 79 20 69 6e 20 74 68 65 20 61 72 63 68 69  sly in the archi
2d150 76 65 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ve.**.** Create 
2d160 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c  the "sqlar" tabl
2d170 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2d180 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
2d190 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
2d1a0 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68  ** Then add each
2d1b0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46   file in the azF
2d1c0 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74  ile[] array to t
2d1d0 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65  he archive. Dire
2d1e0 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61  ctories.** are a
2d1f0 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  dded recursively
2d200 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56  . If argument bV
2d210 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  erbose is non-ze
2d220 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73  ro, a message is
2d230 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
2d240 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66  tdout for each f
2d250 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a  ile archived..**
2d260 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63  .** The create c
2d270 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61  ommand is the sa
2d280 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78  me as update, ex
2d290 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f  cept that it dro
2d2a0 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69  ps.** any existi
2d2b0 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  ng "sqlar" table
2d2c0 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
2d2d0 67 2e 20 20 54 68 65 20 22 69 6e 73 65 72 74 22  g.  The "insert"
2d2e0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 61 6c 77 61   command.** alwa
2d2f0 79 73 20 6f 76 65 72 77 72 69 74 65 73 20 65 76  ys overwrites ev
2d300 65 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f  ery file named o
2d310 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  n the command-li
2d320 6e 65 2c 20 77 68 65 72 65 20 61 73 0a 2a 2a 20  ne, where as.** 
2d330 22 75 70 64 61 74 65 22 20 6f 6e 6c 79 20 6f 76  "update" only ov
2d340 65 72 77 72 69 74 65 73 20 69 66 20 74 68 65 20  erwrites if the 
2d350 73 69 7a 65 20 6f 72 20 6d 74 69 6d 65 20 6f 72  size or mtime or
2d360 20 6d 6f 64 65 20 68 61 73 20 63 68 61 6e 67 65   mode has change
2d370 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2d380 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2d390 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 41 72 43 6f  eCommand(.  ArCo
2d3a0 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20 20  mmand *pAr,     
2d3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2d3c0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2d3d0 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a   and options */.
2d3e0 20 20 69 6e 74 20 62 55 70 64 61 74 65 2c 20 20    int bUpdate,  
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d400 20 20 2f 2a 20 74 72 75 65 20 66 6f 72 20 61 20    /* true for a 
2d410 2d 2d 63 72 65 61 74 65 2e 20 2a 2f 0a 20 20 69  --create. */.  i
2d420 6e 74 20 62 4f 6e 6c 79 49 66 43 68 61 6e 67 65  nt bOnlyIfChange
2d430 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d              /
2d440 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 69 66  * Only update if
2d450 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
2d460 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  d */.){.  const 
2d470 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d 20  char *zCreate = 
2d480 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54  .      "CREATE T
2d490 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
2d4a0 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20 20 20  TS sqlar(\n".   
2d4b0 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58 54 20     "  name TEXT 
2d4c0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d 2d  PRIMARY KEY,  --
2d4d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
2d4e0 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 6f  e\n".      "  mo
2d4f0 64 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  de INT,         
2d500 20 20 20 20 20 20 2d 2d 20 61 63 63 65 73 73 20        -- access 
2d510 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a 20  permissions\n". 
2d520 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20 49 4e       "  mtime IN
2d530 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
2d540 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69 63 61  -- last modifica
2d550 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20 20 20  tion time\n".   
2d560 20 20 20 22 20 20 73 7a 20 49 4e 54 2c 20 20 20     "  sz INT,   
2d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
2d580 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 73   original file s
2d590 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ize\n".      "  
2d5a0 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20 20 20  data BLOB       
2d5b0 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70 72          -- compr
2d5c0 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e 22  essed content\n"
2d5d0 0a 20 20 20 20 20 20 22 29 22 3b 0a 20 20 63 6f  .      ")";.  co
2d5e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 72 6f 70 20  nst char *zDrop 
2d5f0 3d 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  = "DROP TABLE IF
2d600 20 45 58 49 53 54 53 20 73 71 6c 61 72 22 3b 0a   EXISTS sqlar";.
2d610 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2d620 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d 20 7b 0a  nsertFmt[2] = {.
2d630 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
2d640 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c  TO %s(name,mode,
2d650 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29 5c 6e  mtime,sz,data)\n
2d660 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43 54  ".     "  SELECT
2d670 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25 73  \n".     "    %s
2d680 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d  ,\n".     "    m
2d690 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ode,\n".     "  
2d6a0 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20    mtime,\n".    
2d6b0 20 22 20 20 20 20 43 41 53 45 20 73 75 62 73 74   "    CASE subst
2d6c0 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 31  r(lsmode(mode),1
2d6d0 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ,1)\n".     "   
2d6e0 20 20 20 57 48 45 4e 20 27 2d 27 20 54 48 45 4e     WHEN '-' THEN
2d6f0 20 6c 65 6e 67 74 68 28 64 61 74 61 29 5c 6e 22   length(data)\n"
2d700 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45  .     "      WHE
2d710 4e 20 27 64 27 20 54 48 45 4e 20 30 5c 6e 22 0a  N 'd' THEN 0\n".
2d720 20 20 20 20 20 22 20 20 20 20 20 20 45 4c 53 45       "      ELSE
2d730 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20 20 20   -1 END,\n".    
2d740 20 22 20 20 20 20 73 71 6c 61 72 5f 63 6f 6d 70   "    sqlar_comp
2d750 72 65 73 73 28 64 61 74 61 29 5c 6e 22 0a 20 20  ress(data)\n".  
2d760 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72     "  FROM fsdir
2d770 28 25 51 2c 25 51 29 20 41 53 20 64 69 73 6b 5c  (%Q,%Q) AS disk\
2d780 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45  n".     "  WHERE
2d790 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f   lsmode(mode) NO
2d7a0 54 20 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b 22  T LIKE '?%%'%s;"
2d7b0 0a 20 20 20 20 20 2c 0a 20 20 20 20 20 22 52 45  .     ,.     "RE
2d7c0 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e 61  PLACE INTO %s(na
2d7d0 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61  me,mode,mtime,da
2d7e0 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53  ta)\n".     "  S
2d7f0 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20  ELECT\n".     " 
2d800 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22     %s,\n".     "
2d810 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20      mode,\n".   
2d820 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22    "    mtime,\n"
2d830 0a 20 20 20 20 20 22 20 20 20 20 64 61 74 61 5c  .     "    data\
2d840 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  n".     "  FROM 
2d850 66 73 64 69 72 28 25 51 2c 25 51 29 20 41 53 20  fsdir(%Q,%Q) AS 
2d860 64 69 73 6b 5c 6e 22 0a 20 20 20 20 20 22 20 20  disk\n".     "  
2d870 57 48 45 52 45 20 6c 73 6d 6f 64 65 28 6d 6f 64  WHERE lsmode(mod
2d880 65 29 20 4e 4f 54 20 4c 49 4b 45 20 27 3f 25 25  e) NOT LIKE '?%%
2d890 27 25 73 3b 22 0a 20 20 7d 3b 0a 20 20 69 6e 74  '%s;".  };.  int
2d8a0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d8c0 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
2d8d0 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a  rough azFile[] *
2d8e0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d910 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
2d920 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
2d930 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
2d940 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63 68 20  able into which 
2d950 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 63  to insert */.  c
2d960 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2d970 72 20 7a 54 65 6d 70 5b 35 30 5d 3b 0a 20 20 63  r zTemp[50];.  c
2d980 68 61 72 20 2a 7a 45 78 69 73 74 73 20 3d 20 30  har *zExists = 0
2d990 3b 0a 0a 20 20 61 72 45 78 65 63 53 71 6c 28 70  ;..  arExecSql(p
2d9a0 41 72 2c 20 22 50 52 41 47 4d 41 20 70 61 67 65  Ar, "PRAGMA page
2d9b0 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a 20 20 72  _size=512");.  r
2d9c0 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2d9d0 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20 61 72  r, "SAVEPOINT ar
2d9e0 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ;");.  if( rc!=S
2d9f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2da00 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70 5b 30 5d  n rc;.  zTemp[0]
2da10 20 3d 20 30 3b 20 0a 20 20 69 66 28 20 70 41 72   = 0; .  if( pAr
2da20 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20 20 2f 2a  ->bZip ){.    /*
2da30 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2da40 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61 6c 20  zipfile virtual 
2da50 74 61 62 6c 65 2c 20 69 66 20 6e 65 63 65 73 73  table, if necess
2da60 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ary */.    if( p
2da70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  Ar->zFile ){.   
2da80 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
2da90 34 20 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  4 r;.      sqlit
2daa0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
2dab0 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a 20 20 20  zeof(r),&r);.   
2dac0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2dad0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 65 6d 70  ntf(sizeof(zTemp
2dae0 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25 30 31 36  ),zTemp,"zip%016
2daf0 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20 20 20 7a  llx",r);.      z
2db00 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  Tab = zTemp;.   
2db10 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
2db20 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2db30 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52 54      "CREATE VIRT
2db40 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e 25  UAL TABLE temp.%
2db50 73 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  s USING zipfile(
2db60 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  %Q)",.         z
2db70 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 0a  Tab, pAr->zFile.
2db80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
2db90 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41  c = arExecSql(pA
2dba0 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  r, zSql);.      
2dbb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2dbc0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
2dbd0 20 20 20 20 20 7a 54 61 62 20 3d 20 22 7a 69 70       zTab = "zip
2dbe0 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ";.    }.  }else
2dbf0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
2dc00 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 66 6f  ize the table fo
2dc10 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f 0a 20 20  r an SQLAR */.  
2dc20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c 61 72 22    zTab = "sqlar"
2dc30 3b 0a 20 20 20 20 69 66 28 20 62 55 70 64 61 74  ;.    if( bUpdat
2dc40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2dc50 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2dc60 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20 20 20  , zDrop);.      
2dc70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dc80 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f  K ) goto end_ar_
2dc90 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  transaction;.   
2dca0 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78   }.    rc = arEx
2dcb0 65 63 53 71 6c 28 70 41 72 2c 20 7a 43 72 65 61  ecSql(pAr, zCrea
2dcc0 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  te);.  }.  if( b
2dcd0 4f 6e 6c 79 49 66 43 68 61 6e 67 65 64 20 29 7b  OnlyIfChanged ){
2dce0 0a 20 20 20 20 7a 45 78 69 73 74 73 20 3d 20 73  .    zExists = s
2dcf0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2dd00 20 20 20 20 20 20 22 20 41 4e 44 20 4e 4f 54 20        " AND NOT 
2dd10 45 58 49 53 54 53 28 22 0a 20 20 20 20 20 20 20  EXISTS(".       
2dd20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f     "SELECT 1 FRO
2dd30 4d 20 25 73 20 41 53 20 6d 65 6d 22 0a 20 20 20  M %s AS mem".   
2dd40 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6d         " WHERE m
2dd50 65 6d 2e 6e 61 6d 65 3d 64 69 73 6b 2e 6e 61 6d  em.name=disk.nam
2dd60 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 41  e".          " A
2dd70 4e 44 20 6d 65 6d 2e 6d 74 69 6d 65 3d 64 69 73  ND mem.mtime=dis
2dd80 6b 2e 6d 74 69 6d 65 22 0a 20 20 20 20 20 20 20  k.mtime".       
2dd90 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e 6d 6f 64     " AND mem.mod
2dda0 65 3d 64 69 73 6b 2e 6d 6f 64 65 29 22 2c 20 7a  e=disk.mode)", z
2ddb0 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
2ddc0 20 20 20 7a 45 78 69 73 74 73 20 3d 20 73 71 6c     zExists = sql
2ddd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29  ite3_mprintf("")
2dde0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 45 78 69  ;.  }.  if( zExi
2ddf0 73 74 73 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  sts==0 ) rc = SQ
2de00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f  LITE_NOMEM;.  fo
2de10 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41  r(i=0; i<pAr->nA
2de20 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  rg && rc==SQLITE
2de30 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  _OK; i++){.    c
2de40 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c  har *zSql2 = sql
2de50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e  ite3_mprintf(zIn
2de60 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69  sertFmt[pAr->bZi
2de70 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20  p], zTab,.      
2de80 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20    pAr->bVerbose 
2de90 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28  ? "shell_putsnl(
2dea0 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c  name)" : "name",
2deb0 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
2dec0 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69  Arg[i], pAr->zDi
2ded0 72 2c 20 7a 45 78 69 73 74 73 29 3b 0a 20 20 20  r, zExists);.   
2dee0 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2def0 70 41 72 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 20  pAr, zSql2);.   
2df00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2df10 71 6c 32 29 3b 0a 20 20 7d 0a 65 6e 64 5f 61 72  ql2);.  }.end_ar
2df20 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _transaction:.  
2df30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2df40 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2df50 5f 65 78 65 63 28 70 41 72 2d 3e 64 62 2c 20 22  _exec(pAr->db, "
2df60 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20  ROLLBACK TO ar; 
2df70 52 45 4c 45 41 53 45 20 61 72 3b 22 2c 20 30 2c  RELEASE ar;", 0,
2df80 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 0);.  }else{
2df90 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63  .    rc = arExec
2dfa0 53 71 6c 28 70 41 72 2c 20 22 52 45 4c 45 41 53  Sql(pAr, "RELEAS
2dfb0 45 20 61 72 3b 22 29 3b 0a 20 20 20 20 69 66 28  E ar;");.    if(
2dfc0 20 70 41 72 2d 3e 62 5a 69 70 20 26 26 20 70 41   pAr->bZip && pA
2dfd0 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20  r->zFile ){.    
2dfe0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2dff0 5f 6d 70 72 69 6e 74 66 28 22 44 52 4f 50 20 54  _mprintf("DROP T
2e000 41 42 4c 45 20 25 73 22 2c 20 7a 54 65 6d 70 29  ABLE %s", zTemp)
2e010 3b 0a 20 20 20 20 20 20 61 72 45 78 65 63 53 71  ;.      arExecSq
2e020 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
2e030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e040 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
2e050 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2e060 28 7a 45 78 69 73 74 73 29 3b 0a 20 20 72 65 74  (zExists);.  ret
2e070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e080 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2e090 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d  of ".ar" dot com
2e0a0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
2e0b0 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  int arDotCommand
2e0c0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
2e0d0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
2e0e0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
2e0f0 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
2e100 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d 64  */.  int fromCmd
2e110 4c 69 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Line,           
2e120 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e130 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  -A command-line 
2e140 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20  option, not .ar 
2e150 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  cmd */.  char **
2e160 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
2e170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2e180 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
2e190 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
2e1a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
2e1b0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
2e1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e1d0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2e1e0 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
2e1f0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b    ArCommand cmd;
2e200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d  .  int rc;.  mem
2e210 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a  set(&cmd, 0, siz
2e220 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d 64  eof(cmd));.  cmd
2e230 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20 66  .fromCmdLine = f
2e240 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72 63  romCmdLine;.  rc
2e250 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e   = arParseComman
2e260 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26  d(azArg, nArg, &
2e270 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  cmd);.  if( rc==
2e280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e290 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20 53   int eDbType = S
2e2a0 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
2e2b0 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70 53  ;.    cmd.p = pS
2e2c0 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62  tate;.    cmd.db
2e2d0 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20   = pState->db;. 
2e2e0 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65     if( cmd.zFile
2e2f0 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70   ){.      eDbTyp
2e300 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62 61  e = deduceDataba
2e310 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65  seType(cmd.zFile
2e320 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
2e330 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d  .      eDbType =
2e340 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64   pState->openMod
2e350 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
2e360 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2e370 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
2e380 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2e390 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52 41  md==AR_CMD_EXTRA
2e3a0 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  CT || cmd.eCmd==
2e3b0 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a 20  AR_CMD_LIST ){. 
2e3c0 20 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a         if( cmd.z
2e3d0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2e3e0 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62       cmd.zSrcTab
2e3f0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
2e400 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20 20  intf("zip");.   
2e410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e420 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61        cmd.zSrcTa
2e430 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ble = sqlite3_mp
2e440 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28 25  rintf("zipfile(%
2e450 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b  Q)", cmd.zFile);
2e460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e470 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a 69   }.      cmd.bZi
2e480 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 1;.    }else
2e490 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29   if( cmd.zFile )
2e4a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  {.      int flag
2e4b0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  s;.      if( cmd
2e4c0 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54 79  .bAppend ) eDbTy
2e4d0 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  pe = SHELL_OPEN_
2e4e0 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20  APPENDVFS;.     
2e4f0 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
2e500 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20  R_CMD_CREATE || 
2e510 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2e520 5f 49 4e 53 45 52 54 20 0a 20 20 20 20 20 20 20  _INSERT .       
2e530 20 20 20 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d      || cmd.eCmd=
2e540 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
2e550 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2e560 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2e570 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2e580 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
2e590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e5a0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
2e5b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
2e5d0 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  .db = 0;.      i
2e5e0 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29  f( cmd.bDryRun )
2e5f0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2e600 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
2e610 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61  t, "-- open data
2e620 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20  base '%s'%s\n", 
2e630 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  cmd.zFile,.     
2e640 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
2e650 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
2e660 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20  NDVFS ? " using 
2e670 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29  'apndvfs'" : "")
2e680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e690 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
2e6a0 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  n_v2(cmd.zFile, 
2e6b0 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20  &cmd.db, flags, 
2e6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2e6d0 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2e6e0 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61  N_APPENDVFS ? "a
2e6f0 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20  pndvfs" : 0);.  
2e700 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e720 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e730 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
2e740 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c  n file: %s (%s)\
2e750 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
2e760 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69   cmd.zFile, sqli
2e770 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64  te3_errmsg(cmd.d
2e780 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  b).        );.  
2e790 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2e7a0 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2e7b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2e7c0 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64  _fileio_init(cmd
2e7d0 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
2e7e0 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
2e7f0 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
2e800 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2e810 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2e820 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c  n(cmd.db, "shell
2e830 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
2e840 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c  ITE_UTF8, cmd.p,
2e850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2e870 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
2e880 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20   0);..    }.    
2e890 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c  if( cmd.zSrcTabl
2e8a0 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70  e==0 && cmd.bZip
2e8b0 3d 3d 30 20 26 26 20 63 6d 64 2e 65 43 6d 64 21  ==0 && cmd.eCmd!
2e8c0 3d 41 52 5f 43 4d 44 5f 48 45 4c 50 20 29 7b 0a  =AR_CMD_HELP ){.
2e8d0 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2e8e0 6d 64 21 3d 41 52 5f 43 4d 44 5f 43 52 45 41 54  md!=AR_CMD_CREAT
2e8f0 45 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  E.       && sqli
2e900 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2e910 5f 6d 65 74 61 64 61 74 61 28 63 6d 64 2e 64 62  _metadata(cmd.db
2e920 2c 30 2c 22 73 71 6c 61 72 22 2c 22 6e 61 6d 65  ,0,"sqlar","name
2e930 22 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20 20  ",0,0,0,0,0).   
2e940 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74     ){.        ut
2e950 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2e960 2c 20 22 64 61 74 61 62 61 73 65 20 64 6f 65 73  , "database does
2e970 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
2e980 27 73 71 6c 61 72 27 20 74 61 62 6c 65 5c 6e 22  'sqlar' table\n"
2e990 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2e9a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2e9b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2e9c0 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
2e9d0 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 7a 53 72   }.      cmd.zSr
2e9e0 63 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  cTable = sqlite3
2e9f0 5f 6d 70 72 69 6e 74 66 28 22 73 71 6c 61 72 22  _mprintf("sqlar"
2ea00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  );.    }..    sw
2ea10 69 74 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29  itch( cmd.eCmd )
2ea20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  {.      case AR_
2ea30 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
2ea40 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
2ea50 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2ea60 28 26 63 6d 64 2c 20 30 2c 20 30 29 3b 0a 20 20  (&cmd, 0, 0);.  
2ea70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2ea80 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2ea90 45 58 54 52 41 43 54 3a 0a 20 20 20 20 20 20 20  EXTRACT:.       
2eaa0 20 72 63 20 3d 20 61 72 45 78 74 72 61 63 74 43   rc = arExtractC
2eab0 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
2eac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2ead0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2eae0 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20 72 63  LIST:.        rc
2eaf0 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64   = arListCommand
2eb00 28 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20  (&cmd);.        
2eb10 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61  break;..      ca
2eb20 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
2eb30 20 20 20 20 20 20 20 20 61 72 55 73 61 67 65 28          arUsage(
2eb40 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20  pState->out);.  
2eb50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2eb60 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2eb70 49 4e 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20  INSERT:.        
2eb80 72 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55  rc = arCreateOrU
2eb90 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d  pdateCommand(&cm
2eba0 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 1, 0);.      
2ebb0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
2ebc0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2ebd0 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65 43 6d   assert( cmd.eCm
2ebe0 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  d==AR_CMD_UPDATE
2ebf0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2ec00 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74   arCreateOrUpdat
2ec10 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31  eCommand(&cmd, 1
2ec20 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 1);.        br
2ec30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  eak;.    }.  }.e
2ec40 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3a 0a 20  nd_ar_command:. 
2ec50 20 69 66 28 20 63 6d 64 2e 64 62 21 3d 70 53 74   if( cmd.db!=pSt
2ec60 61 74 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 63  ate->db ){.    c
2ec70 6c 6f 73 65 5f 64 62 28 63 6d 64 2e 64 62 29 3b  lose_db(cmd.db);
2ec80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2ec90 72 65 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c  ree(cmd.zSrcTabl
2eca0 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  e);..  return rc
2ecb0 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  ;.}./* End of th
2ecc0 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20  e ".archive" or 
2ecd0 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f  ".ar" command lo
2ece0 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  gic.************
2ecf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed30 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
2ed40 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2ed50 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2ed60 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
2ed70 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
2ed80 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
2ed90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2eda0 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20  IRTUALTABLE) && 
2edb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2edc0 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54 41  NABLE_DBPAGE_VTA
2edd0 42 29 0a 2f 2a 0a 2a 2a 20 49 66 20 28 2a 70 52  B)./*.** If (*pR
2ede0 63 29 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  c) is not SQLITE
2edf0 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
2ee00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ee10 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2ee20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
2ee30 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
2ee40 20 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 69   or statements i
2ee50 6e 20 7a 53 71 6c 20 61 72 65 20 65 78 65 63 75  n zSql are execu
2ee60 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ted using.** dat
2ee70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2ee80 20 64 62 20 61 6e 64 20 74 68 65 20 65 72 72 6f   db and the erro
2ee90 72 20 63 6f 64 65 20 77 72 69 74 74 65 6e 20 74  r code written t
2eea0 6f 20 2a 70 52 63 20 62 65 66 6f 72 65 0a 2a 2a  o *pRc before.**
2eeb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2eec0 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  eturns..*/.stati
2eed0 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 78 65 63  c void shellExec
2eee0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2eef0 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
2ef00 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
2ef10 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 66   rc = *pRc;.  if
2ef20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ef30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  ){.    char *zEr
2ef40 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
2ef50 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2ef60 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45   zSql, 0, 0, &zE
2ef70 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  rr);.    if( rc!
2ef80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ef90 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2efa0 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
2efb0 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  r: %s\n", zErr);
2efc0 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
2efd0 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = rc;.  }.}../*.
2efe0 2a 2a 20 4c 69 6b 65 20 73 68 65 6c 6c 45 78 65  ** Like shellExe
2eff0 63 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  c(), except that
2f000 20 7a 46 6d 74 20 69 73 20 61 20 70 72 69 6e 74   zFmt is a print
2f010 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d 61 74  f() style format
2f020 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
2f030 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45 78 65  ic void shellExe
2f040 63 50 72 69 6e 74 66 28 73 71 6c 69 74 65 33 20  cPrintf(sqlite3 
2f050 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c 20 63  *db, int *pRc, c
2f060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
2f070 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
2f080 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2f090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f0a0 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
2f0b0 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
2f0c0 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73  zFmt);.    z = s
2f0d0 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
2f0e0 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  zFmt, ap);.    v
2f0f0 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
2f100 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
2f110 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2f120 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2f130 0a 20 20 20 20 20 20 73 68 65 6c 6c 45 78 65 63  .      shellExec
2f140 28 64 62 2c 20 70 52 63 2c 20 7a 29 3b 0a 20 20  (db, pRc, z);.  
2f150 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2f160 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(z);.  }.}..
2f170 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  /*.** If *pRc is
2f180 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77   not SQLITE_OK w
2f190 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2f1a0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
2f1b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
2f1c0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 61 74 74  therwise, an att
2f1d0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2f1e0 61 6c 6c 6f 63 61 74 65 2c 20 7a 65 72 6f 20 61  allocate, zero a
2f1f0 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
2f200 74 65 72 0a 2a 2a 20 74 6f 20 61 20 62 75 66 66  ter.** to a buff
2f210 65 72 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  er nByte bytes i
2f220 6e 20 73 69 7a 65 2e 20 49 66 20 61 6e 20 4f 4f  n size. If an OO
2f230 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
2f240 2a 70 52 63 20 69 73 20 73 65 74 0a 2a 2a 20 74  *pRc is set.** t
2f250 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
2f260 6e 64 20 4e 55 4c 4c 20 72 65 74 75 72 6e 65 64  nd NULL returned
2f270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f280 20 2a 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 69 6e   *shellMalloc(in
2f290 74 20 2a 70 52 63 2c 20 73 71 6c 69 74 65 33 5f  t *pRc, sqlite3_
2f2a0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
2f2b0 76 6f 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a  void *pRet = 0;.
2f2c0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
2f2d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65  TE_OK ){.    pRe
2f2e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
2f2f0 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20  oc64(nByte);.   
2f300 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
2f310 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
2f320 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2f330 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
2f340 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74  et(pRet, 0, nByt
2f350 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
2f360 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
2f370 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  /*.** If *pRc is
2f380 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77   not SQLITE_OK w
2f390 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2f3a0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
2f3b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
2f3c0 74 68 65 72 77 69 73 65 2c 20 7a 46 6d 74 20 69  therwise, zFmt i
2f3d0 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 70  s treated as a p
2f3e0 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 73 74  rintf() style st
2f3f0 72 69 6e 67 2e 20 54 68 65 20 72 65 73 75 6c 74  ring. The result
2f400 20 6f 66 0a 2a 2a 20 66 6f 72 6d 61 74 74 69 6e   of.** formattin
2f410 67 20 69 74 20 61 6c 6f 6e 67 20 77 69 74 68 20  g it along with 
2f420 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 72 67  any trailing arg
2f430 75 6d 65 6e 74 73 20 69 73 20 77 72 69 74 74 65  uments is writte
2f440 6e 20 69 6e 74 6f 20 61 20 0a 2a 2a 20 62 75 66  n into a .** buf
2f450 66 65 72 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  fer obtained fro
2f460 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2f470 28 29 2c 20 61 6e 64 20 70 6f 69 6e 74 65 72 20  (), and pointer 
2f480 74 6f 20 77 68 69 63 68 20 69 73 20 72 65 74 75  to which is retu
2f490 72 6e 65 64 2e 0a 2a 2a 20 49 74 20 69 73 20 74  rned..** It is t
2f4a0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2f4b0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2f4c0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  to eventually fr
2f4d0 65 65 20 74 68 69 73 20 62 75 66 66 65 72 0a 2a  ee this buffer.*
2f4e0 2a 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  * using a call t
2f4f0 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
2f500 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 61 6e 20 4f  ..** .** If an O
2f510 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
2f520 20 28 2a 70 52 63 29 20 69 73 20 73 65 74 20 74   (*pRc) is set t
2f530 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  o SQLITE_NOMEM a
2f540 6e 64 20 61 20 4e 55 4c 4c 20 0a 2a 2a 20 70 6f  nd a NULL .** po
2f550 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 2e 0a  inter returned..
2f560 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2f570 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 69 6e 74  shellMPrintf(int
2f580 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61   *pRc, const cha
2f590 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
2f5a0 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
2f5b0 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2f5c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69  _OK ){.    va_li
2f5d0 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74  st ap;.    va_st
2f5e0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
2f5f0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
2f600 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
2f610 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
2f620 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
2f630 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
2f640 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2f650 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f660 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65   z;.}../*.** Whe
2f670 6e 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 22 2e  n running the ".
2f680 72 65 63 6f 76 65 72 22 20 63 6f 6d 6d 61 6e 64  recover" command
2f690 2c 20 65 61 63 68 20 6f 75 74 70 75 74 20 74 61  , each output ta
2f6a0 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 73 70 65  ble, and the spe
2f6b0 63 69 61 6c 0a 2a 2a 20 6f 72 70 68 61 6e 65 64  cial.** orphaned
2f6c0 20 72 6f 77 20 74 61 62 6c 65 20 69 66 20 69 74   row table if it
2f6d0 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 69 73   is required, is
2f6e0 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20   represented by 
2f6f0 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
2f700 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2f710 73 74 72 75 63 74 2e 0a 2a 2f 0a 74 79 70 65 64  struct..*/.typed
2f720 65 66 20 73 74 72 75 63 74 20 52 65 63 6f 76 65  ef struct Recove
2f730 72 54 61 62 6c 65 20 52 65 63 6f 76 65 72 54 61  rTable RecoverTa
2f740 62 6c 65 3b 0a 73 74 72 75 63 74 20 52 65 63 6f  ble;.struct Reco
2f750 76 65 72 54 61 62 6c 65 20 7b 0a 20 20 63 68 61  verTable {.  cha
2f760 72 20 2a 7a 51 75 6f 74 65 64 3b 20 20 20 20 20  r *zQuoted;     
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f780 51 75 6f 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  Quoted version o
2f790 66 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  f table name */.
2f7a0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
2f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2f7d0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
2f7e0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 6c 43  */.  char **azlC
2f7f0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
2f800 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2f810 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 73 20 2a 2f   column lists */
2f820 0a 20 20 69 6e 74 20 69 50 6b 3b 20 20 20 20 20  .  int iPk;     
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f840 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 49     /* Index of I
2f850 50 4b 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 7d 3b 0a  PK column */.};.
2f860 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 52 65  ./*.** Free a Re
2f870 63 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a 65 63  coverTable objec
2f880 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 72  t allocated by r
2f890 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28  ecoverFindTable(
2f8a0 29 20 6f 72 0a 2a 2a 20 72 65 63 6f 76 65 72 4f  ) or.** recoverO
2f8b0 72 70 68 61 6e 54 61 62 6c 65 28 29 2e 0a 2a 2f  rphanTable()..*/
2f8c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63  .static void rec
2f8d0 6f 76 65 72 46 72 65 65 54 61 62 6c 65 28 52 65  overFreeTable(Re
2f8e0 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62  coverTable *pTab
2f8f0 29 7b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  ){.  if( pTab ){
2f900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2f910 65 28 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 29  e(pTab->zQuoted)
2f920 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
2f930 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  azlCol ){.      
2f940 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
2f950 28 69 3d 30 3b 20 69 3c 3d 70 54 61 62 2d 3e 6e  (i=0; i<=pTab->n
2f960 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2f970 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2f980 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 29  pTab->azlCol[i])
2f990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f9a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
2f9b0 62 2d 3e 61 7a 6c 43 6f 6c 29 3b 0a 20 20 20 20  b->azlCol);.    
2f9c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2f9d0 65 65 28 70 54 61 62 29 3b 0a 20 20 7d 0a 7d 0a  ee(pTab);.  }.}.
2f9e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f9f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
2fa00 69 66 20 28 2a 70 52 63 29 20 69 73 20 6e 6f 74  if (*pRc) is not
2fa10 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2fa20 69 74 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  it is called..**
2fa30 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
2fa40 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
2fa50 75 72 6e 73 20 61 20 52 65 63 6f 76 65 72 54 61  urns a RecoverTa
2fa60 62 6c 65 20 6f 62 6a 65 63 74 20 62 61 73 65 64  ble object based
2fa70 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c   on the.** final
2fa80 20 66 6f 75 72 20 61 72 67 75 6d 65 6e 74 73 20   four arguments 
2fa90 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
2faa0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
2fab0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2fac0 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c  y.** of the call
2fad0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
2fae0 20 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e   free the return
2faf0 65 64 20 6f 62 6a 65 63 74 20 75 73 69 6e 67 0a  ed object using.
2fb00 2a 2a 20 72 65 63 6f 76 65 72 46 72 65 65 54 61  ** recoverFreeTa
2fb10 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ble()..*/.static
2fb20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72   RecoverTable *r
2fb30 65 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 0a  ecoverNewTable(.
2fb40 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
2fb70 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  or code */.  con
2fb80 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fba0 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a 2f  Name of table */
2fbb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fbc0 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
2fbd0 20 20 20 2f 2a 20 43 52 45 41 54 45 20 54 41 42     /* CREATE TAB
2fbe0 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  LE statement */.
2fbf0 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 2c 20 0a    int bIntkey, .
2fc00 20 20 69 6e 74 20 6e 43 6f 6c 0a 29 7b 0a 20 20    int nCol.){.  
2fc10 73 71 6c 69 74 65 33 20 2a 64 62 74 6d 70 20 3d  sqlite3 *dbtmp =
2fc20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2fc30 2f 2a 20 73 71 6c 69 74 65 33 20 68 61 6e 64 6c  /* sqlite3 handl
2fc40 65 20 66 6f 72 20 74 65 73 74 69 6e 67 20 43 52  e for testing CR
2fc50 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20  EATE TABLE */.  
2fc60 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20  int rc = *pRc;. 
2fc70 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 70   RecoverTable *p
2fc80 54 61 62 20 3d 20 30 3b 0a 0a 20 20 70 54 61 62  Tab = 0;..  pTab
2fc90 20 3d 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65   = (RecoverTable
2fca0 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72  *)shellMalloc(&r
2fcb0 63 2c 20 73 69 7a 65 6f 66 28 52 65 63 6f 76 65  c, sizeof(Recove
2fcc0 72 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  rTable));.  if( 
2fcd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fce0 0a 20 20 20 20 69 6e 74 20 6e 53 71 6c 43 6f 6c  .    int nSqlCol
2fcf0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 53   = 0;.    int bS
2fd00 71 6c 49 6e 74 6b 65 79 20 3d 20 30 3b 0a 20 20  qlIntkey = 0;.  
2fd10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2fd20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 0a  pStmt = 0;.    .
2fd30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fd40 5f 6f 70 65 6e 28 22 22 2c 20 26 64 62 74 6d 70  _open("", &dbtmp
2fd50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2fd60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fd70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2fd80 78 65 63 28 64 62 74 6d 70 2c 20 22 50 52 41 47  xec(dbtmp, "PRAG
2fd90 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
2fda0 6d 61 20 3d 20 6f 6e 22 2c 20 30 2c 20 30 2c 20  ma = on", 0, 0, 
2fdb0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
2fdc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fdd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2fde0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 74 6d 70  lite3_exec(dbtmp
2fdf0 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
2fe00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2fe10 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a  SQLITE_ERROR ){.
2fe20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2fe30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2fe40 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20  goto finished;. 
2fe50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2fe60 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
2fe70 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63 2c 20  ntf(dbtmp, &rc, 
2fe80 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20  &pStmt, .       
2fe90 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
2fea0 29 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61  ) FROM pragma_ta
2feb0 62 6c 65 5f 69 6e 66 6f 28 25 51 29 22 2c 20 7a  ble_info(%Q)", z
2fec0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
2fed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fee0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
2fef0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2ff00 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 53  tmt) ){.      nS
2ff10 71 6c 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f  qlCol = sqlite3_
2ff20 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2ff30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2ff40 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
2ff50 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  c, pStmt);..    
2ff60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ff70 4b 20 7c 7c 20 6e 53 71 6c 43 6f 6c 3c 6e 43 6f  K || nSqlCol<nCo
2ff80 6c 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  l ){.      goto 
2ff90 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
2ffa0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
2ffb0 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26  ePrintf(dbtmp, &
2ffc0 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20  rc, &pStmt, .   
2ffd0 20 20 20 22 53 45 4c 45 43 54 20 28 22 0a 20 20     "SELECT (".  
2ffe0 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 75      "  SELECT su
2fff0 62 73 74 72 28 64 61 74 61 2c 31 2c 31 29 3d 3d  bstr(data,1,1)==
30000 58 27 30 44 27 20 46 52 4f 4d 20 73 71 6c 69 74  X'0D' FROM sqlit
30010 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20 70  e_dbpage WHERE p
30020 67 6e 6f 3d 72 6f 6f 74 70 61 67 65 22 0a 20 20  gno=rootpage".  
30030 20 20 20 20 22 29 20 46 52 4f 4d 20 73 71 6c 69      ") FROM sqli
30040 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
30050 6e 61 6d 65 20 3d 20 25 51 22 2c 20 7a 4e 61 6d  name = %Q", zNam
30060 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
30070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30080 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
30090 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
300a0 29 20 29 7b 0a 20 20 20 20 20 20 62 53 71 6c 49  ) ){.      bSqlI
300b0 6e 74 6b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  ntkey = sqlite3_
300c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
300d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
300e0 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
300f0 63 2c 20 70 53 74 6d 74 29 3b 0a 0a 20 20 20 20  c, pStmt);..    
30100 69 66 28 20 62 49 6e 74 6b 65 79 3d 3d 62 53 71  if( bIntkey==bSq
30110 6c 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20 20  lIntkey ){.     
30120 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f   int i;.      co
30130 6e 73 74 20 63 68 61 72 20 2a 7a 50 6b 20 3d 20  nst char *zPk = 
30140 22 5f 72 6f 77 69 64 5f 22 3b 0a 20 20 20 20 20  "_rowid_";.     
30150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
30160 50 6b 46 69 6e 64 65 72 20 3d 20 30 3b 0a 0a 20  PkFinder = 0;.. 
30170 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
30180 69 73 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  is an intkey tab
30190 6c 65 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  le and there is 
301a0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
301b0 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 2a 2a  RY KEY,.      **
301c0 20 73 65 74 20 7a 50 6b 20 74 6f 20 74 68 65 20   set zPk to the 
301d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 50 4b 20 63  name of the PK c
301e0 6f 6c 75 6d 6e 2c 20 61 6e 64 20 70 54 61 62 2d  olumn, and pTab-
301f0 3e 69 50 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  >iPk to the inde
30200 78 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  x.      ** of th
30210 65 20 63 6f 6c 75 6d 6e 2c 20 77 68 65 72 65 20  e column, where 
30220 63 6f 6c 75 6d 6e 73 20 61 72 65 20 30 2d 6e 75  columns are 0-nu
30230 6d 62 65 72 65 64 20 66 72 6f 6d 20 6c 65 66 74  mbered from left
30240 20 74 6f 20 72 69 67 68 74 2e 0a 20 20 20 20 20   to right..     
30250 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69 73 20   ** Or, if this 
30260 69 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  is a WITHOUT ROW
30270 49 44 20 74 61 62 6c 65 20 6f 72 20 69 66 20 74  ID table or if t
30280 68 65 72 65 20 69 73 20 6e 6f 20 49 50 4b 20 63  here is no IPK c
30290 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 2a 2a 20  olumn,.      ** 
302a0 6c 65 61 76 65 20 7a 50 6b 20 61 73 20 22 5f 72  leave zPk as "_r
302b0 6f 77 69 64 5f 22 20 61 6e 64 20 70 54 61 62 2d  owid_" and pTab-
302c0 3e 69 50 6b 20 61 74 20 2d 32 2e 20 20 2a 2f 0a  >iPk at -2.  */.
302d0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 6b 20        pTab->iPk 
302e0 3d 20 2d 32 3b 0a 20 20 20 20 20 20 69 66 28 20  = -2;.      if( 
302f0 62 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20 20  bIntkey ){.     
30300 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
30310 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26 72 63  rintf(dbtmp, &rc
30320 2c 20 26 70 50 6b 46 69 6e 64 65 72 2c 20 0a 20  , &pPkFinder, . 
30330 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
30340 20 63 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20   cid, name FROM 
30350 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66  pragma_table_inf
30360 6f 28 25 51 29 20 22 0a 20 20 20 20 20 20 20 20  o(%Q) ".        
30370 20 20 22 20 20 57 48 45 52 45 20 70 6b 3d 31 20    "  WHERE pk=1 
30380 41 4e 44 20 74 79 70 65 3d 27 69 6e 74 65 67 65  AND type='intege
30390 72 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  r' COLLATE nocas
303a0 65 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  e".          "  
303b0 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 20 28  AND NOT EXISTS (
303c0 53 45 4c 45 43 54 20 63 69 64 20 46 52 4f 4d 20  SELECT cid FROM 
303d0 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66  pragma_table_inf
303e0 6f 28 25 51 29 20 57 48 45 52 45 20 70 6b 3d 32  o(%Q) WHERE pk=2
303f0 29 22 0a 20 20 20 20 20 20 20 20 20 20 2c 20 7a  )".          , z
30400 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Name, zName.    
30410 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
30420 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30430 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
30440 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 50 6b  sqlite3_step(pPk
30450 46 69 6e 64 65 72 29 20 29 7b 0a 20 20 20 20 20  Finder) ){.     
30460 20 20 20 20 20 70 54 61 62 2d 3e 69 50 6b 20 3d       pTab->iPk =
30470 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
30480 69 6e 74 28 70 50 6b 46 69 6e 64 65 72 2c 20 30  int(pPkFinder, 0
30490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 6b  );.          zPk
304a0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
304b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
304c0 65 78 74 28 70 50 6b 46 69 6e 64 65 72 2c 20 31  ext(pPkFinder, 1
304d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
304e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 54 61 62     }..      pTab
304f0 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65 6c  ->zQuoted = shel
30500 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25  lMPrintf(&rc, "%
30510 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Q", zName);.    
30520 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20 3d    pTab->azlCol =
30530 20 28 63 68 61 72 2a 2a 29 73 68 65 6c 6c 4d 61   (char**)shellMa
30540 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66  lloc(&rc, sizeof
30550 28 63 68 61 72 2a 29 20 2a 20 28 6e 53 71 6c 43  (char*) * (nSqlC
30560 6f 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ol+1));.      pT
30570 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 53 71 6c 43  ab->nCol = nSqlC
30580 6f 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62  ol;..      if( b
30590 49 6e 74 6b 65 79 20 29 7b 0a 20 20 20 20 20 20  Intkey ){.      
305a0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30    pTab->azlCol[0
305b0 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
305c0 28 26 72 63 2c 20 22 25 51 22 2c 20 7a 50 6b 29  (&rc, "%Q", zPk)
305d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
305e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c         pTab->azl
305f0 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c 6c 4d 50  Col[0] = shellMP
30600 72 69 6e 74 66 28 26 72 63 2c 20 22 22 29 3b 0a  rintf(&rc, "");.
30610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
30620 3d 20 31 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  = 1;.      shell
30630 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 64 62  PreparePrintf(db
30640 74 6d 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  tmp, &rc, &pStmt
30650 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  , .          "SE
30660 4c 45 43 54 20 25 51 20 7c 7c 20 67 72 6f 75 70  LECT %Q || group
30670 5f 63 6f 6e 63 61 74 28 6e 61 6d 65 2c 20 27 2c  _concat(name, ',
30680 20 27 29 20 22 0a 20 20 20 20 20 20 20 20 20 20   ') ".          
30690 22 20 20 46 49 4c 54 45 52 20 28 57 48 45 52 45  "  FILTER (WHERE
306a0 20 63 69 64 21 3d 25 64 29 20 4f 56 45 52 20 28   cid!=%d) OVER (
306b0 4f 52 44 45 52 20 42 59 20 25 73 20 63 69 64 29  ORDER BY %s cid)
306c0 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 46 52   ".          "FR
306d0 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f  OM pragma_table_
306e0 69 6e 66 6f 28 25 51 29 22 2c 20 0a 20 20 20 20  info(%Q)", .    
306f0 20 20 20 20 20 20 62 49 6e 74 6b 65 79 20 3f 20        bIntkey ? 
30700 22 2c 20 22 20 3a 20 22 22 2c 20 70 54 61 62 2d  ", " : "", pTab-
30710 3e 69 50 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  >iPk, .         
30720 20 62 49 6e 74 6b 65 79 20 3f 20 22 22 20 3a 20   bIntkey ? "" : 
30730 22 28 43 41 53 45 20 57 48 45 4e 20 70 6b 3d 30  "(CASE WHEN pk=0
30740 20 54 48 45 4e 20 31 30 30 30 30 30 30 20 45 4c   THEN 1000000 EL
30750 53 45 20 70 6b 20 45 4e 44 29 2c 20 22 2c 0a 20  SE pk END), ",. 
30760 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 0a 20           zName. 
30770 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 77 68       );.      wh
30780 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
30790 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
307a0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
307b0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stmt) ){.       
307c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
307d0 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  xt = (const char
307e0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
307f0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
30800 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
30810 7a 6c 43 6f 6c 5b 69 5d 20 3d 20 73 68 65 6c 6c  zlCol[i] = shell
30820 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 25 73  MPrintf(&rc, "%s
30830 25 73 22 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f  %s", pTab->azlCo
30840 6c 5b 30 5d 2c 20 7a 54 65 78 74 29 3b 0a 20 20  l[0], zText);.  
30850 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
30860 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 46 69   }.      shellFi
30870 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
30880 74 29 3b 0a 0a 20 20 20 20 20 20 73 68 65 6c 6c  t);..      shell
30890 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 50  Finalize(&rc, pP
308a0 6b 46 69 6e 64 65 72 29 3b 0a 20 20 20 20 7d 0a  kFinder);.    }.
308b0 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a    }.. finished:.
308c0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
308d0 64 62 74 6d 70 29 3b 0a 20 20 2a 70 52 63 20 3d  dbtmp);.  *pRc =
308e0 20 72 63 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   rc;.  if( rc!=S
308f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30900 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c 65  recoverFreeTable
30910 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61 62  (pTab);.    pTab
30920 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
30930 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
30940 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30950 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 73 65 61  is called to sea
30960 72 63 68 20 74 68 65 20 73 63 68 65 6d 61 20 72  rch the schema r
30970 65 63 6f 76 65 72 65 64 20 66 72 6f 6d 20 74 68  ecovered from th
30980 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74  e.** sqlite_mast
30990 65 72 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  er table of the 
309a0 28 70 6f 73 73 69 62 6c 79 29 20 63 6f 72 72 75  (possibly) corru
309b0 70 74 20 64 61 74 61 62 61 73 65 20 61 73 20 70  pt database as p
309c0 61 72 74 0a 2a 2a 20 6f 66 20 61 20 22 2e 72 65  art.** of a ".re
309d0 63 6f 76 65 72 22 20 63 6f 6d 6d 61 6e 64 2e 20  cover" command. 
309e0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 66 6f  Specifically, fo
309f0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  r a table with r
30a00 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 52 6f 6f  oot page.** iRoo
30a10 74 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20 6e  t and at least n
30a20 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 20 41 64 64  Col columns. Add
30a30 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 62 49  itionally, if bI
30a40 6e 74 6b 65 79 20 69 73 20 30 2c 20 74 68 65 0a  ntkey is 0, the.
30a50 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ** table must be
30a60 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
30a70 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 20 6e 6f   table, or if no
30a80 6e 2d 7a 65 72 6f 2c 20 6e 6f 74 20 6f 6e 65 20  n-zero, not one 
30a90 6f 66 0a 2a 2a 20 74 68 6f 73 65 2e 0a 2a 2a 0a  of.** those..**.
30aa0 2a 2a 20 49 66 20 61 20 74 61 62 6c 65 20 69 73  ** If a table is
30ab0 20 66 6f 75 6e 64 2c 20 61 20 28 52 65 63 6f 76   found, a (Recov
30ac0 65 72 54 61 62 6c 65 2a 29 20 6f 62 6a 65 63 74  erTable*) object
30ad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
30ae0 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
30af0 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20  table is found, 
30b00 62 75 74 20 62 49 6e 74 6b 65 79 20 69 73 20 66  but bIntkey is f
30b10 61 6c 73 65 20 61 6e 64 20 69 52 6f 6f 74 20 69  alse and iRoot i
30b20 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 20 70  s the .** root p
30b30 61 67 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  age of an index 
30b40 69 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65 64  in the recovered
30b50 20 73 63 68 65 6d 61 2c 20 74 68 65 6e 20 28 2a   schema, then (*
30b60 70 62 4e 6f 6f 70 29 20 69 73 0a 2a 2a 20 73 65  pbNoop) is.** se
30b70 74 20 74 6f 20 74 72 75 65 20 61 6e 64 20 4e 55  t to true and NU
30b80 4c 4c 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  LL returned. Or,
30b90 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
30ba0 73 75 63 68 20 74 61 62 6c 65 20 6f 72 0a 2a 2a  such table or.**
30bb0 20 69 6e 64 65 78 2c 20 4e 55 4c 4c 20 69 73 20   index, NULL is 
30bc0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28 2a 70  returned and (*p
30bd0 62 4e 6f 6f 70 29 20 73 65 74 20 74 6f 20 30 2c  bNoop) set to 0,
30be0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
30bf0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 73  .** the caller s
30c00 68 6f 75 6c 64 20 77 72 69 74 65 20 64 61 74 61  hould write data
30c10 20 74 6f 20 74 68 65 20 6f 72 70 68 61 6e 73 20   to the orphans 
30c20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
30c30 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72   RecoverTable *r
30c40 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28  ecoverFindTable(
30c50 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
30c60 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
30c70 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
30c80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
30c90 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30cb0 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
30cc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  ode */.  int iRo
30cd0 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
30ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
30cf0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 2a   page of table *
30d00 2f 0a 20 20 69 6e 74 20 62 49 6e 74 6b 65 79 2c  /.  int bIntkey,
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
30d30 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  an intkey table 
30d40 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
30d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30d70 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  f columns in tab
30d80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  le */.  int *pbN
30d90 6f 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  oop             
30da0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
30db0 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
30dc0 20 72 6f 6f 74 20 6f 66 20 69 6e 64 65 78 20 2a   root of index *
30dd0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
30de0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
30df0 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 2a    RecoverTable *
30e00 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pRet = 0;.  int 
30e10 62 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 63 6f 6e  bNoop = 0;.  con
30e20 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
30e30 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
30e40 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f  *zName = 0;..  /
30e50 2a 20 53 65 61 72 63 68 20 74 68 65 20 72 65 63  * Search the rec
30e60 6f 76 65 72 65 64 20 73 63 68 65 6d 61 20 66 6f  overed schema fo
30e70 72 20 61 6e 20 6f 62 6a 65 63 74 20 77 69 74 68  r an object with
30e80 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
30e90 2e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70  . */.  shellPrep
30ea0 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65  arePrintf(pState
30eb0 2d 3e 64 62 2c 20 70 52 63 2c 20 26 70 53 74 6d  ->db, pRc, &pStm
30ec0 74 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  t,.      "SELECT
30ed0 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 73 71 6c   type, name, sql
30ee0 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73   FROM recovery.s
30ef0 63 68 65 6d 61 20 57 48 45 52 45 20 72 6f 6f 74  chema WHERE root
30f00 70 61 67 65 3d 25 64 22 2c 20 69 52 6f 6f 74 0a  page=%d", iRoot.
30f10 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70    );.  while( *p
30f20 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  Rc==SQLITE_OK &&
30f30 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
30f40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
30f50 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
30f60 61 72 20 2a 7a 54 79 70 65 20 3d 20 28 63 6f 6e  ar *zType = (con
30f70 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
30f80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
30f90 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
30fa0 62 49 6e 74 6b 65 79 3d 3d 30 20 26 26 20 73 71  bIntkey==0 && sq
30fb0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
30fc0 79 70 65 2c 20 22 69 6e 64 65 78 22 29 3d 3d 30  ype, "index")==0
30fd0 20 29 7b 0a 20 20 20 20 20 20 62 4e 6f 6f 70 20   ){.      bNoop 
30fe0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
30ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31000 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
31010 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d  zType, "table")=
31020 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  =0 ){.      zNam
31030 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
31040 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
31050 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
31060 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f        zSql = (co
31070 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
31080 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
31090 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 70  tmt, 2);.      p
310a0 52 65 74 20 3d 20 72 65 63 6f 76 65 72 4e 65 77  Ret = recoverNew
310b0 54 61 62 6c 65 28 70 52 63 2c 20 7a 4e 61 6d 65  Table(pRc, zName
310c0 2c 20 7a 53 71 6c 2c 20 62 49 6e 74 6b 65 79 2c  , zSql, bIntkey,
310d0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72   nCol);.      br
310e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
310f0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
31100 70 52 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 2a  pRc, pStmt);.  *
31110 70 62 4e 6f 6f 70 20 3d 20 62 4e 6f 6f 70 3b 0a  pbNoop = bNoop;.
31120 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
31130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
31140 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62   RecoverTable ob
31150 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
31160 67 20 74 68 65 20 6f 72 70 68 61 6e 73 20 74 61  g the orphans ta
31170 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52  ble..*/.static R
31180 65 63 6f 76 65 72 54 61 62 6c 65 20 2a 72 65 63  ecoverTable *rec
31190 6f 76 65 72 4f 72 70 68 61 6e 54 61 62 6c 65 28  overOrphanTable(
311a0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
311b0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
311c0 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
311d0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
311e0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31200 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
31210 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
31220 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f 75  har *zLostAndFou
31230 6e 64 2c 20 20 20 20 20 20 2f 2a 20 42 61 73 65  nd,      /* Base
31240 20 6e 61 6d 65 20 66 6f 72 20 6f 72 70 68 61 6e   name for orphan
31250 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
31260 20 6e 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   nCol           
31270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31280 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64  Number of user d
31290 61 74 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29  ata columns */.)
312a0 7b 0a 20 20 52 65 63 6f 76 65 72 54 61 62 6c 65  {.  RecoverTable
312b0 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 69 66   *pTab = 0;.  if
312c0 28 20 6e 43 6f 6c 3e 3d 30 20 26 26 20 2a 70 52  ( nCol>=0 && *pR
312d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
312e0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
312f0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
31300 74 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d  termines the nam
31310 65 20 6f 66 20 74 68 65 20 6f 72 70 68 61 6e 20  e of the orphan 
31320 74 61 62 6c 65 2e 20 54 68 65 20 70 72 65 66 65  table. The prefe
31330 72 65 64 0a 20 20 20 20 2a 2a 20 6e 61 6d 65 20  red.    ** name 
31340 69 73 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64  is zLostAndFound
31350 2e 20 42 75 74 20 69 66 20 74 68 61 74 20 63 6c  . But if that cl
31360 61 73 68 65 73 20 77 69 74 68 20 61 6e 6f 74 68  ashes with anoth
31370 65 72 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 69  er name.    ** i
31380 6e 20 74 68 65 20 72 65 63 6f 76 65 72 65 64 20  n the recovered 
31390 73 63 68 65 6d 61 2c 20 74 72 79 20 7a 4c 6f 73  schema, try zLos
313a0 74 41 6e 64 46 6f 75 6e 64 5f 30 2c 20 7a 4c 6f  tAndFound_0, zLo
313b0 73 74 41 6e 64 46 6f 75 6e 64 5f 31 0a 20 20 20  stAndFound_1.   
313c0 20 2a 2a 20 61 6e 64 20 73 6f 20 6f 6e 20 75 6e   ** and so on un
313d0 74 69 6c 20 61 20 6e 6f 6e 2d 63 6c 61 73 68 69  til a non-clashi
313e0 6e 67 20 6e 61 6d 65 20 69 73 20 66 6f 75 6e 64  ng name is found
313f0 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54  .  */.    int iT
31400 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  ab = 0;.    char
31410 20 2a 7a 54 61 62 20 3d 20 73 68 65 6c 6c 4d 50   *zTab = shellMP
31420 72 69 6e 74 66 28 70 52 63 2c 20 22 25 73 22 2c  rintf(pRc, "%s",
31430 20 7a 4c 6f 73 74 41 6e 64 46 6f 75 6e 64 29 3b   zLostAndFound);
31440 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
31450 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 20 20  t *pTest = 0;.  
31460 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
31470 53 74 61 74 65 2d 3e 64 62 2c 20 70 52 63 2c 0a  State->db, pRc,.
31480 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
31490 31 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  1 FROM recovery.
314a0 73 63 68 65 6d 61 20 57 48 45 52 45 20 6e 61 6d  schema WHERE nam
314b0 65 3d 3f 22 2c 20 26 70 54 65 73 74 0a 20 20 20  e=?", &pTest.   
314c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73   );.    if( pTes
314d0 74 20 29 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  t ) sqlite3_bind
314e0 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c 20  _text(pTest, 1, 
314f0 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zTab, -1, SQLITE
31500 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
31510 20 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51   while( *pRc==SQ
31520 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
31530 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
31540 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
31550 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28 70      shellReset(p
31560 52 63 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20  Rc, pTest);.    
31570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
31580 54 61 62 29 3b 0a 20 20 20 20 20 20 7a 54 61 62  Tab);.      zTab
31590 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
315a0 70 52 63 2c 20 22 25 73 5f 25 64 22 2c 20 7a 4c  pRc, "%s_%d", zL
315b0 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 69 54 61  ostAndFound, iTa
315c0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  b++);.      sqli
315d0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
315e0 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d 31  est, 1, zTab, -1
315f0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
31600 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  NT);.    }.    s
31610 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 70 52 63  hellFinalize(pRc
31620 2c 20 70 54 65 73 74 29 3b 0a 0a 20 20 20 20 70  , pTest);..    p
31630 54 61 62 20 3d 20 28 52 65 63 6f 76 65 72 54 61  Tab = (RecoverTa
31640 62 6c 65 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63  ble*)shellMalloc
31650 28 70 52 63 2c 20 73 69 7a 65 6f 66 28 52 65 63  (pRc, sizeof(Rec
31660 6f 76 65 72 54 61 62 6c 65 29 29 3b 0a 20 20 20  overTable));.   
31670 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
31680 20 20 20 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64     pTab->zQuoted
31690 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28   = shellMPrintf(
316a0 70 52 63 2c 20 22 25 51 22 2c 20 7a 54 61 62 29  pRc, "%Q", zTab)
316b0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
316c0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20  ol = nCol;.     
316d0 20 70 54 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b   pTab->iPk = -2;
316e0 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e  .      if( nCol>
316f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  0 ){.        pTa
31700 62 2d 3e 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61  b->azlCol = (cha
31710 72 2a 2a 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28  r**)shellMalloc(
31720 70 52 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  pRc, sizeof(char
31730 2a 29 20 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a  *) * (nCol+1));.
31740 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
31750 2d 3e 61 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20  ->azlCol ){.    
31760 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43        pTab->azlC
31770 6f 6c 5b 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c  ol[nCol] = shell
31780 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 22 29  MPrintf(pRc, "")
31790 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
317a0 69 3d 6e 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20  i=nCol-1; i>=0; 
317b0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i--){.          
317c0 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69    pTab->azlCol[i
317d0 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66  ] = shellMPrintf
317e0 28 70 52 63 2c 20 22 25 73 2c 20 4e 55 4c 4c 22  (pRc, "%s, NULL"
317f0 2c 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69  , pTab->azlCol[i
31800 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1]);.          
31810 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31820 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 2a    }..      if( *
31830 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc!=SQLITE_OK )
31840 7b 0a 20 20 20 20 20 20 20 20 72 65 63 6f 76 65  {.        recove
31850 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
31860 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
31870 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
31880 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
31890 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
318a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43   .            "C
318b0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28 72  REATE TABLE %s(r
318c0 6f 6f 74 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c  ootpgno INTEGER,
318d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
318e0 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 6e 66  pgno INTEGER, nf
318f0 69 65 6c 64 20 49 4e 54 45 47 45 52 2c 20 69 64  ield INTEGER, id
31900 20 49 4e 54 45 47 45 52 22 2c 20 70 54 61 62 2d   INTEGER", pTab-
31910 3e 7a 51 75 6f 74 65 64 0a 20 20 20 20 20 20 20  >zQuoted.       
31920 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
31930 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
31940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
31950 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
31960 6f 75 74 2c 20 22 2c 20 63 25 64 22 2c 20 69 29  out, ", c%d", i)
31970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31980 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
31990 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c  State->out, ");\
319a0 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
319b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
319c0 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20  ree(zTab);.  }. 
319d0 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
319e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
319f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
31a00 6f 20 72 65 63 6f 76 65 72 20 64 61 74 61 20 66  o recover data f
31a10 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
31a20 2e 20 41 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f  . A script.** to
31a30 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
31a40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
31a50 6e 69 6e 67 20 61 6c 6c 20 72 65 63 6f 76 65 72  ning all recover
31a60 65 64 20 64 61 74 61 20 69 73 20 6f 75 74 70 75  ed data is outpu
31a70 74 0a 2a 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70  t.** on stream p
31a80 53 74 61 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73  State->out..*/.s
31a90 74 61 74 69 63 20 69 6e 74 20 72 65 63 6f 76 65  tatic int recove
31aa0 72 44 61 74 61 62 61 73 65 43 6d 64 28 53 68 65  rDatabaseCmd(She
31ab0 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
31ac0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
31ad0 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20  **azArg){.  int 
31ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31af0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
31b00 70 4c 6f 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  pLoop = 0;      
31b10 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
31b20 68 20 61 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73  h all root pages
31b30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
31b40 6d 74 20 2a 70 50 61 67 65 73 20 3d 20 30 3b 20  mt *pPages = 0; 
31b50 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
31b60 72 6f 75 67 68 20 61 6c 6c 20 70 61 67 65 73 20  rough all pages 
31b70 69 6e 20 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20  in a group */.  
31b80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 43  sqlite3_stmt *pC
31b90 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
31ba0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
31bb0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 20 70  all cells in a p
31bc0 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  age */.  const c
31bd0 68 61 72 20 2a 7a 52 65 63 6f 76 65 72 79 44 62  har *zRecoveryDb
31be0 20 3d 20 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65   = "";   /* Name
31bf0 20 6f 66 20 22 72 65 63 6f 76 65 72 79 22 20 64   of "recovery" d
31c00 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
31c10 73 74 20 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e  st char *zLostAn
31c20 64 46 6f 75 6e 64 20 3d 20 22 6c 6f 73 74 5f 61  dFound = "lost_a
31c30 6e 64 5f 66 6f 75 6e 64 22 3b 0a 20 20 69 6e 74  nd_found";.  int
31c40 20 69 3b 0a 20 20 69 6e 74 20 6e 4f 72 70 68 61   i;.  int nOrpha
31c50 6e 20 3d 20 2d 31 3b 0a 20 20 52 65 63 6f 76 65  n = -1;.  Recove
31c60 72 54 61 62 6c 65 20 2a 70 4f 72 70 68 61 6e 20  rTable *pOrphan 
31c70 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 46 72 65  = 0;..  int bFre
31c80 65 6c 69 73 74 20 3d 20 31 3b 20 20 20 20 20 20  elist = 1;      
31c90 20 20 20 20 20 20 20 20 2f 2a 20 30 20 69 66 20          /* 0 if 
31ca0 2d 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75  --freelist-corru
31cb0 70 74 20 69 73 20 73 70 65 63 69 66 69 65 64 20  pt is specified 
31cc0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
31cd0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
31ce0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
31cf0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  i];.    int n;. 
31d00 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
31d10 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
31d20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72  z++;.    n = str
31d30 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  len(z);.    if( 
31d40 6e 3c 3d 31 37 20 26 26 20 6d 65 6d 63 6d 70 28  n<=17 && memcmp(
31d50 22 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75  "-freelist-corru
31d60 70 74 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b  pt", z, n)==0 ){
31d70 0a 20 20 20 20 20 20 62 46 72 65 65 6c 69 73 74  .      bFreelist
31d80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a   = 0;.    }else.
31d90 20 20 20 20 69 66 28 20 6e 3c 3d 31 32 20 26 26      if( n<=12 &&
31da0 20 6d 65 6d 63 6d 70 28 22 2d 72 65 63 6f 76 65   memcmp("-recove
31db0 72 79 2d 64 62 22 2c 20 7a 2c 20 6e 29 3d 3d 30  ry-db", z, n)==0
31dc0 20 26 26 20 69 3c 28 6e 41 72 67 2d 31 29 20 29   && i<(nArg-1) )
31dd0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
31de0 20 20 20 7a 52 65 63 6f 76 65 72 79 44 62 20 3d     zRecoveryDb =
31df0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 7d   azArg[i];.    }
31e00 65 6c 73 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d  else.    if( n<=
31e10 31 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 6c  15 && memcmp("-l
31e20 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 22 2c 20  ost-and-found", 
31e30 7a 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28 6e  z, n)==0 && i<(n
31e40 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
31e50 69 2b 2b 3b 0a 20 20 20 20 20 20 7a 4c 6f 73 74  i++;.      zLost
31e60 41 6e 64 46 6f 75 6e 64 20 3d 20 61 7a 41 72 67  AndFound = azArg
31e70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  [i];.    }.    e
31e80 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
31e90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
31ea0 6e 65 78 70 65 63 74 65 64 20 6f 70 74 69 6f 6e  nexpected option
31eb0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  : %s\n", azArg[i
31ec0 5d 29 3b 20 0a 20 20 20 20 20 20 72 61 77 5f 70  ]); .      raw_p
31ed0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
31ee0 70 74 69 6f 6e 73 20 61 72 65 3a 5c 6e 22 29 3b  ptions are:\n");
31ef0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31f00 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d  f(stderr, "    -
31f10 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70  -freelist-corrup
31f20 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 61 77  t\n");.      raw
31f30 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31f40 22 20 20 20 20 2d 2d 72 65 63 6f 76 65 72 79 2d  "    --recovery-
31f50 64 62 20 44 41 54 41 42 41 53 45 5c 6e 22 29 3b  db DATABASE\n");
31f60 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31f70 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d  f(stderr, "    -
31f80 2d 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 20  -lost-and-found 
31f90 54 41 42 4c 45 2d 4e 41 4d 45 5c 6e 22 29 3b 0a  TABLE-NAME\n");.
31fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
31fb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65      }.  }..  she
31fc0 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 70 53 74  llExecPrintf(pSt
31fd0 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20  ate->db, &rc,.  
31fe0 20 20 2f 2a 20 41 74 74 61 63 68 20 61 6e 20 69    /* Attach an i
31ff0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
32000 65 20 6e 61 6d 65 64 20 27 72 65 63 6f 76 65 72  e named 'recover
32010 79 27 2e 20 43 72 65 61 74 65 20 61 6e 20 69 6e  y'. Create an in
32020 64 65 78 65 64 20 0a 20 20 20 20 2a 2a 20 63 61  dexed .    ** ca
32030 63 68 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  che of the sqlit
32040 65 5f 64 62 70 74 72 20 76 69 72 74 75 61 6c 20  e_dbptr virtual 
32050 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 22 41  table. */.    "A
32060 54 54 41 43 48 20 25 51 20 41 53 20 72 65 63 6f  TTACH %Q AS reco
32070 76 65 72 79 3b 22 0a 20 20 20 20 22 44 52 4f 50  very;".    "DROP
32080 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
32090 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 3b   recovery.dbptr;
320a0 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  ".    "DROP TABL
320b0 45 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f  E IF EXISTS reco
320c0 76 65 72 79 2e 66 72 65 65 6c 69 73 74 3b 22 0a  very.freelist;".
320d0 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20      "DROP TABLE 
320e0 49 46 20 45 58 49 53 54 53 20 72 65 63 6f 76 65  IF EXISTS recove
320f0 72 79 2e 6d 61 70 3b 22 0a 20 20 20 20 22 44 52  ry.map;".    "DR
32100 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
32110 54 53 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  TS recovery.sche
32120 6d 61 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45  ma;".    "CREATE
32130 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e   TABLE recovery.
32140 66 72 65 65 6c 69 73 74 28 70 67 6e 6f 20 49 4e  freelist(pgno IN
32150 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
32160 59 29 3b 22 2c 20 7a 52 65 63 6f 76 65 72 79 44  Y);", zRecoveryD
32170 62 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 62 46  b.  );..  if( bF
32180 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 73  reelist ){.    s
32190 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d  hellExec(pState-
321a0 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20 20 20  >db, &rc,.      
321b0 22 57 49 54 48 20 74 72 75 6e 6b 28 70 67 6e 6f  "WITH trunk(pgno
321c0 29 20 41 53 20 28 22 0a 20 20 20 20 20 20 22 20  ) AS (".      " 
321d0 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e   SELECT shell_in
321e0 74 33 32 28 22 0a 20 20 20 20 20 20 22 20 20 20  t32(".      "   
321f0 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61 20     (SELECT data 
32200 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61  FROM sqlite_dbpa
32210 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 29  ge WHERE pgno=1)
32220 2c 20 38 29 20 41 53 20 78 20 22 0a 20 20 20 20  , 8) AS x ".    
32230 20 20 22 20 20 20 20 20 20 57 48 45 52 45 20 78    "      WHERE x
32240 3e 30 22 0a 20 20 20 20 20 20 22 20 20 20 20 55  >0".      "    U
32250 4e 49 4f 4e 22 0a 20 20 20 20 20 20 22 20 20 53  NION".      "  S
32260 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e 74 33  ELECT shell_int3
32270 32 28 22 0a 20 20 20 20 20 20 22 20 20 20 20 20  2(".      "     
32280 20 28 53 45 4c 45 43 54 20 64 61 74 61 20 46 52   (SELECT data FR
32290 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67 65  OM sqlite_dbpage
322a0 20 57 48 45 52 45 20 70 67 6e 6f 3d 74 72 75 6e   WHERE pgno=trun
322b0 6b 2e 70 67 6e 6f 29 2c 20 30 29 20 41 53 20 78  k.pgno), 0) AS x
322c0 20 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20   ".      "      
322d0 46 52 4f 4d 20 74 72 75 6e 6b 20 57 48 45 52 45  FROM trunk WHERE
322e0 20 78 3e 30 22 0a 20 20 20 20 20 20 22 29 2c 22   x>0".      "),"
322f0 0a 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74  .      "freelist
32300 28 64 61 74 61 2c 20 6e 2c 20 66 72 65 65 70 67  (data, n, freepg
32310 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20 20  no) AS (".      
32320 22 20 20 53 45 4c 45 43 54 20 64 61 74 61 2c 20  "  SELECT data, 
32330 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61  shell_int32(data
32340 2c 20 31 29 2d 31 2c 20 74 2e 70 67 6e 6f 20 22  , 1)-1, t.pgno "
32350 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 46 52  .      "      FR
32360 4f 4d 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c 69  OM trunk t, sqli
32370 74 65 5f 64 62 70 61 67 65 20 73 20 57 48 45 52  te_dbpage s WHER
32380 45 20 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f 22  E s.pgno=t.pgno"
32390 0a 20 20 20 20 20 20 22 20 20 20 20 55 4e 49 4f  .      "    UNIO
323a0 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 22 20 20  N ALL".      "  
323b0 53 45 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d 31  SELECT data, n-1
323c0 2c 20 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61  , shell_int32(da
323d0 74 61 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20 20  ta, 2+n) ".     
323e0 20 22 20 20 20 20 20 20 46 52 4f 4d 20 66 72 65   "      FROM fre
323f0 65 6c 69 73 74 20 57 48 45 52 45 20 6e 3e 3d 30  elist WHERE n>=0
32400 22 0a 20 20 20 20 20 20 22 29 22 0a 20 20 20 20  ".      ")".    
32410 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
32420 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73  recovery.freelis
32430 74 20 53 45 4c 45 43 54 20 66 72 65 65 70 67 6e  t SELECT freepgn
32440 6f 20 46 52 4f 4d 20 66 72 65 65 6c 69 73 74 3b  o FROM freelist;
32450 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
32460 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65  shellExec(pState
32470 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20  ->db, &rc, .    
32480 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 65  "CREATE TABLE re
32490 63 6f 76 65 72 79 2e 64 62 70 74 72 28 22 0a 20  covery.dbptr(". 
324a0 20 20 20 22 20 20 20 20 20 20 70 67 6e 6f 2c 20     "      pgno, 
324b0 63 68 69 6c 64 2c 20 50 52 49 4d 41 52 59 20 4b  child, PRIMARY K
324c0 45 59 28 63 68 69 6c 64 2c 20 70 67 6e 6f 29 22  EY(child, pgno)"
324d0 0a 20 20 20 20 22 29 20 57 49 54 48 4f 55 54 20  .    ") WITHOUT 
324e0 52 4f 57 49 44 3b 22 0a 20 20 20 20 22 49 4e 53  ROWID;".    "INS
324f0 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
32500 54 4f 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74  TO recovery.dbpt
32510 72 28 70 67 6e 6f 2c 20 63 68 69 6c 64 29 20 22  r(pgno, child) "
32520 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
32530 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64   * FROM sqlite_d
32540 62 70 74 72 22 0a 20 20 20 20 22 20 20 20 20 20  bptr".    "     
32550 20 57 48 45 52 45 20 70 67 6e 6f 20 4e 4f 54 20   WHERE pgno NOT 
32560 49 4e 20 66 72 65 65 6c 69 73 74 20 41 4e 44 20  IN freelist AND 
32570 63 68 69 6c 64 20 4e 4f 54 20 49 4e 20 66 72 65  child NOT IN fre
32580 65 6c 69 73 74 3b 22 0a 0a 20 20 20 20 2f 2a 20  elist;"..    /* 
32590 44 65 6c 65 74 65 20 61 6e 79 20 70 6f 69 6e 74  Delete any point
325a0 65 72 20 74 6f 20 70 61 67 65 20 31 2e 20 54 68  er to page 1. Th
325b0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
325c0 70 61 67 65 20 31 20 69 73 20 63 6f 6e 73 69 64  page 1 is consid
325d0 65 72 65 64 0a 20 20 20 20 2a 2a 20 61 20 72 6f  ered.    ** a ro
325e0 6f 74 20 70 61 67 65 2c 20 72 65 67 61 72 64 6c  ot page, regardl
325f0 65 73 73 20 6f 66 20 68 6f 77 20 63 6f 72 72 75  ess of how corru
32600 70 74 20 74 68 65 20 64 62 20 69 73 2e 20 2a 2f  pt the db is. */
32610 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f  .    "DELETE FRO
32620 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  M recovery.dbptr
32630 20 57 48 45 52 45 20 63 68 69 6c 64 20 3d 20 31   WHERE child = 1
32640 3b 22 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74  ;"..    /* Delet
32650 65 20 61 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  e all pointers t
32660 6f 20 61 6e 79 20 70 61 67 65 73 20 74 68 61 74  o any pages that
32670 20 68 61 76 65 20 6d 6f 72 65 20 74 68 61 6e 20   have more than 
32680 6f 6e 65 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  one pointer.    
32690 2a 2a 20 74 6f 20 74 68 65 6d 2e 20 53 75 63 68  ** to them. Such
326a0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 74   pages will be t
326b0 72 65 61 74 65 64 20 61 73 20 72 6f 6f 74 20 70  reated as root p
326c0 61 67 65 73 20 77 68 65 6e 20 72 65 63 6f 76 65  ages when recove
326d0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 64 61 74 61  ring.    ** data
326e0 2e 20 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45 54  .  */.    "DELET
326f0 45 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e  E FROM recovery.
32700 64 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c  dbptr WHERE chil
32710 64 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53  d IN (".    "  S
32720 45 4c 45 43 54 20 63 68 69 6c 64 20 46 52 4f 4d  ELECT child FROM
32730 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20   recovery.dbptr 
32740 47 52 4f 55 50 20 42 59 20 63 68 69 6c 64 20 48  GROUP BY child H
32750 41 56 49 4e 47 20 63 6f 75 6e 74 28 2a 29 3e 31  AVING count(*)>1
32760 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20  ".    ");"..    
32770 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 6d  /* Create the "m
32780 61 70 22 20 74 61 62 6c 65 20 74 68 61 74 20 77  ap" table that w
32790 69 6c 6c 20 28 65 76 65 6e 74 75 61 6c 6c 79 29  ill (eventually)
327a0 20 63 6f 6e 74 61 69 6e 20 69 6e 73 74 72 75 63   contain instruc
327b0 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tions.    ** for
327c0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 65 61   dealing with ea
327d0 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
327e0 62 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  b that contains 
327f0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 0a 20 20 20  one or more .   
32800 20 2a 2a 20 72 65 63 6f 72 64 73 2e 20 2a 2f 0a   ** records. */.
32810 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
32820 45 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 28 22  E recovery.map("
32830 0a 20 20 20 20 20 20 22 70 67 6e 6f 20 49 4e 54  .      "pgno INT
32840 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
32850 2c 20 6d 61 78 6c 65 6e 20 49 4e 54 2c 20 69 6e  , maxlen INT, in
32860 74 6b 65 79 2c 20 72 6f 6f 74 20 49 4e 54 22 0a  tkey, root INT".
32870 20 20 20 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a      ");"..    /*
32880 20 50 6f 70 75 6c 61 74 65 20 74 61 62 6c 65 20   Populate table 
32890 5b 6d 61 70 5d 2e 20 49 66 20 74 68 65 72 65 20  [map]. If there 
328a0 61 72 65 20 63 69 72 63 75 6c 61 72 20 6c 6f 6f  are circular loo
328b0 70 73 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  ps of pages in t
328c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
328d0 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
328e0 67 20 61 64 64 73 20 61 6c 6c 20 70 61 67 65 73  g adds all pages
328f0 20 69 6e 20 73 75 63 68 20 61 20 6c 6f 6f 70 20   in such a loop 
32900 74 6f 20 74 68 65 20 6d 61 70 0a 20 20 20 20 2a  to the map.    *
32910 2a 20 61 73 20 69 6e 64 69 76 69 64 75 61 6c 20  * as individual 
32920 72 6f 6f 74 20 70 61 67 65 73 2e 20 54 68 69 73  root pages. This
32930 20 63 6f 75 6c 64 20 62 65 20 68 61 6e 64 6c 65   could be handle
32940 64 20 62 65 74 74 65 72 2e 20 20 2a 2f 0a 20 20  d better.  */.  
32950 20 20 22 57 49 54 48 20 70 61 67 65 73 28 69 2c    "WITH pages(i,
32960 20 6d 61 78 6c 65 6e 29 20 41 53 20 28 22 0a 20   maxlen) AS (". 
32970 20 20 20 22 20 20 53 45 4c 45 43 54 20 70 61 67     "  SELECT pag
32980 65 5f 63 6f 75 6e 74 2c 20 28 22 0a 20 20 20 20  e_count, (".    
32990 22 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  "    SELECT max(
329a0 66 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20 73 71  field+1) FROM sq
329b0 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48 45 52  lite_dbdata WHER
329c0 45 20 70 67 6e 6f 3d 70 61 67 65 5f 63 6f 75 6e  E pgno=page_coun
329d0 74 22 0a 20 20 20 20 22 20 20 29 20 46 52 4f 4d  t".    "  ) FROM
329e0 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 63 6f 75   pragma_page_cou
329f0 6e 74 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49  nt".    "    UNI
32a00 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 22 20 20 53  ON ALL".    "  S
32a10 45 4c 45 43 54 20 69 2d 31 2c 20 28 22 0a 20 20  ELECT i-1, (".  
32a20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6d 61    "    SELECT ma
32a30 78 28 66 69 65 6c 64 2b 31 29 20 46 52 4f 4d 20  x(field+1) FROM 
32a40 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20 57 48  sqlite_dbdata WH
32a50 45 52 45 20 70 67 6e 6f 3d 69 2d 31 22 0a 20 20  ERE pgno=i-1".  
32a60 20 20 22 20 20 29 20 46 52 4f 4d 20 70 61 67 65    "  ) FROM page
32a70 73 20 57 48 45 52 45 20 69 3e 3d 32 22 0a 20 20  s WHERE i>=2".  
32a80 20 20 22 29 22 0a 20 20 20 20 22 49 4e 53 45 52    ")".    "INSER
32a90 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e  T INTO recovery.
32aa0 6d 61 70 28 70 67 6e 6f 2c 20 6d 61 78 6c 65 6e  map(pgno, maxlen
32ab0 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f 74 29 20  , intkey, root) 
32ac0 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
32ad0 69 2c 20 6d 61 78 6c 65 6e 2c 20 4e 55 4c 4c 2c  i, maxlen, NULL,
32ae0 20 28 22 0a 20 20 20 20 22 20 20 20 20 57 49 54   (".    "    WIT
32af0 48 20 70 28 6f 72 69 67 2c 20 70 67 6e 6f 2c 20  H p(orig, pgno, 
32b00 70 61 72 65 6e 74 29 20 41 53 20 28 22 0a 20 20  parent) AS (".  
32b10 20 20 22 20 20 20 20 20 20 53 45 4c 45 43 54 20    "      SELECT 
32b20 30 2c 20 69 2c 20 28 53 45 4c 45 43 54 20 70 67  0, i, (SELECT pg
32b30 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  no FROM recovery
32b40 2e 64 62 70 74 72 20 57 48 45 52 45 20 63 68 69  .dbptr WHERE chi
32b50 6c 64 3d 69 29 22 0a 20 20 20 20 22 20 20 20 20  ld=i)".    "    
32b60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20      UNION ALL". 
32b70 20 20 20 22 20 20 20 20 20 20 53 45 4c 45 43 54     "      SELECT
32b80 20 69 2c 20 70 2e 70 61 72 65 6e 74 2c 20 22 0a   i, p.parent, ".
32b90 20 20 20 20 22 20 20 20 20 20 20 20 20 28 53 45      "        (SE
32ba0 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
32bb0 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48  ecovery.dbptr WH
32bc0 45 52 45 20 63 68 69 6c 64 3d 70 2e 70 61 72 65  ERE child=p.pare
32bd0 6e 74 29 20 46 52 4f 4d 20 70 22 0a 20 20 20 20  nt) FROM p".    
32be0 22 20 20 20 20 29 22 0a 20 20 20 20 22 20 20 20  "    )".    "   
32bf0 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f   SELECT pgno FRO
32c00 4d 20 70 20 57 48 45 52 45 20 28 70 61 72 65 6e  M p WHERE (paren
32c10 74 20 49 53 20 4e 55 4c 4c 20 4f 52 20 70 67 6e  t IS NULL OR pgn
32c20 6f 20 3d 20 6f 72 69 67 29 22 0a 20 20 20 20 22  o = orig)".    "
32c30 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 70 61  ) ".    "FROM pa
32c40 67 65 73 20 57 48 45 52 45 20 6d 61 78 6c 65 6e  ges WHERE maxlen
32c50 20 3e 20 30 20 41 4e 44 20 69 20 4e 4f 54 20 49   > 0 AND i NOT I
32c60 4e 20 66 72 65 65 6c 69 73 74 3b 22 0a 20 20 20  N freelist;".   
32c70 20 22 55 50 44 41 54 45 20 72 65 63 6f 76 65 72   "UPDATE recover
32c80 79 2e 6d 61 70 20 41 53 20 6f 20 53 45 54 20 69  y.map AS o SET i
32c90 6e 74 6b 65 79 20 3d 20 28 22 0a 20 20 20 20 22  ntkey = (".    "
32ca0 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72 28    SELECT substr(
32cb0 64 61 74 61 2c 20 31 2c 20 31 29 3d 3d 58 27 30  data, 1, 1)==X'0
32cc0 44 27 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  D' FROM sqlite_d
32cd0 62 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f  bpage WHERE pgno
32ce0 3d 6f 2e 70 67 6e 6f 22 0a 20 20 20 20 22 29 3b  =o.pgno".    ");
32cf0 22 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  "..    /* Extrac
32d00 74 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  t data from page
32d10 20 31 20 61 6e 64 20 61 6e 79 20 6c 69 6e 6b 65   1 and any linke
32d20 64 20 70 61 67 65 73 20 69 6e 74 6f 20 74 61 62  d pages into tab
32d30 6c 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 76 65  le.    ** recove
32d40 72 79 2e 73 63 68 65 6d 61 2e 20 57 69 74 68 20  ry.schema. With 
32d50 74 68 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20  the same schema 
32d60 61 73 20 61 6e 20 73 71 6c 69 74 65 5f 6d 61 73  as an sqlite_mas
32d70 74 65 72 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ter table.  */. 
32d80 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
32d90 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61   recovery.schema
32da0 28 74 79 70 65 2c 20 6e 61 6d 65 2c 20 74 62 6c  (type, name, tbl
32db0 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c  _name, rootpage,
32dc0 20 73 71 6c 29 3b 22 0a 20 20 20 20 22 49 4e 53   sql);".    "INS
32dd0 45 52 54 20 49 4e 54 4f 20 72 65 63 6f 76 65 72  ERT INTO recover
32de0 79 2e 73 63 68 65 6d 61 20 53 45 4c 45 43 54 20  y.schema SELECT 
32df0 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53  ".    "  max(CAS
32e00 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 30 20 54  E WHEN field=0 T
32e10 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e  HEN value ELSE N
32e20 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22  ULL END),".    "
32e30 20 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20    max(CASE WHEN 
32e40 66 69 65 6c 64 3d 31 20 54 48 45 4e 20 76 61 6c  field=1 THEN val
32e50 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44  ue ELSE NULL END
32e60 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78 28 43  ),".    "  max(C
32e70 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64 3d 32  ASE WHEN field=2
32e80 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c 53 45   THEN value ELSE
32e90 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20   NULL END),".   
32ea0 20 22 20 20 6d 61 78 28 43 41 53 45 20 57 48 45   "  max(CASE WHE
32eb0 4e 20 66 69 65 6c 64 3d 33 20 54 48 45 4e 20 76  N field=3 THEN v
32ec0 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45  alue ELSE NULL E
32ed0 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d 61 78  ND),".    "  max
32ee0 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64  (CASE WHEN field
32ef0 3d 34 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c  =4 THEN value EL
32f00 53 45 20 4e 55 4c 4c 20 45 4e 44 29 22 0a 20 20  SE NULL END)".  
32f10 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64    "FROM sqlite_d
32f20 62 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f  bdata WHERE pgno
32f30 20 49 4e 20 28 22 0a 20 20 20 20 22 20 20 53 45   IN (".    "  SE
32f40 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
32f50 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45 52  ecovery.map WHER
32f60 45 20 72 6f 6f 74 3d 31 22 0a 20 20 20 20 22 29  E root=1".    ")
32f70 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20  ".    "GROUP BY 
32f80 70 67 6e 6f 2c 20 63 65 6c 6c 3b 22 0a 20 20 20  pgno, cell;".   
32f90 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 72   "CREATE INDEX r
32fa0 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 5f 72  ecovery.schema_r
32fb0 6f 6f 74 70 61 67 65 20 4f 4e 20 73 63 68 65 6d  ootpage ON schem
32fc0 61 28 72 6f 6f 74 70 61 67 65 29 3b 22 0a 20 20  a(rootpage);".  
32fd0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
32fe0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
32ff0 6e 20 70 72 69 6e 74 20 6f 75 74 20 61 6c 6c 20  n print out all 
33000 6e 6f 6e 2d 76 69 72 74 75 61 6c 2c 20 6e 6f 6e  non-virtual, non
33010 2d 22 73 71 6c 69 74 65 5f 25 22 20 0a 20 20 2a  -"sqlite_%" .  *
33020 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  * CREATE TABLE s
33030 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 65  tatements that e
33040 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
33050 65 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  e existing schem
33060 61 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  a.  */.  if( rc=
33070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33080 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
33090 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72  pStmt = 0;.    r
330a0 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
330b0 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 3b 5c 6e  ->out, "BEGIN;\n
330c0 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
330d0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
330e0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
330f0 5f 73 63 68 65 6d 61 20 3d 20 6f 6e 3b 5c 6e 22  _schema = on;\n"
33100 29 3b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70  );.    shellPrep
33110 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
33120 26 72 63 2c 0a 20 20 20 20 20 20 20 20 22 53 45  &rc,.        "SE
33130 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 72 65  LECT sql FROM re
33140 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 22 0a  covery.schema ".
33150 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
33160 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  ype='table' AND 
33170 73 71 6c 20 4c 49 4b 45 20 27 63 72 65 61 74 65  sql LIKE 'create
33180 20 74 61 62 6c 65 25 27 22 2c 20 26 70 53 74 6d   table%'", &pStm
33190 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69  t.    );.    whi
331a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
331b0 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
331c0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
331d0 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  tmt) ){.      co
331e0 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
331f0 65 54 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20  eTable = (const 
33200 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
33210 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
33220 20 30 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70   0);.      raw_p
33230 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
33240 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
33250 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25   IF NOT EXISTS %
33260 73 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s;\n", .        
33270 20 20 26 7a 43 72 65 61 74 65 54 61 62 6c 65 5b    &zCreateTable[
33280 31 32 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  12].      );.   
33290 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
332a0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
332b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
332c0 72 65 20 6f 75 74 20 69 66 20 61 6e 20 6f 72 70  re out if an orp
332d0 68 61 6e 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  han table will b
332e0 65 20 72 65 71 75 69 72 65 64 2e 20 41 6e 64 20  e required. And 
332f0 69 66 20 73 6f 2c 20 68 6f 77 20 6d 61 6e 79 0a  if so, how many.
33300 20 20 2a 2a 20 75 73 65 72 20 63 6f 6c 75 6d 6e    ** user column
33310 73 20 69 74 20 73 68 6f 75 6c 64 20 63 6f 6e 74  s it should cont
33320 61 69 6e 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72  ain */.  shellPr
33330 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62  epare(pState->db
33340 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22 53  , &rc, .      "S
33350 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d  ELECT coalesce(m
33360 61 78 28 6d 61 78 6c 65 6e 29 2c 20 2d 32 29 20  ax(maxlen), -2) 
33370 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61  FROM recovery.ma
33380 70 22 20 0a 20 20 20 20 20 20 22 20 20 57 48 45  p" .      "  WHE
33390 52 45 20 72 6f 6f 74 3e 31 20 41 4e 44 20 72 6f  RE root>1 AND ro
333a0 6f 74 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43  ot NOT IN (SELEC
333b0 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20  T rootpage FROM 
333c0 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 29  recovery.schema)
333d0 22 0a 20 20 20 20 20 20 2c 20 26 70 4c 6f 6f 70  ".      , &pLoop
333e0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
333f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
33400 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
33410 5f 73 74 65 70 28 70 4c 6f 6f 70 29 20 29 7b 0a  _step(pLoop) ){.
33420 20 20 20 20 6e 4f 72 70 68 61 6e 20 3d 20 73 71      nOrphan = sq
33430 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
33440 28 70 4c 6f 6f 70 2c 20 30 29 3b 0a 20 20 7d 0a  (pLoop, 0);.  }.
33450 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
33460 26 72 63 2c 20 70 4c 6f 6f 70 29 3b 0a 20 20 70  &rc, pLoop);.  p
33470 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 70 4f 72 70  Loop = 0;.  pOrp
33480 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72 70  han = recoverOrp
33490 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65 2c  hanTable(pState,
334a0 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f   &rc, zLostAndFo
334b0 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a 0a  und, nOrphan);..
334c0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
334d0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
334e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67        "SELECT pg
334f0 6e 6f 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79  no FROM recovery
33500 2e 6d 61 70 20 57 48 45 52 45 20 72 6f 6f 74 3d  .map WHERE root=
33510 3f 22 2c 20 26 70 50 61 67 65 73 0a 20 20 29 3b  ?", &pPages.  );
33520 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  .  shellPrepare(
33530 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c  pState->db, &rc,
33540 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d  .      "SELECT m
33550 61 78 28 66 69 65 6c 64 29 2c 20 67 72 6f 75 70  ax(field), group
33560 5f 63 6f 6e 63 61 74 28 73 68 65 6c 6c 5f 65 73  _concat(shell_es
33570 63 61 70 65 5f 63 72 6e 6c 28 71 75 6f 74 65 28  cape_crnl(quote(
33580 76 61 6c 75 65 29 29 2c 20 27 2c 20 27 29 22 0a  value)), ', ')".
33590 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
335a0 74 65 5f 64 62 64 61 74 61 20 57 48 45 52 45 20  te_dbdata WHERE 
335b0 70 67 6e 6f 20 3d 20 3f 20 41 4e 44 20 66 69 65  pgno = ? AND fie
335c0 6c 64 20 21 3d 20 3f 22 0a 20 20 20 20 20 20 22  ld != ?".      "
335d0 47 52 4f 55 50 20 42 59 20 63 65 6c 6c 22 2c 20  GROUP BY cell", 
335e0 26 70 43 65 6c 6c 73 0a 20 20 29 3b 0a 0a 20 20  &pCells.  );..  
335f0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
33600 65 61 63 68 20 72 6f 6f 74 20 70 61 67 65 2e 20  each root page. 
33610 2a 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  */.  shellPrepar
33620 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  e(pState->db, &r
33630 63 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  c, .      "SELEC
33640 54 20 72 6f 6f 74 2c 20 69 6e 74 6b 65 79 2c 20  T root, intkey, 
33650 6d 61 78 28 6d 61 78 6c 65 6e 29 20 46 52 4f 4d  max(maxlen) FROM
33660 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 22 20 0a   recovery.map" .
33670 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 6f        " WHERE ro
33680 6f 74 3e 31 20 47 52 4f 55 50 20 42 59 20 72 6f  ot>1 GROUP BY ro
33690 6f 74 2c 20 69 6e 74 6b 65 79 20 4f 52 44 45 52  ot, intkey ORDER
336a0 20 42 59 20 72 6f 6f 74 3d 28 22 0a 20 20 20 20   BY root=(".    
336b0 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 6f 74    "  SELECT root
336c0 70 61 67 65 20 46 52 4f 4d 20 72 65 63 6f 76 65  page FROM recove
336d0 72 79 2e 73 63 68 65 6d 61 20 57 48 45 52 45 20  ry.schema WHERE 
336e0 6e 61 6d 65 3d 27 73 71 6c 69 74 65 5f 73 65 71  name='sqlite_seq
336f0 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 22 29  uence'".      ")
33700 22 2c 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20  ", &pLoop.  );. 
33710 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
33720 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
33730 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
33740 70 28 70 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20  p(pLoop) ){.    
33750 69 6e 74 20 69 52 6f 6f 74 20 3d 20 73 71 6c 69  int iRoot = sqli
33760 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
33770 4c 6f 6f 70 2c 20 30 29 3b 0a 20 20 20 20 69 6e  Loop, 0);.    in
33780 74 20 62 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69  t bIntkey = sqli
33790 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
337a0 4c 6f 6f 70 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Loop, 1);.    in
337b0 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t nCol = sqlite3
337c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f  _column_int(pLoo
337d0 70 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62  p, 2);.    int b
337e0 4e 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 52 65  Noop = 0;.    Re
337f0 63 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62  coverTable *pTab
33800 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 72 65  ;..    pTab = re
33810 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65 28 70  coverFindTable(p
33820 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52 6f 6f  State, &rc, iRoo
33830 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c  t, bIntkey, nCol
33840 2c 20 26 62 4e 6f 6f 70 29 3b 0a 20 20 20 20 69  , &bNoop);.    i
33850 66 28 20 62 4e 6f 6f 70 20 7c 7c 20 72 63 20 29  f( bNoop || rc )
33860 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
33870 66 28 20 70 54 61 62 3d 3d 30 20 29 20 70 54 61  f( pTab==0 ) pTa
33880 62 20 3d 20 70 4f 72 70 68 61 6e 3b 0a 0a 20 20  b = pOrphan;..  
33890 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
338a0 5f 73 74 72 69 63 6d 70 28 70 54 61 62 2d 3e 7a  _stricmp(pTab->z
338b0 51 75 6f 74 65 64 2c 20 22 27 73 71 6c 69 74 65  Quoted, "'sqlite
338c0 5f 73 65 71 75 65 6e 63 65 27 22 29 20 29 7b 0a  _sequence'") ){.
338d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
338e0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 44  (pState->out, "D
338f0 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74  ELETE FROM sqlit
33900 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b  e_sequence;\n");
33910 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33920 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 50 61 67  e3_bind_int(pPag
33930 65 73 2c 20 31 2c 20 69 52 6f 6f 74 29 3b 0a 20  es, 1, iRoot);. 
33940 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
33950 69 6e 74 28 70 43 65 6c 6c 73 2c 20 32 2c 20 70  int(pCells, 2, p
33960 54 61 62 2d 3e 69 50 6b 29 3b 0a 0a 20 20 20 20  Tab->iPk);..    
33970 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
33980 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
33990 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
339a0 28 70 50 61 67 65 73 29 20 29 7b 0a 20 20 20 20  (pPages) ){.    
339b0 20 20 69 6e 74 20 69 50 67 6e 6f 20 3d 20 73 71    int iPgno = sq
339c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
339d0 28 70 50 61 67 65 73 2c 20 30 29 3b 0a 20 20 20  (pPages, 0);.   
339e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
339f0 69 6e 74 28 70 43 65 6c 6c 73 2c 20 31 2c 20 69  int(pCells, 1, i
33a00 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 77 68 69  Pgno);.      whi
33a10 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
33a20 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
33a30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
33a40 65 6c 6c 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ells) ){.       
33a50 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 73 71   int nField = sq
33a60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
33a70 28 70 43 65 6c 6c 73 2c 20 30 29 3b 0a 20 20 20  (pCells, 0);.   
33a80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
33a90 2a 7a 56 61 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zVal = (const c
33aa0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
33ab0 75 6d 6e 5f 74 65 78 74 28 70 43 65 6c 6c 73 2c  umn_text(pCells,
33ac0 20 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 6e 46   1);..        nF
33ad0 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 2b 31 3b  ield = nField+1;
33ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
33af0 62 3d 3d 70 4f 72 70 68 61 6e 20 29 7b 0a 20 20  b==pOrphan ){.  
33b00 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
33b10 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
33b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
33b30 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20 56  INSERT INTO %s V
33b40 41 4c 55 45 53 28 25 64 2c 20 25 64 2c 20 25 64  ALUES(%d, %d, %d
33b50 2c 20 25 73 25 73 25 73 29 3b 5c 6e 22 2c 0a 20  , %s%s%s);\n",. 
33b60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
33b70 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 69 52 6f 6f  b->zQuoted, iRoo
33b80 74 2c 20 69 50 67 6e 6f 2c 20 6e 46 69 65 6c 64  t, iPgno, nField
33b90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
33ba0 20 62 49 6e 74 6b 65 79 20 3f 20 22 22 20 3a 20   bIntkey ? "" : 
33bb0 22 4e 55 4c 4c 2c 20 22 2c 20 7a 56 61 6c 2c 20  "NULL, ", zVal, 
33bc0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69  pTab->azlCol[nFi
33bd0 65 6c 64 5d 0a 20 20 20 20 20 20 20 20 20 20 29  eld].          )
33be0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33bf0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
33c00 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
33c10 74 2c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  t, "INSERT INTO 
33c20 25 73 28 25 73 29 20 56 41 4c 55 45 53 28 20 25  %s(%s) VALUES( %
33c30 73 20 29 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20  s );\n", .      
33c40 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 51          pTab->zQ
33c50 75 6f 74 65 64 2c 20 70 54 61 62 2d 3e 61 7a 6c  uoted, pTab->azl
33c60 43 6f 6c 5b 6e 46 69 65 6c 64 5d 2c 20 7a 56 61  Col[nField], zVa
33c70 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  l.          );. 
33c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33c90 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
33ca0 74 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a  t(&rc, pCells);.
33cb0 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 52      }.    shellR
33cc0 65 73 65 74 28 26 72 63 2c 20 70 50 61 67 65 73  eset(&rc, pPages
33cd0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 21  );.    if( pTab!
33ce0 3d 70 4f 72 70 68 61 6e 20 29 20 72 65 63 6f 76  =pOrphan ) recov
33cf0 65 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62  erFreeTable(pTab
33d00 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69  );.  }.  shellFi
33d10 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f  nalize(&rc, pLoo
33d20 70 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c  p);.  shellFinal
33d30 69 7a 65 28 26 72 63 2c 20 70 50 61 67 65 73 29  ize(&rc, pPages)
33d40 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  ;.  shellFinaliz
33d50 65 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a  e(&rc, pCells);.
33d60 20 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62    recoverFreeTab
33d70 6c 65 28 70 4f 72 70 68 61 6e 29 3b 0a 0a 20 20  le(pOrphan);..  
33d80 2f 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  /* The rest of t
33d90 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69  he schema */.  i
33da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33db0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
33dc0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
33dd0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
33de0 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  e(pState->db, &r
33df0 63 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  c, .        "SEL
33e00 45 43 54 20 73 71 6c 2c 20 6e 61 6d 65 20 46 52  ECT sql, name FR
33e10 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  OM recovery.sche
33e20 6d 61 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  ma ".        "WH
33e30 45 52 45 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45  ERE sql NOT LIKE
33e40 20 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27   'create table%'
33e50 22 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b  ", &pStmt.    );
33e60 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
33e70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
33e80 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
33e90 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
33ea0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
33eb0 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
33ec0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
33ed0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
33ee0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73   0);.      if( s
33ef0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
33f00 7a 53 71 6c 2c 20 22 63 72 65 61 74 65 20 76 69  zSql, "create vi
33f10 72 74 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20  rt", 11)==0 ){. 
33f20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
33f30 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
33f40 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
33f50 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
33f60 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 1);.        c
33f70 68 61 72 20 2a 7a 50 72 69 6e 74 20 3d 20 73 68  har *zPrint = sh
33f80 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20  ellMPrintf(&rc, 
33f90 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
33fa0 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
33fb0 61 73 74 65 72 20 56 41 4c 55 45 53 28 27 74 61  aster VALUES('ta
33fc0 62 6c 65 27 2c 20 25 51 2c 20 25 51 2c 20 30 2c  ble', %Q, %Q, 0,
33fd0 20 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20   %Q)",.         
33fe0 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a   zName, zName, z
33ff0 53 71 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Sql.        );. 
34000 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
34010 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22  f(pState->out, "
34020 25 73 3b 5c 6e 22 2c 20 7a 50 72 69 6e 74 29 3b  %s;\n", zPrint);
34030 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34040 5f 66 72 65 65 28 7a 50 72 69 6e 74 29 3b 0a 20  _free(zPrint);. 
34050 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34060 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
34070 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b  State->out, "%s;
34080 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
34090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
340a0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
340b0 20 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20   pStmt);.  }..  
340c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
340d0 4b 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  K ){.    raw_pri
340e0 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
340f0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
34100 65 5f 73 63 68 65 6d 61 20 3d 20 6f 66 66 3b 5c  e_schema = off;\
34110 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  n");.    raw_pri
34120 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
34130 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20   "COMMIT;\n");. 
34140 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65   }.  sqlite3_exe
34150 63 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 44  c(pState->db, "D
34160 45 54 41 43 48 20 72 65 63 6f 76 65 72 79 22 2c  ETACH recovery",
34170 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74   0, 0, 0);.  ret
34180 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
34190 20 2f 2a 20 21 28 53 51 4c 49 54 45 5f 4f 4d 49   /* !(SQLITE_OMI
341a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
341b0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
341c0 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
341d0 56 54 41 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  VTAB) */.../*.**
341e0 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e   If an input lin
341f0 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e  e begins with ".
34200 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  " then invoke th
34210 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a  is routine to.**
34220 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69   process that li
34230 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ne..**.** Return
34240 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74   1 on error, 2 t
34250 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74  o exit, and 0 ot
34260 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
34270 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63  ic int do_meta_c
34280 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69  ommand(char *zLi
34290 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ne, ShellState *
342a0 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b  p){.  int h = 1;
342b0 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
342c0 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69  .  int n, c;.  i
342d0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61  nt rc = 0;.  cha
342e0 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23  r *azArg[50];..#
342f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34300 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
34310 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e    if( p->expert.
34320 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65  pExpert ){.    e
34330 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31  xpertFinish(p, 1
34340 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
34350 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
34360 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f   input line into
34370 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
34380 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
34390 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a  && nArg<ArraySiz
343a0 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  e(azArg) ){.    
343b0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
343c0 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
343d0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
343e0 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [h]==0 ) break;.
343f0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
34400 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
34410 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  h]=='"' ){.     
34420 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
34430 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[h++];.      a
34440 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
34450 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
34460 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
34470 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c  && zLine[h]!=del
34480 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  im ){.        if
34490 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27  ( zLine[h]=='\\'
344a0 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
344b0 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20  & zLine[h+1]!=0 
344c0 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68  ) h++;.        h
344d0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
344e0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
344f0 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
34500 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
34510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34520 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
34530 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
34540 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
34550 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
34560 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
34570 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
34580 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
34590 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63  ne[h] && !IsSpac
345a0 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
345b0 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
345c0 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65  zLine[h] ) zLine
345d0 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
345e0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
345f0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
34600 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
34610 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
34620 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
34630 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
34640 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
34650 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
34660 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
34670 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
34680 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
34690 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ];.  clearTempFi
346a0 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  le(p);..#ifndef 
346b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
346c0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
346d0 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  c=='a' && strncm
346e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74  p(azArg[0], "aut
346f0 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
34700 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
34710 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34720 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
34730 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22   .auth ON|OFF\n"
34740 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
34750 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
34760 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34770 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
34780 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
34790 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
347a0 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
347b0 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
347c0 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68  orizer(p->db, sh
347d0 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20  ellAuth, p);.   
347e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
347f0 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
34800 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30  izer(p->db, 0, 0
34810 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
34820 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
34830 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34840 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
34850 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
34860 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69  E_HAVE_ZLIB).  i
34870 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
34880 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
34890 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20  archive", n)==0 
348a0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
348b0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  , 0);.    rc = a
348c0 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30  rDotCommand(p, 0
348d0 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
348e0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
348f0 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26    if( (c=='b' &&
34900 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
34910 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b  (azArg[0], "back
34920 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c  up", n)==0).   |
34930 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  | (c=='s' && n>=
34940 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
34950 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e  rg[0], "save", n
34960 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
34970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74  onst char *zDest
34980 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  File = 0;.    co
34990 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
349a0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  0;.    sqlite3 *
349b0 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pDest;.    sqlit
349c0 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
349d0 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  up;.    int j;. 
349e0 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20 3d 20     int bAsync = 
349f0 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
34a00 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20  r *zVfs = 0;.   
34a10 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67   for(j=1; j<nArg
34a20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; j++){.      co
34a30 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
34a40 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[j];.      if
34a50 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
34a60 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d         if( z[1]=
34a70 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
34a80 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
34a90 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20  , "-append")==0 
34aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66  ){.          zVf
34ab0 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20  s = "apndvfs";. 
34ac0 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
34ad0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
34ae0 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30 20  z, "-async")==0 
34af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41 73  ){.          bAs
34b00 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
34b10 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
34b20 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
34b30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34b40 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
34b50 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
34b60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
34b70 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
34b80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34b90 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
34ba0 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
34bb0 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
34bc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
34bd0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
34be0 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
34bf0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
34c00 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
34c10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34c20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
34c30 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
34c40 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50 54  backup ?DB? ?OPT
34c50 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e  IONS? FILENAME\n
34c60 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
34c70 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
34c80 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73    }.    if( zDes
34c90 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
34ca0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
34cb0 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49  err, "missing FI
34cc0 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20  LENAME argument 
34cd0 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a  on .backup\n");.
34ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
34cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
34d00 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61  b==0 ) zDb = "ma
34d10 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  in";.    rc = sq
34d20 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44  lite3_open_v2(zD
34d30 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c  estFile, &pDest,
34d40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
34d50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
34d60 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
34d70 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56  _OPEN_CREATE, zV
34d80 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fs);.    if( rc!
34d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34da0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34db0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
34dc0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
34dd0 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65  \"\n", zDestFile
34de0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64  );.      close_d
34df0 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  b(pDest);.      
34e00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
34e10 20 20 20 20 69 66 28 20 62 41 73 79 6e 63 20 29      if( bAsync )
34e20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34e30 65 78 65 63 28 70 44 65 73 74 2c 20 22 50 52 41  exec(pDest, "PRA
34e40 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
34e50 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75 72  OFF; PRAGMA jour
34e60 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c 0a  nal_mode=OFF;",.
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e80 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20     0, 0, 0);.   
34e90 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
34ea0 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
34eb0 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
34ec0 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22  up_init(pDest, "
34ed0 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44  main", p->db, zD
34ee0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  b);.    if( pBac
34ef0 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
34f00 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34f10 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
34f20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
34f30 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
34f40 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29   close_db(pDest)
34f50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
34f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
34f70 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
34f80 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
34f90 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
34fa0 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
34fb0 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
34fc0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
34fd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34fe0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
34ff0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
35000 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
35010 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
35020 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
35030 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
35040 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
35050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  ;.    }.    clos
35060 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d  e_db(pDest);.  }
35070 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
35080 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
35090 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
350a0 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b  "bail", n)==0 ){
350b0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
350c0 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f   ){.      bail_o
350d0 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61  n_error = boolea
350e0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
350f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35100 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35110 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
35120 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ail on|off\n");.
35130 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35140 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
35150 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
35160 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
35170 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c  rg[0], "binary",
35180 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
35190 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
351a0 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61     if( booleanVa
351b0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b  lue(azArg[1]) ){
351c0 0a 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61  .        setBina
351d0 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31  ryMode(p->out, 1
351e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
351f0 20 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d          setTextM
35200 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
35210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
35220 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
35230 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
35240 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  ge: .binary on|o
35250 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
35260 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
35270 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
35280 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  ' && strcmp(azAr
35290 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b  g[0],"cd")==0 ){
352a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
352b0 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
352c0 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
352d0 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20  ed(WIN32).      
352e0 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
352f0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
35300 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67  to_unicode(azArg
35310 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
35320 20 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65   !SetCurrentDire
35330 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20  ctoryW(z);.     
35340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
35350 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
35360 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31   = chdir(azArg[1
35370 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ]);.#endif.     
35380 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35390 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
353a0 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63  tderr, "Cannot c
353b0 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
353c0 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  ry \"%s\"\n", az
353d0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
353e0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
353f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35400 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35410 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64  err, "Usage: .cd
35420 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a   DIRECTORY\n");.
35430 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35440 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
35450 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74  * The undocument
35460 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22  ed ".breakpoint"
35470 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
35480 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f  a call to the no
35490 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  -op.  ** routine
354a0 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61   named test_brea
354b0 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20  kpoint()..  */. 
354c0 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
354d0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
354e0 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70  zArg[0], "breakp
354f0 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  oint", n)==0 ){.
35500 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f      test_breakpo
35510 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  int();.  }else..
35520 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
35530 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
35540 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67  azArg[0], "chang
35550 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
35560 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
35570 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61  .      setOrClea
35580 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43  rFlag(p, SHFLG_C
35590 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41  ountChanges, azA
355a0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
355b0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
355c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
355d0 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  ge: .changes on|
355e0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
355f0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
35600 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65  else..  /* Cance
35610 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63  l output redirec
35620 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63  tion, if it is c
35630 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79  urrently set (by
35640 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a   .testcase).  **
35650 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63   Then read the c
35660 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65  ontent of the te
35670 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66  stcase-out.txt f
35680 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20  ile and compare 
35690 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41  against.  ** azA
356a0 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65  rg[1].  If there
356b0 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
356c0 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  , report an erro
356d0 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f  r and exit..  */
356e0 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
356f0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
35700 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63  (azArg[0], "chec
35710 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  k", n)==0 ){.   
35720 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b   char *zRes = 0;
35730 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
35740 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  t(p);.    if( nA
35750 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
35760 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
35770 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b  , "Usage: .check
35780 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22   GLOB-PATTERN\n"
35790 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b  );.      rc = 2;
357a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
357b0 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28  zRes = readFile(
357c0 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  "testcase-out.tx
357d0 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20  t", 0))==0 ){.  
357e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
357f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
35800 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74  annot read 'test
35810 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22  case-out.txt'\n"
35820 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b  );.      rc = 2;
35830 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74  .    }else if( t
35840 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41  estcase_glob(azA
35850 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29  rg[1],zRes)==0 )
35860 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
35870 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
35880 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65               "te
35890 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44  stcase-%s FAILED
358a0 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73  \n Expected: [%s
358b0 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  ]\n      Got: [%
358c0 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
358d0 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74          p->zTest
358e0 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  case, azArg[1], 
358f0 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20  zRes);.      rc 
35900 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
35910 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35920 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63  f(stdout, "testc
35930 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d  ase-%s ok\n", p-
35940 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20  >zTestcase);.   
35950 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a     p->nCheck++;.
35960 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
35970 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20  3_free(zRes);.  
35980 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
35990 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
359a0 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22  zArg[0], "clone"
359b0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
359c0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
359d0 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70      tryToClone(p
359e0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
359f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
35a00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35a10 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20   "Usage: .clone 
35a20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
35a30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35a40 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
35a50 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26   c=='d' && n>1 &
35a60 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
35a70 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c  0], "databases",
35a80 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
35a90 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
35aa0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
35ab0 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
35ac0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d  b(p, 0);.    mem
35ad0 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
35ae0 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
35af0 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
35b00 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
35b10 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
35b20 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
35b30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
35b40 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63  tf(sizeof(data.c
35b50 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74  olSeparator),dat
35b60 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22  a.colSeparator,"
35b70 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63  : ");.    data.c
35b80 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nt = 0;.    sqli
35b90 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
35ba0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69  "SELECT name, fi
35bb0 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  le FROM pragma_d
35bc0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35be0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
35bf0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
35c00 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
35c10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
35c20 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
35c30 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
35c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
35c50 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
35c60 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35c70 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
35c80 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20   c=='d' && n>=3 
35c90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
35ca0 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c  [0], "dbconfig",
35cb0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
35cc0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
35cd0 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65  t DbConfigChoice
35ce0 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  s {.      const 
35cf0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
35d00 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 7d     int op;.    }
35d10 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b   aDbConfig[] = {
35d20 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
35d30 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20 53  le_fkey",      S
35d40 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35d50 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20 20  NABLE_FKEY      
35d60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35d70 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67 67   { "enable_trigg
35d80 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  er",   SQLITE_DB
35d90 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
35da0 49 47 47 45 52 20 20 20 20 20 20 20 20 20 7d 2c  IGGER         },
35db0 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73 33  .        { "fts3
35dc0 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20 53  _tokenizer",   S
35dd0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35de0 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
35df0 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20 20 20  IZER  },.       
35e00 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69   { "load_extensi
35e10 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  on",   SQLITE_DB
35e20 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f  CONFIG_ENABLE_LO
35e30 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20 7d 2c  AD_EXTENSION  },
35e40 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63  .        { "no_c
35e50 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 53  kpt_on_close", S
35e60 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
35e70 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20  O_CKPT_ON_CLOSE 
35e80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35e90 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22   { "enable_qpsg"
35ea0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
35eb0 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50  CONFIG_ENABLE_QP
35ec0 53 47 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  SG            },
35ed0 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69 67  .        { "trig
35ee0 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20 53  ger_eqp",      S
35ef0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
35f00 52 49 47 47 45 52 5f 45 51 50 20 20 20 20 20 20  RIGGER_EQP      
35f10 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
35f20 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61 62 61   { "reset_databa
35f30 73 65 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  se",   SQLITE_DB
35f40 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
35f50 41 42 41 53 45 20 20 20 20 20 20 20 20 20 7d 2c  ABASE         },
35f60 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65 66 65  .        { "defe
35f70 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20 20 53  nsive",        S
35f80 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44  QLITE_DBCONFIG_D
35f90 45 46 45 4e 53 49 56 45 20 20 20 20 20 20 20 20  EFENSIVE        
35fa0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
35fb0 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b 0a 20      int ii, v;. 
35fc0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
35fd0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
35fe0 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61 44 62  ii<ArraySize(aDb
35ff0 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29 7b 0a  Config); ii++){.
36000 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
36010 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
36020 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69  [1], aDbConfig[i
36030 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  i].zName)!=0 ) c
36040 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
36050 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  f( nArg>=3 ){.  
36060 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
36070 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61  _config(p->db, a
36080 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c  DbConfig[ii].op,
36090 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
360a0 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20  Arg[2]), 0);.   
360b0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
360c0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e  e3_db_config(p->
360d0 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69  db, aDbConfig[ii
360e0 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b 0a 20  ].op, -1, &v);. 
360f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36100 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73 20 25  (p->out, "%18s %
36110 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69 67 5b  s\n", aDbConfig[
36120 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f 20 22  ii].zName, v ? "
36130 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20  on" : "off");.  
36140 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29      if( nArg>1 )
36150 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
36160 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
36170 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 44  ii==ArraySize(aD
36180 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20 20 20  bConfig) ){.    
36190 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
361a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e  derr, "Error: un
361b0 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67 20 5c  known dbconfig \
361c0 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
361d0 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  1]);.      utf8_
361e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
361f0 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e 66 69  Enter \".dbconfi
36200 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75  g\" with no argu
36210 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74  ments for a list
36220 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20 0a 20  \n");.    }   . 
36230 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
36240 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='d' && n>=3 && 
36250 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36260 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d  , "dbinfo", n)==
36270 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 68  0 ){.    rc = sh
36280 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
36290 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72  nd(p, nArg, azAr
362a0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  g);.  }else..#if
362b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
362c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
362d0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
362e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
362f0 41 47 45 5f 56 54 41 42 29 0a 20 20 69 66 28 20  AGE_VTAB).  if( 
36300 63 3d 3d 27 72 27 20 26 26 20 73 74 72 6e 63 6d  c=='r' && strncm
36310 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 63  p(azArg[0], "rec
36320 6f 76 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  over", n)==0 ){.
36330 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
36340 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 63 6f  );.    rc = reco
36350 76 65 72 44 61 74 61 62 61 73 65 43 6d 64 28 70  verDatabaseCmd(p
36360 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a  , nArg, azArg);.
36370 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
36380 2a 20 21 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  * !(SQLITE_OMIT_
36390 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
363a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
363b0 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56 54  ENABLE_DBPAGE_VT
363c0 41 42 29 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d  AB) */..  if( c=
363d0 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='d' && strncmp(
363e0 61 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22  azArg[0], "dump"
363f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
36400 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65  onst char *zLike
36410 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
36420 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68  .    int savedSh
36430 6f 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68  owHeader = p->sh
36440 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 69 6e  owHeader;.    in
36450 74 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61 67  t savedShellFlag
36460 73 20 3d 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73  s = p->shellFlgs
36470 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72  ;.    ShellClear
36480 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
36490 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46 4c  eserveRowid|SHFL
364a0 47 5f 4e 65 77 6c 69 6e 65 73 7c 53 48 46 4c 47  G_Newlines|SHFLG
364b0 5f 45 63 68 6f 29 3b 0a 20 20 20 20 66 6f 72 28  _Echo);.    for(
364c0 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=1; i<nArg; i++
364d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  ){.      if( azA
364e0 72 67 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b  rg[i][0]=='-' ){
364f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
36500 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
36510 5d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]+1;.        if(
36520 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[0]=='-' ) z++
36530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
36540 72 63 6d 70 28 7a 2c 22 70 72 65 73 65 72 76 65  rcmp(z,"preserve
36550 2d 72 6f 77 69 64 73 22 29 3d 3d 30 20 29 7b 0a  -rowids")==0 ){.
36560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
36570 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
36580 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
36590 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 54 68  intf(stderr, "Th
365a0 65 20 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77  e --preserve-row
365b0 69 64 73 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  ids option is no
365c0 74 20 63 6f 6d 70 61 74 69 62 6c 65 22 0a 20 20  t compatible".  
365d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365e0 20 20 20 20 20 20 20 20 20 20 20 22 20 77 69 74             " wit
365f0 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  h SQLITE_OMIT_VI
36600 52 54 55 41 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a  RTUALTABLE\n");.
36610 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
36620 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
36630 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
36640 69 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  it;.#else.      
36650 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67      ShellSetFlag
36660 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
36670 76 65 52 6f 77 69 64 29 3b 0a 23 65 6e 64 69 66  veRowid);.#endif
36680 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
36690 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
366a0 70 28 7a 2c 22 6e 65 77 6c 69 6e 65 73 22 29 3d  p(z,"newlines")=
366b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
366c0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
366d0 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b  SHFLG_Newlines);
366e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
366f0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
36700 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36710 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f  derr, "Unknown o
36720 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20  ption \"%s\" on 
36730 5c 22 2e 64 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a  \".dump\"\n", az
36740 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
36750 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
36760 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
36770 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
36780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36790 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a  se if( zLike ){.
367a0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
367b0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
367c0 65 3a 20 2e 64 75 6d 70 20 3f 2d 2d 70 72 65 73  e: .dump ?--pres
367d0 65 72 76 65 2d 72 6f 77 69 64 73 3f 20 22 0a 20  erve-rowids? ". 
367e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367f0 20 20 20 20 20 20 20 20 20 20 22 3f 2d 2d 6e 65            "?--ne
36800 77 6c 69 6e 65 73 3f 20 3f 4c 49 4b 45 2d 50 41  wlines? ?LIKE-PA
36810 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20  TTERN?\n");.    
36820 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36830 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36840 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36860 20 7a 4c 69 6b 65 20 3d 20 61 7a 41 72 67 5b 69   zLike = azArg[i
36870 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
36880 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ..    open_db(p,
36890 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65   0);..    /* Whe
368a0 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 61  n playing back a
368b0 20 22 64 75 6d 70 22 2c 20 74 68 65 20 63 6f 6e   "dump", the con
368c0 74 65 6e 74 20 6d 69 67 68 74 20 61 70 70 65 61  tent might appea
368d0 72 20 69 6e 20 61 6e 20 6f 72 64 65 72 0a 20 20  r in an order.  
368e0 20 20 2a 2a 20 77 68 69 63 68 20 63 61 75 73 65    ** which cause
368f0 73 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  s immediate fore
36900 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
36910 6e 74 73 20 74 6f 20 62 65 20 76 69 6f 6c 61 74  nts to be violat
36920 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f 20 64 69  ed..    ** So di
36930 73 61 62 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65  sable foreign-ke
36940 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 6e 66  y constraint enf
36950 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70 72 65 76  orcement to prev
36960 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f  ent problems. */
36970 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
36980 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
36990 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
369a0 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70  ;\n");.    raw_p
369b0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 42  rintf(p->out, "B
369c0 45 47 49 4e 20 54 52 41 4e 53 41 43 54 49 4f 4e  EGIN TRANSACTION
369d0 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d 3e 77 72  ;\n");.    p->wr
369e0 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30  itableSchema = 0
369f0 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61  ;.    p->showHea
36a00 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  der = 0;.    /* 
36a10 53 65 74 20 77 72 69 74 61 62 6c 65 5f 73 63 68  Set writable_sch
36a20 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20 64 6f 69  ema=ON since doi
36a30 6e 67 20 73 6f 20 66 6f 72 63 65 73 20 53 51 4c  ng so forces SQL
36a40 69 74 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ite to initializ
36a50 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d 75 63 68  e.    ** as much
36a60 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 61   of the schema a
36a70 73 20 69 74 20 63 61 6e 20 65 76 65 6e 20 69 66  s it can even if
36a80 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
36a90 65 72 20 74 61 62 6c 65 20 69 73 0a 20 20 20 20  er table is.    
36aa0 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  ** corrupt. */. 
36ab0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
36ac0 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 4f 49 4e  p->db, "SAVEPOIN
36ad0 54 20 64 75 6d 70 3b 20 50 52 41 47 4d 41 20 77  T dump; PRAGMA w
36ae0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
36af0 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  N", 0, 0, 0);.  
36b00 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b 0a 20    p->nErr = 0;. 
36b10 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d 3d 30 20     if( zLike==0 
36b20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  ){.      run_sch
36b30 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
36b40 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
36b50 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
36b60 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
36b70 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
36b80 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
36b90 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61  LL AND type=='ta
36ba0 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27  ble' AND name!='
36bb0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
36bc0 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
36bd0 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
36be0 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20  _query(p,.      
36bf0 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20    "SELECT name, 
36c00 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73  type, sql FROM s
36c10 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
36c20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61         "WHERE na
36c30 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73 65 71 75  me=='sqlite_sequ
36c40 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a  ence'".      );.
36c50 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
36c60 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
36c70 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
36c80 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
36c90 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
36ca0 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
36cb0 4c 4c 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28  LL AND type IN (
36cc0 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72  'index','trigger
36cd0 27 2c 27 76 69 65 77 27 29 22 2c 20 30 0a 20 20  ','view')", 0.  
36ce0 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
36cf0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
36d00 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  ql;.      zSql =
36d10 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
36d20 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  (.        "SELEC
36d30 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71  T name, type, sq
36d40 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
36d50 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22  ster ".        "
36d60 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 20 4c  WHERE tbl_name L
36d70 49 4b 45 20 25 51 20 41 4e 44 20 74 79 70 65 3d  IKE %Q AND type=
36d80 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20  ='table'".      
36d90 20 20 22 20 20 41 4e 44 20 73 71 6c 20 4e 4f 54    "  AND sql NOT
36da0 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65 29 3b 0a   NULL", zLike);.
36db0 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61        run_schema
36dc0 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 7a 53  _dump_query(p,zS
36dd0 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
36de0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
36df0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
36e00 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
36e10 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c       "SELECT sql
36e20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
36e30 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57  ter ".        "W
36e40 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55 4c  HERE sql NOT NUL
36e50 4c 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  L".        "  AN
36e60 44 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65  D type IN ('inde
36e70 78 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69  x','trigger','vi
36e80 65 77 27 29 22 0a 20 20 20 20 20 20 20 20 22 20  ew')".        " 
36e90 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65 20 4c 49   AND tbl_name LI
36ea0 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65 29 3b 0a  KE %Q", zLike);.
36eb0 20 20 20 20 20 20 72 75 6e 5f 74 61 62 6c 65 5f        run_table_
36ec0 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 20 7a 53  dump_query(p, zS
36ed0 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ql, 0);.      sq
36ee0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
36ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36f00 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
36f10 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
36f20 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
36f30 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
36f40 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  chema=OFF;\n");.
36f50 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
36f60 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  eSchema = 0;.   
36f70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65   }.    sqlite3_e
36f80 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
36f90 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
36fa0 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ma=OFF;", 0, 0, 
36fb0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
36fc0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
36fd0 45 41 53 45 20 64 75 6d 70 3b 22 2c 20 30 2c 20  EASE dump;", 0, 
36fe0 30 2c 20 30 29 3b 0a 20 20 20 20 72 61 77 5f 70  0, 0);.    raw_p
36ff0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 70 2d  rintf(p->out, p-
37000 3e 6e 45 72 72 3f 22 52 4f 4c 4c 42 41 43 4b 3b  >nErr?"ROLLBACK;
37010 20 2d 2d 20 64 75 65 20 74 6f 20 65 72 72 6f 72   -- due to error
37020 73 5c 6e 22 3a 22 43 4f 4d 4d 49 54 3b 5c 6e 22  s\n":"COMMIT;\n"
37030 29 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  );.    p->showHe
37040 61 64 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77  ader = savedShow
37050 48 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 73  Header;.    p->s
37060 68 65 6c 6c 46 6c 67 73 20 3d 20 73 61 76 65 64  hellFlgs = saved
37070 53 68 65 6c 6c 46 6c 61 67 73 3b 0a 20 20 7d 65  ShellFlags;.  }e
37080 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
37090 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
370a0 72 67 5b 30 5d 2c 20 22 65 63 68 6f 22 2c 20 6e  rg[0], "echo", n
370b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
370c0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
370d0 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
370e0 70 2c 20 53 48 46 4c 47 5f 45 63 68 6f 2c 20 61  p, SHFLG_Echo, a
370f0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
37100 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
37110 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
37120 73 61 67 65 3a 20 2e 65 63 68 6f 20 6f 6e 7c 6f  sage: .echo on|o
37130 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
37140 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
37150 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65  lse..  if( c=='e
37160 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
37170 72 67 5b 30 5d 2c 20 22 65 71 70 22 2c 20 6e 29  rg[0], "eqp", n)
37180 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
37190 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
371a0 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d  p->autoEQPtest =
371b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
371c0 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20 29 7b  >autoEQPtrace ){
371d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
371e0 64 62 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  db ) sqlite3_exe
371f0 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
37200 20 76 64 62 65 5f 74 72 61 63 65 3d 4f 46 46 3b   vdbe_trace=OFF;
37210 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
37220 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74       p->autoEQPt
37230 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
37240 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
37250 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c  mp(azArg[1],"ful
37260 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
37270 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
37280 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20  UTOEQP_full;.   
37290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
372a0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72  cmp(azArg[1],"tr
372b0 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  igger")==0 ){.  
372c0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
372d0 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67   = AUTOEQP_trigg
372e0 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
372f0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 7d 65  E_DEBUG.      }e
37300 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
37310 7a 41 72 67 5b 31 5d 2c 22 74 65 73 74 22 29 3d  zArg[1],"test")=
37320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
37330 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
37340 51 50 5f 6f 6e 3b 0a 20 20 20 20 20 20 20 20 70  QP_on;.        p
37350 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20 3d 20  ->autoEQPtest = 
37360 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
37370 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
37380 31 5d 2c 22 74 72 61 63 65 22 29 3d 3d 30 20 29  1],"trace")==0 )
37390 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
373a0 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66  oEQP = AUTOEQP_f
373b0 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
373c0 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20 31  autoEQPtrace = 1
373d0 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 5f 64  ;.        open_d
373e0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  b(p, 0);.       
373f0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
37400 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d  >db, "SELECT nam
37410 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
37420 73 74 65 72 20 4c 49 4d 49 54 20 31 22 2c 20 30  ster LIMIT 1", 0
37430 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
37440 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
37450 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 76 64 62  >db, "PRAGMA vdb
37460 65 5f 74 72 61 63 65 3d 4f 4e 3b 22 2c 20 30 2c  e_trace=ON;", 0,
37470 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
37480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37490 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
374a0 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75   (u8)booleanValu
374b0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
374c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
374d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
374e0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
374f0 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 61   .eqp off|on|tra
37500 63 65 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c  ce|trigger|full\
37510 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
37520 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
37530 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  ..  if( c=='e' &
37540 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
37550 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d  0], "exit", n)==
37560 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
37570 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69 6e  g>1 && (rc = (in
37580 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
37590 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20 65  zArg[1]))!=0 ) e
375a0 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63 20  xit(rc);.    rc 
375b0 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  = 2;.  }else..  
375c0 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69 6e  /* The ".explain
375d0 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74  " command is aut
375e0 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74 20  omatic now.  It 
375f0 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74  is largely point
37600 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72  less.  It.  ** r
37610 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20 66  etained purely f
37620 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
37630 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20  patibility */.  
37640 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
37650 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37660 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30  "explain", n)==0
37670 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20   ){.    int val 
37680 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 1;.    if( nAr
37690 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g>=2 ){.      if
376a0 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
376b0 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a  ],"auto")==0 ){.
376c0 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39 39          val = 99
376d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
376e0 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62 6f         val =  bo
376f0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
37700 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [1]);.      }.  
37710 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3d    }.    if( val=
37720 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d  =1 && p->mode!=M
37730 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
37740 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f       p->normalMo
37750 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
37760 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
37770 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
37780 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e    p->autoExplain
37790 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
377a0 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20  if( val==0 ){.  
377b0 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
377c0 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20  =MODE_Explain ) 
377d0 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72  p->mode = p->nor
377e0 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70  malMode;.      p
377f0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
37800 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
37810 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20   val==99 ){.    
37820 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
37830 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d  ODE_Explain ) p-
37840 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61  >mode = p->norma
37850 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e  lMode;.      p->
37860 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b  autoExplain = 1;
37870 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
37880 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37890 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
378a0 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26  .  if( c=='e' &&
378b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
378c0 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29 3d  ], "expert", n)=
378d0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
378e0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78 70  b(p, 0);.    exp
378f0 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2