/ Hex Artifact Content
Login

Artifact 4dac87dbc32c95b8127af3a0fdc0b0a257df02c837520d340870822e7fff2c02:


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 66  DE ../ext/misc/f
61c0: 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20  ileio.c.INCLUDE 
61d0: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70  ../ext/misc/comp
61e0: 6c 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45  letion.c.INCLUDE
61f0: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70   ../ext/misc/app
6200: 65 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45  endvfs.c.INCLUDE
6210: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d   ../ext/misc/mem
6220: 74 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53  trace.c.#ifdef S
6230: 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
6240: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
6250: 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e  isc/zipfile.c.IN
6260: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
6270: 63 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66  c/sqlar.c.#endif
6280: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
6290: 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78  expert/sqlite3ex
62a0: 70 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e  pert.h.INCLUDE .
62b0: 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c  ./ext/expert/sql
62c0: 69 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69  ite3expert.c..#i
62d0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
62e0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
62f0: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
6300: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42  SQLITE_ENABLE_DB
6310: 50 41 47 45 5f 56 54 41 42 29 0a 49 4e 43 4c 55  PAGE_VTAB).INCLU
6320: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 64  DE ../ext/misc/d
6330: 62 64 61 74 61 2e 63 0a 23 65 6e 64 69 66 0a 0a  bdata.c.#endif..
6340: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6350: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
6360: 4e 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69  N)./*.** State i
6370: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
6380: 20 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73   single open ses
6390: 73 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  sion.*/.typedef 
63a0: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
63b0: 6f 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a  on OpenSession;.
63c0: 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69  struct OpenSessi
63d0: 6f 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  on {.  char *zNa
63e0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
63f0: 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  /* Symbolic name
6400: 20 66 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f   for this sessio
6410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74  n */.  int nFilt
6420: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
6430: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69  /* Number of xFi
6440: 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47  lter rejection G
6450: 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a  LOB patterns */.
6460: 20 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65    char **azFilte
6470: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  r;         /* Ar
6480: 72 61 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72  ray of xFilter r
6490: 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61  ejection GLOB pa
64a0: 74 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  tterns */.  sqli
64b0: 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20  te3_session *p; 
64c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e       /* The open
64d0: 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23   session */.};.#
64e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65  endif../*.** She
64f0: 6c 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69  ll output mode i
6500: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
6510: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
6520: 20 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73   on",.** saved s
6530: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
6540: 20 72 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65   restored by ".e
6550: 78 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74  xplain off".*/.t
6560: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 61  ypedef struct Sa
6570: 76 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65  vedModeInfo Save
6580: 64 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63  dModeInfo;.struc
6590: 74 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20  t SavedModeInfo 
65a0: 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20  {.  int valid;  
65b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68          /* Is th
65c0: 65 72 65 20 6c 65 67 69 74 20 64 61 74 61 20 69  ere legit data i
65d0: 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74  n here? */.  int
65e0: 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   mode;          
65f0: 20 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74   /* Mode prior t
6600: 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20  o ".explain on" 
6610: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61  */.  int showHea
6620: 64 65 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  der;     /* The 
6630: 22 2e 68 65 61 64 65 72 22 20 73 65 74 74 69 6e  ".header" settin
6640: 67 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70  g prior to ".exp
6650: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6660: 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b  t colWidth[100];
6670: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74    /* Column widt
6680: 68 73 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78  hs prior to ".ex
6690: 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a  plain on" */.};.
66a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
66b0: 45 78 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72  ExpertInfo Exper
66c0: 74 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78  tInfo;.struct Ex
66d0: 70 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c  pertInfo {.  sql
66e0: 69 74 65 33 65 78 70 65 72 74 20 2a 70 45 78 70  ite3expert *pExp
66f0: 65 72 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62  ert;.  int bVerb
6700: 6f 73 65 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69  ose;.};../* A si
6710: 6e 67 6c 65 20 6c 69 6e 65 20 69 6e 20 74 68 65  ngle line in the
6720: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74   EQP output */.t
6730: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 51  ypedef struct EQ
6740: 50 47 72 61 70 68 52 6f 77 20 45 51 50 47 72 61  PGraphRow EQPGra
6750: 70 68 52 6f 77 3b 0a 73 74 72 75 63 74 20 45 51  phRow;.struct EQ
6760: 50 47 72 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e  PGraphRow {.  in
6770: 74 20 69 45 71 70 49 64 3b 20 20 20 20 20 20 20  t iEqpId;       
6780: 20 20 20 20 2f 2a 20 49 44 20 66 6f 72 20 74 68      /* ID for th
6790: 69 73 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  is row */.  int 
67a0: 69 50 61 72 65 6e 74 49 64 3b 20 20 20 20 20 20  iParentId;      
67b0: 20 20 2f 2a 20 49 44 20 6f 66 20 74 68 65 20 70    /* ID of the p
67c0: 61 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45  arent row */.  E
67d0: 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65 78  QPGraphRow *pNex
67e0: 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77  t;   /* Next row
67f0: 20 69 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a   in sequence */.
6800: 20 20 63 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b    char zText[1];
6810: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
6820: 74 6f 20 64 69 73 70 6c 61 79 20 66 6f 72 20 74  to display for t
6830: 68 69 73 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f  his row */.};../
6840: 2a 20 41 6c 6c 20 45 51 50 20 6f 75 74 70 75 74  * All EQP output
6850: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
6860: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
6870: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6880: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
6890: 74 20 45 51 50 47 72 61 70 68 20 45 51 50 47 72  t EQPGraph EQPGr
68a0: 61 70 68 3b 0a 73 74 72 75 63 74 20 45 51 50 47  aph;.struct EQPG
68b0: 72 61 70 68 20 7b 0a 20 20 45 51 50 47 72 61 70  raph {.  EQPGrap
68c0: 68 52 6f 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f  hRow *pRow;    /
68d0: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
68e0: 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
68f0: 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20   EQP output */. 
6900: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4c   EQPGraphRow *pL
6910: 61 73 74 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65  ast;   /* Last e
6920: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 52  lement of the pR
6930: 6f 77 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61  ow list */.  cha
6940: 72 20 7a 50 72 65 66 69 78 5b 31 30 30 5d 3b 20  r zPrefix[100]; 
6950: 20 20 20 2f 2a 20 47 72 61 70 68 20 70 72 65 66     /* Graph pref
6960: 69 78 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ix */.};../*.** 
6970: 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  State informatio
6980: 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61  n about the data
6990: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
69a0: 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
69b0: 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  an.** instance o
69c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
69d0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
69e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
69f0: 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74 61  llState ShellSta
6a00: 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  te;.struct Shell
6a10: 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74 65  State {.  sqlite
6a20: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
6a30: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
6a40: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78 70   */.  u8 autoExp
6a50: 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  lain;        /* 
6a60: 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75  Automatically tu
6a70: 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d  rn on .explain m
6a80: 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f  ode */.  u8 auto
6a90: 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20  EQP;            
6aa0: 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20 51  /* Run EXPLAIN Q
6ab0: 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72 20  UERY PLAN prior 
6ac0: 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74 6d  to seach SQL stm
6ad0: 74 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51  t */.  u8 autoEQ
6ae0: 50 74 65 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  Ptest;        /*
6af0: 20 61 75 74 6f 45 51 50 20 69 73 20 69 6e 20 74   autoEQP is in t
6b00: 65 73 74 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38  est mode */.  u8
6b10: 20 61 75 74 6f 45 51 50 74 72 61 63 65 3b 20 20   autoEQPtrace;  
6b20: 20 20 20 20 20 2f 2a 20 61 75 74 6f 45 51 50 20       /* autoEQP 
6b30: 69 73 20 69 6e 20 74 72 61 63 65 20 6d 6f 64 65  is in trace mode
6b40: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e   */.  u8 statsOn
6b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6b60: 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20  True to display 
6b70: 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66  memory stats bef
6b80: 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a  ore each finaliz
6b90: 65 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74  e */.  u8 scanst
6ba0: 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a  atsOn;        /*
6bb0: 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79   True to display
6bc0: 20 73 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f   scan stats befo
6bd0: 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65  re each finalize
6be0: 20 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64   */.  u8 openMod
6bf0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
6c00: 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
6c10: 4c 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f  L, _APPENDVFS, o
6c20: 72 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20  r _ZIPFILE */.  
6c30: 75 38 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20  u8 doXdgOpen;   
6c40: 20 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65         /* Invoke
6c50: 20 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d   start/open/xdg-
6c60: 6f 70 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72  open in output_r
6c70: 65 73 65 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e  eset() */.  u8 n
6c80: 45 71 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  EqpLevel;       
6c90: 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20 74     /* Depth of t
6ca0: 68 65 20 45 51 50 20 6f 75 74 70 75 74 20 67 72  he EQP output gr
6cb0: 61 70 68 20 2a 2f 0a 20 20 75 38 20 65 54 72 61  aph */.  u8 eTra
6cc0: 63 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20  ceType;         
6cd0: 2f 2a 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a  /* SHELL_TRACE_*
6ce0: 20 76 61 6c 75 65 20 66 6f 72 20 74 79 70 65 20   value for type 
6cf0: 6f 66 20 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e  of trace */.  un
6d00: 73 69 67 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73  signed mEqpLines
6d10: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
6d20: 76 65 72 69 74 69 63 61 6c 20 6c 69 6e 65 73 20  veritical lines 
6d30: 69 6e 20 74 68 65 20 45 51 50 20 6f 75 74 70 75  in the EQP outpu
6d40: 74 20 67 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74  t graph */.  int
6d50: 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20 20   outCount;      
6d60: 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74 6f      /* Revert to
6d70: 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65 61   stdout when rea
6d80: 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20  ching zero */.  
6d90: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6da0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6db0: 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73 70   of records disp
6dc0: 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  layed so far */.
6dd0: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20    int lineno;   
6de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
6df0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 73 74 20   number of last 
6e00: 6c 69 6e 65 20 72 65 61 64 20 66 72 6f 6d 20 69  line read from i
6e10: 6e 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  n */.  FILE *in;
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6e30: 20 52 65 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66   Read commands f
6e40: 72 6f 6d 20 74 68 69 73 20 73 74 72 65 61 6d 20  rom this stream 
6e50: 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20  */.  FILE *out; 
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6e70: 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
6e80: 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61  e */.  FILE *tra
6e90: 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a  ceOut;        /*
6ea0: 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69   Output for sqli
6eb0: 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20  te3_trace() */. 
6ec0: 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6ee0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
6ef0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20   */.  int mode; 
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f10: 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73  An output mode s
6f20: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  etting */.  int 
6f30: 6d 6f 64 65 50 72 69 6f 72 3b 20 20 20 20 20 20  modePrior;      
6f40: 20 20 20 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65     /* Saved mode
6f50: 20 2a 2f 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b   */.  int cMode;
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f70: 74 65 6d 70 6f 72 61 72 79 20 6f 75 74 70 75 74  temporary output
6f80: 20 6d 6f 64 65 20 66 6f 72 20 74 68 65 20 63 75   mode for the cu
6f90: 72 72 65 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20  rrent query */. 
6fa0: 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b   int normalMode;
6fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6fc0: 74 20 6d 6f 64 65 20 62 65 66 6f 72 65 20 22 2e  t mode before ".
6fd0: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6fe0: 20 69 6e 74 20 77 72 69 74 61 62 6c 65 53 63 68   int writableSch
6ff0: 65 6d 61 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  ema;    /* True 
7000: 69 66 20 50 52 41 47 4d 41 20 77 72 69 74 61 62  if PRAGMA writab
7010: 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a  le_schema=ON */.
7020: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
7030: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
7040: 20 74 6f 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20   to show column 
7050: 6e 61 6d 65 73 20 69 6e 20 4c 69 73 74 20 6f 72  names in List or
7060: 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a   Column mode */.
7070: 20 20 69 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20    int nCheck;   
7080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7090: 65 72 20 6f 66 20 22 2e 63 68 65 63 6b 22 20 63  er of ".check" c
70a0: 6f 6d 6d 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20  ommands run */. 
70b0: 20 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67 72   unsigned nProgr
70c0: 65 73 73 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ess;    /* Numbe
70d0: 72 20 6f 66 20 70 72 6f 67 72 65 73 73 20 63 61  r of progress ca
70e0: 6c 6c 62 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65  llbacks encounte
70f0: 72 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  red */.  unsigne
7100: 64 20 6d 78 50 72 6f 67 72 65 73 73 3b 20 20 20  d mxProgress;   
7110: 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72  /* Maximum progr
7120: 65 73 73 20 63 61 6c 6c 62 61 63 6b 73 20 62 65  ess callbacks be
7130: 66 6f 72 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a  fore failing */.
7140: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 67 50 72    unsigned flgPr
7150: 6f 67 72 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67  ogress;  /* Flag
7160: 73 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 65  s for the progre
7170: 73 73 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ss callback */. 
7180: 20 75 6e 73 69 67 6e 65 64 20 73 68 65 6c 6c 46   unsigned shellF
7190: 6c 67 73 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f  lgs;    /* Vario
71a0: 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71  us flags */.  sq
71b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61  lite3_int64 szMa
71c0: 78 3b 20 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a  x;   /* --maxsiz
71d0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f  e argument to .o
71e0: 70 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  pen */.  char *z
71f0: 44 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20  DestTable;      
7200: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69  /* Name of desti
7210: 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65  nation table whe
7220: 6e 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f  n MODE_Insert */
7230: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69  .  char *zTempFi
7240: 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  le;       /* Tem
7250: 70 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74  porary file that
7260: 20 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65   might need dele
7270: 74 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ting */.  char z
7280: 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20  Testcase[30];   
7290: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72   /* Name of curr
72a0: 65 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f  ent test case */
72b0: 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72  .  char colSepar
72c0: 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c  ator[20]; /* Col
72d0: 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68  umn separator ch
72e0: 61 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65  aracter for seve
72f0: 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63  ral modes */.  c
7300: 68 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72  har rowSeparator
7310: 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70  [20]; /* Row sep
7320: 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
7330: 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20   for MODE_Ascii 
7340: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
7350: 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53  Prior[20];  /* S
7360: 61 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61  aved column sepa
7370: 72 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  rator */.  char 
7380: 72 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b  rowSepPrior[20];
7390: 20 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73    /* Saved row s
73a0: 65 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  eparator */.  in
73b0: 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b  t colWidth[100];
73c0: 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65       /* Requeste
73d0: 64 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20  d width of each 
73e0: 63 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63  column when in c
73f0: 6f 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69  olumn mode*/.  i
7400: 6e 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31  nt actualWidth[1
7410: 30 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20  00];  /* Actual 
7420: 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f  width of each co
7430: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e  lumn */.  char n
7440: 75 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20  ullValue[20];   
7450: 20 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20   /* The text to 
7460: 70 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c  print when a NUL
7470: 4c 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f  L comes back fro
7480: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
7490: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
74a0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
74b0: 63 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c  char outfile[FIL
74c0: 45 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46  ENAME_MAX]; /* F
74d0: 69 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74  ilename for *out
74e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
74f0: 20 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20   *zDbFilename;  
7500: 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
7510: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7520: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f  /.  char *zFreeO
7530: 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20  nClose;         
7540: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66  /* Filename to f
7550: 72 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ree when closing
7560: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7570: 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20   *zVfs;         
7580: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
7590: 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c   to use */.  sql
75a0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
75b0: 3b 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73  ;   /* Current s
75c0: 74 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e  tatement if any.
75d0: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67   */.  FILE *pLog
75e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
75f0: 57 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74  Write log output
7600: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
7610: 61 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20  aiIndent;       
7620: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e    /* Array of in
7630: 64 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f  dents used in MO
7640: 44 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20  DE_Explain */.  
7650: 69 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20  int nIndent;    
7660: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
7670: 66 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74  f array aiIndent
7680: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  [] */.  int iInd
7690: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ent;           /
76a0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65  * Index of curre
76b0: 6e 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e  nt op in aiInden
76c0: 74 5b 5d 20 2a 2f 0a 20 20 45 51 50 47 72 61 70  t[] */.  EQPGrap
76d0: 68 20 73 47 72 61 70 68 3b 20 20 20 20 20 20 20  h sGraph;       
76e0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  /* Information f
76f0: 6f 72 20 74 68 65 20 67 72 61 70 68 69 63 61 6c  or the graphical
7700: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
7710: 4c 41 4e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  LAN */.#if defin
7720: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
7730: 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20  _SESSION).  int 
7740: 6e 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20  nSession;       
7750: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7760: 6f 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f  of active sessio
7770: 6e 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73  ns */.  OpenSess
7780: 69 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b  ion aSession[4];
7790: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
77a0: 73 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20  ssions.  [0] is 
77b0: 69 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e  in focus. */.#en
77c0: 64 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f  dif.  ExpertInfo
77d0: 20 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20   expert;        
77e0: 2f 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76  /* Valid if prev
77f0: 69 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73  ious command was
7800: 20 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e   ".expert OPT...
7810: 22 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c  " */.};.../* All
7820: 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20  owed values for 
7830: 53 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45  ShellState.autoE
7840: 51 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55  QP.*/.#define AU
7850: 54 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30  TOEQP_off      0
7860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
7870: 74 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20  tomatic EXPLAIN 
7880: 51 55 45 52 59 20 50 4c 41 4e 20 69 73 20 6f 66  QUERY PLAN is of
7890: 66 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  f */.#define AUT
78a0: 4f 45 51 50 5f 6f 6e 20 20 20 20 20 20 20 31 20  OEQP_on       1 
78b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74            /* Aut
78c0: 6f 6d 61 74 69 63 20 45 51 50 20 69 73 20 6f 6e  omatic EQP is on
78d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f   */.#define AUTO
78e0: 45 51 50 5f 74 72 69 67 67 65 72 20 20 32 20 20  EQP_trigger  2  
78f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61           /* On a
7900: 6e 64 20 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61  nd also show pla
7910: 6e 73 20 66 6f 72 20 74 72 69 67 67 65 72 73 20  ns for triggers 
7920: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7930: 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 20 20 20  QP_full     3   
7940: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20          /* Show 
7950: 66 75 6c 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a  full EXPLAIN */.
7960: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
7970: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
7980: 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64  e.openMode.*/.#d
7990: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
79a0: 5f 55 4e 53 50 45 43 20 20 20 20 20 20 30 20 20  _UNSPEC      0  
79b0: 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d      /* No open-m
79c0: 6f 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f  ode specified */
79d0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
79e0: 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20  PEN_NORMAL      
79f0: 31 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c  1      /* Normal
7a00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
7a10: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7a20: 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20  OPEN_APPENDVFS  
7a30: 20 32 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61   2      /* Use a
7a40: 70 70 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66  ppendvfs */.#def
7a50: 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  ine SHELL_OPEN_Z
7a60: 49 50 46 49 4c 45 20 20 20 20 20 33 20 20 20 20  IPFILE     3    
7a70: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 7a 69 70    /* Use the zip
7a80: 66 69 6c 65 20 76 69 72 74 75 61 6c 20 74 61 62  file virtual tab
7a90: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  le */.#define SH
7aa0: 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ELL_OPEN_READONL
7ab0: 59 20 20 20 20 34 20 20 20 20 20 20 2f 2a 20 4f  Y    4      /* O
7ac0: 70 65 6e 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74  pen a normal dat
7ad0: 61 62 61 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20  abase read-only 
7ae0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7af0: 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
7b00: 45 20 35 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  E 5      /* Open
7b10: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 64   using sqlite3_d
7b20: 65 73 65 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a  eserialize() */.
7b30: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7b40: 45 4e 5f 48 45 58 44 42 20 20 20 20 20 20 20 36  EN_HEXDB       6
7b50: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 22 64 62        /* Use "db
7b60: 74 6f 74 78 74 22 20 6f 75 74 70 75 74 20 61 73  totxt" output as
7b70: 20 64 61 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a   data source */.
7b80: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
7b90: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
7ba0: 65 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a  e.eTraceType.*/.
7bb0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52  #define SHELL_TR
7bc0: 41 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30  ACE_PLAIN      0
7bd0: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e        /* Show in
7be0: 70 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a  put SQL text */.
7bf0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52  #define SHELL_TR
7c00: 41 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31  ACE_EXPANDED   1
7c10: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78        /* Show ex
7c20: 70 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20  panded SQL text 
7c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7c40: 5f 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45  _TRACE_NORMALIZE
7c50: 44 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77  D 2      /* Show
7c60: 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20   normalized SQL 
7c70: 74 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73  text */../* Bits
7c80: 20 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61   in the ShellSta
7c90: 74 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76  te.flgProgress v
7ca0: 61 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  ariable */.#defi
7cb0: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7cc0: 53 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a  S_QUIET 0x01  /*
7cd0: 20 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67   Omit announcing
7ce0: 20 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20   every progress 
7cf0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66  callback */.#def
7d00: 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45  ine SHELL_PROGRE
7d10: 53 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f  SS_RESET 0x02  /
7d20: 2a 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e  * Reset the coun
7d30: 74 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72  t when the progr
7d40: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  es.             
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63        ** callbac
7d70: 6b 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68  k limit is reach
7d80: 65 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68  ed, and for each
7d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c      ** top-level
7dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
7dd0: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7de0: 50 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30  PROGRESS_ONCE  0
7df0: 78 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74  x04  /* Cancel t
7e00: 68 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72  he --limit after
7e10: 20 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a   firing once */.
7e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
7e30: 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65   the allowed she
7e40: 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f  llFlgs values.*/
7e50: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7e60: 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78  agecache      0x
7e70: 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20  00000001 /* The 
7e80: 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69  --pagecache opti
7e90: 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64  on is used */.#d
7ea0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b  efine SHFLG_Look
7eb0: 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30  aside      0x000
7ec0: 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69  00002 /* Lookasi
7ed0: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65  de memory is use
7ee0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46  d */.#define SHF
7ef0: 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20  LG_Backslash    
7f00: 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20    0x00000004 /* 
7f10: 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20  The --backslash 
7f20: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a  option is used *
7f30: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7f40: 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30  PreserveRowid  0
7f50: 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75  x00000008 /* .du
7f60: 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77  mp preserves row
7f70: 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  id values */.#de
7f80: 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69  fine SHFLG_Newli
7f90: 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30  nes       0x0000
7fa0: 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d  0010 /* .dump --
7fb0: 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a  newline flag */.
7fc0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f  #define SHFLG_Co
7fd0: 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30  untChanges   0x0
7fe0: 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e  0000020 /* .chan
7ff0: 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23  ges setting */.#
8000: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68  define SHFLG_Ech
8010: 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30  o           0x00
8020: 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20  000040 /* .echo 
8030: 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e  or --echo settin
8040: 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g */../*.** Macr
8050: 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  os for testing a
8060: 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c  nd setting shell
8070: 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  Flgs.*/.#define 
8080: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58  ShellHasFlag(P,X
8090: 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c  )    (((P)->shel
80a0: 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29  lFlgs & (X))!=0)
80b0: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65  .#define ShellSe
80c0: 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28  tFlag(P,X)    ((
80d0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28  P)->shellFlgs|=(
80e0: 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c  X)).#define Shel
80f0: 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20  lClearFlag(P,X) 
8100: 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73   ((P)->shellFlgs
8110: 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a  &=(~(X)))../*.**
8120: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
8130: 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f  llowed modes..*/
8140: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
8150: 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65  ne     0  /* One
8160: 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65   column per line
8170: 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65  .  Blank line be
8180: 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f  tween records */
8190: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f  .#define MODE_Co
81a0: 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65  lumn   1  /* One
81b0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
81c0: 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73   in neat columns
81d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
81e0: 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20  _List     2  /* 
81f0: 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c  One record per l
8200: 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72  ine with a separ
8210: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
8220: 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20  MODE_Semi     3 
8230: 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45   /* Same as MODE
8240: 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64  _List but append
8250: 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e   ";" to each lin
8260: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  e */.#define MOD
8270: 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a  E_Html     4  /*
8280: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54   Generate an XHT
8290: 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  ML table */.#def
82a0: 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20  ine MODE_Insert 
82b0: 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    5  /* Generate
82c0: 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74   SQL "insert" st
82d0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66  atements */.#def
82e0: 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20  ine MODE_Quote  
82f0: 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61    6  /* Quote va
8300: 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20  lues as for SQL 
8310: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8320: 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47  Tcl      7  /* G
8330: 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f  enerate ANSI-C o
8340: 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65  r TCL quoted ele
8350: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
8360: 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38   MODE_Csv      8
8370: 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e    /* Quote strin
8380: 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  gs, numbers are 
8390: 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  plain */.#define
83a0: 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39   MODE_Explain  9
83b0: 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43    /* Like MODE_C
83c0: 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f  olumn, but do no
83d0: 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20  t truncate data 
83e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
83f0: 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55  Ascii   10  /* U
8400: 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e  se ASCII unit an
8410: 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74  d record separat
8420: 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20  ors (0x1F/0x1E) 
8430: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
8440: 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50  Pretty  11  /* P
8450: 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65  retty-print sche
8460: 6d 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  mas */.#define M
8470: 4f 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20  ODE_EQP     12  
8480: 2f 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c  /* Converts EXPL
8490: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f  AIN QUERY PLAN o
84a0: 75 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61  utput into a gra
84b0: 70 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f  ph */..static co
84c0: 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65  nst char *modeDe
84d0: 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e  scr[] = {.  "lin
84e0: 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a  e",.  "column",.
84f0: 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d    "list",.  "sem
8500: 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20  i",.  "html",.  
8510: 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f  "insert",.  "quo
8520: 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  te",.  "tcl",.  
8530: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
8540: 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20  n",.  "ascii",. 
8550: 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a   "prettyprint",.
8560: 20 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a    "eqp".};../*.*
8570: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
8580: 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20  column/row/line 
8590: 73 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20  separators used 
85a0: 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  by the various.*
85b0: 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20  * import/export 
85c0: 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  modes..*/.#defin
85d0: 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20  e SEP_Column    
85e0: 22 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  "|".#define SEP_
85f0: 52 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23  Row       "\n".#
8600: 64 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20  define SEP_Tab  
8610: 20 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e       "\t".#defin
8620: 65 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20  e SEP_Space     
8630: 22 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  " ".#define SEP_
8640: 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64  Comma     ",".#d
8650: 65 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20  efine SEP_CrLf  
8660: 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69      "\r\n".#defi
8670: 6e 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20  ne SEP_Unit     
8680: 20 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20   "\x1F".#define 
8690: 53 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c  SEP_Record    "\
86a0: 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  x1E"../*.** A ca
86b0: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
86c0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
86d0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
86e0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
86f0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
8700: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
8710: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
8720: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
8730: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
8740: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
8750: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
8760: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
8770: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
8780: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
8790: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
87a0: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  og);.}../*.** SQ
87b0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
87c0: 6c 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a  ll_putsnl(X).**.
87d0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78  ** Write the tex
87e0: 74 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65  t X to the scree
87f0: 6e 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f  n (or whatever o
8800: 75 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64  utput is being d
8810: 69 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69  irected).** addi
8820: 6e 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20  ng a newline at 
8830: 74 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65  the end, and the
8840: 6e 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73  n return X..*/.s
8850: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
8860: 50 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69  PutsFunc(.  sqli
8870: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
8880: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
8890: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
88a0: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c  *apVal.){.  Shel
88b0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
88c0: 6c 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33  llState*)sqlite3
88d0: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
88e0: 3b 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a  ;.  (void)nVal;.
88f0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
8900: 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71  >out, "%s\n", sq
8910: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8920: 28 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73  (apVal[0]));.  s
8930: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
8940: 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b  lue(pCtx, apVal[
8950: 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  0]);.}../*.** SQ
8960: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64  L function:   ed
8970: 69 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20  it(VALUE).**    
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
8990: 74 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a  t(VALUE,EDITOR).
89a0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70  **.** These step
89b0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  s:.**.**     (1)
89c0: 20 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74   Write VALUE int
89d0: 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
89e0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  le..**     (2) R
89f0: 75 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f  un program EDITO
8a00: 52 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  R on that tempor
8a10: 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ary file..**    
8a20: 20 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65   (3) Read the te
8a30: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63  mporary file bac
8a40: 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  k and return its
8a50: 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20   content as the 
8a60: 72 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28  result..**     (
8a70: 34 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65  4) Delete the te
8a80: 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a  mporary file.**.
8a90: 2a 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52  ** If the EDITOR
8aa0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69   argument is omi
8ab0: 74 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61  tted, use the va
8ac0: 6c 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41  lue in the VISUA
8ad0: 4c 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  L.** environment
8ae0: 20 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73   variable.  If s
8af0: 74 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f  till there is no
8b00: 20 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68   EDITOR, through
8b10: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
8b20: 20 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65   Also throw an e
8b30: 72 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54  rror if the EDIT
8b40: 4f 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72  OR program retur
8b50: 6e 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78  ns a non-zero ex
8b60: 69 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e  it code..*/.#ifn
8b70: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
8b80: 45 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20  E_SYSTEM.static 
8b90: 76 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20  void editFunc(. 
8ba0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8bb0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
8bc0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
8bd0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
8be0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8bf0: 45 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a  Editor;.  char *
8c00: 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20  zTempFile = 0;. 
8c10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8c20: 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a  char *zCmd = 0;.
8c30: 20 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e    int bBin;.  in
8c40: 74 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43  t rc;.  int hasC
8c50: 52 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20  RNL = 0;.  FILE 
8c60: 2a 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  *f = 0;.  sqlite
8c70: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71  3_int64 sz;.  sq
8c80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20  lite3_int64 x;. 
8c90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8ca0: 70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72  p = 0;..  if( ar
8cb0: 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64  gc==2 ){.    zEd
8cc0: 69 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68  itor = (const ch
8cd0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
8ce0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
8cf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45  .  }else{.    zE
8d00: 64 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22  ditor = getenv("
8d10: 56 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20  VISUAL");.  }.  
8d20: 69 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29  if( zEditor==0 )
8d30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8d40: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8d50: 78 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66  xt, "no editor f
8d60: 6f 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  or edit()", -1);
8d70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8d80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
8d90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
8da0: 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
8db0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
8dc0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
8dd0: 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74  ext, "NULL input
8de0: 20 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29   to edit()", -1)
8df0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8e00: 7d 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  }.  db = sqlite3
8e10: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
8e20: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a  le(context);.  z
8e30: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8e40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
8e50: 74 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49  trol(db, 0, SQLI
8e60: 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
8e70: 45 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c  ENAME, &zTempFil
8e80: 65 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46  e);.  if( zTempF
8e90: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ile==0 ){.    sq
8ea0: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d  lite3_uint64 r =
8eb0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
8ec0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
8ed0: 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a  f(r), &r);.    z
8ee0: 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  TempFile = sqlit
8ef0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70  e3_mprintf("temp
8f00: 25 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69  %llx", r);.    i
8f10: 66 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20  f( zTempFile==0 
8f20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8f30: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8f40: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8f50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8f60: 7d 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73  }.  }.  bBin = s
8f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
8f80: 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
8f90: 54 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68  TE_BLOB;.  /* Wh
8fa0: 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  en writing the f
8fb0: 69 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64  ile to be edited
8fc0: 2c 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20  , do \n to \r\n 
8fd0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73  conversions on s
8fe0: 79 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74  ystems.  ** that
8ff0: 20 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20   want \r\n line 
9000: 65 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d  endings */.  f =
9010: 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65   fopen(zTempFile
9020: 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20  , bBin ? "wb" : 
9030: 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30  "w");.  if( f==0
9040: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9050: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
9060: 74 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61  text, "edit() ca
9070: 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66  nnot open temp f
9080: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
9090: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
90a0: 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71  d;.  }.  sz = sq
90b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
90c0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  s(argv[0]);.  if
90d0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20  ( bBin ){.    x 
90e0: 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33  = fwrite(sqlite3
90f0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
9100: 5b 30 5d 29 2c 20 31 2c 20 28 73 69 7a 65 5f 74  [0]), 1, (size_t
9110: 29 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73 65  )sz, f);.  }else
9120: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9130: 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61   *z = (const cha
9140: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
9150: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
9160: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
9170: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
9180: 68 65 20 76 61 6c 75 65 20 6f 72 69 67 69 6e 61  he value origina
9190: 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 5c 72  lly contained \r
91a0: 5c 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 20  \n */.    if( z 
91b0: 26 26 20 73 74 72 73 74 72 28 7a 2c 22 5c 72 5c  && strstr(z,"\r\
91c0: 6e 22 29 21 3d 30 20 29 20 68 61 73 43 52 4e 4c  n")!=0 ) hasCRNL
91d0: 20 3d 20 31 3b 0a 20 20 20 20 78 20 3d 20 66 77   = 1;.    x = fw
91e0: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61 6c  rite(sqlite3_val
91f0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
9200: 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73 7a 2c  , 1, (size_t)sz,
9210: 20 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73   f);.  }.  fclos
9220: 65 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20  e(f);.  f = 0;. 
9230: 20 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20   if( x!=sz ){.  
9240: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9250: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
9260: 22 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f  "edit() could no
9270: 74 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c  t write the whol
9280: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
9290: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
92a0: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  _end;.  }.  zCmd
92b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
92c0: 74 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20  tf("%s \"%s\"", 
92d0: 7a 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69  zEditor, zTempFi
92e0: 6c 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  le);.  if( zCmd=
92f0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
9300: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
9310: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
9320: 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e     goto edit_fun
9330: 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20  c_end;.  }.  rc 
9340: 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a  = system(zCmd);.
9350: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9360: 43 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cmd);.  if( rc )
9370: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9380: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
9390: 78 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75  xt, "EDITOR retu
93a0: 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20  rned non-zero", 
93b0: 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  -1);.    goto ed
93c0: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
93d0: 0a 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65  .  f = fopen(zTe
93e0: 6d 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20  mpFile, "rb");. 
93f0: 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
9400: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9410: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20  error(context,. 
9420: 20 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e       "edit() can
9430: 6e 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20  not reopen temp 
9440: 66 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22  file after edit"
9450: 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20  , -1);.    goto 
9460: 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20  edit_func_end;. 
9470: 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c   }.  fseek(f, 0,
9480: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a   SEEK_END);.  sz
9490: 20 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72   = ftell(f);.  r
94a0: 65 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20  ewind(f);.  p = 
94b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
94c0: 28 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29  ( sz+(bBin==0) )
94d0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
94e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
94f0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
9500: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74  ontext);.    got
9510: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
9520: 0a 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64  .  }.  x = fread
9530: 28 70 2c 20 31 2c 20 28 73 69 7a 65 5f 74 29 73  (p, 1, (size_t)s
9540: 7a 2c 20 66 29 3b 0a 20 20 66 63 6c 6f 73 65 28  z, f);.  fclose(
9550: 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69  f);.  f = 0;.  i
9560: 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20  f( x!=sz ){.    
9570: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
9580: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 63  rror(context, "c
9590: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 62 61  ould not read ba
95a0: 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 66 69 6c  ck the whole fil
95b0: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74  e", -1);.    got
95c0: 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b  o edit_func_end;
95d0: 0a 20 20 7d 0a 20 20 69 66 28 20 62 42 69 6e 20  .  }.  if( bBin 
95e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
95f0: 65 73 75 6c 74 5f 62 6c 6f 62 36 34 28 63 6f 6e  esult_blob64(con
9600: 74 65 78 74 2c 20 70 2c 20 73 7a 2c 20 73 71 6c  text, p, sz, sql
9610: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65  ite3_free);.  }e
9620: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9630: 5f 69 6e 74 36 34 20 69 2c 20 6a 3b 0a 20 20 20  _int64 i, j;.   
9640: 20 69 66 28 20 68 61 73 43 52 4e 4c 20 29 7b 0a   if( hasCRNL ){.
9650: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9660: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 61 69 6e  original contain
9670: 73 20 5c 72 5c 6e 20 74 68 65 6e 20 64 6f 20 6e  s \r\n then do n
9680: 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 62 61  o conversions ba
9690: 63 6b 20 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20 20  ck to \n */.    
96a0: 20 20 6a 20 3d 20 73 7a 3b 0a 20 20 20 20 7d 65    j = sz;.    }e
96b0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
96c0: 20 74 68 65 20 66 69 6c 65 20 64 69 64 20 6e 6f   the file did no
96d0: 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  t originally con
96e0: 74 61 69 6e 20 5c 72 5c 6e 20 74 68 65 6e 20 63  tain \r\n then c
96f0: 6f 6e 76 65 72 74 20 61 6e 79 20 6e 65 77 0a 20  onvert any new. 
9700: 20 20 20 20 20 2a 2a 20 5c 72 5c 6e 20 62 61 63       ** \r\n bac
9710: 6b 20 69 6e 74 6f 20 5c 6e 20 2a 2f 0a 20 20 20  k into \n */.   
9720: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c     for(i=j=0; i<
9730: 73 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  sz; i++){.      
9740: 20 20 69 66 28 20 70 5b 69 5d 3d 3d 27 5c 72 27    if( p[i]=='\r'
9750: 20 26 26 20 70 5b 69 2b 31 5d 3d 3d 27 5c 6e 27   && p[i+1]=='\n'
9760: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) i++;.        
9770: 70 5b 6a 2b 2b 5d 20 3d 20 70 5b 69 5d 3b 0a 20  p[j++] = p[i];. 
9780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20       }.      sz 
9790: 3d 20 6a 3b 0a 20 20 20 20 20 20 70 5b 73 7a 5d  = j;.      p[sz]
97a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 20 0a 20 20 20   = 0;.    } .   
97b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
97c0: 74 65 78 74 36 34 28 63 6f 6e 74 65 78 74 2c 20  text64(context, 
97d0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 2c 20  (const char*)p, 
97e0: 73 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sz,.            
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
9800: 6c 69 74 65 33 5f 66 72 65 65 2c 20 53 51 4c 49  lite3_free, SQLI
9810: 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d 0a 20 20  TE_UTF8);.  }.  
9820: 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f 66 75 6e  p = 0;..edit_fun
9830: 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20 66 20 29  c_end:.  if( f )
9840: 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 75 6e   fclose(f);.  un
9850: 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c 65 29 3b  link(zTempFile);
9860: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9870: 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 71  zTempFile);.  sq
9880: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
9890: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
98a0: 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 20  E_NOHAVE_SYSTEM 
98b0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 6f  */../*.** Save o
98c0: 72 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  r restore the cu
98d0: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64  rrent output mod
98e0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
98f0: 20 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28   outputModePush(
9900: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
9910: 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 20 3d    p->modePrior =
9920: 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d 65 6d 63   p->mode;.  memc
9930: 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f  py(p->colSepPrio
9940: 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  r, p->colSeparat
9950: 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  or, sizeof(p->co
9960: 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20  lSeparator));.  
9970: 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70  memcpy(p->rowSep
9980: 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70  Prior, p->rowSep
9990: 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70  arator, sizeof(p
99a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29  ->rowSeparator))
99b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
99c0: 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 53 68  outputModePop(Sh
99d0: 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
99e0: 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  p->mode = p->mod
99f0: 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d 63 70 79  ePrior;.  memcpy
9a00: 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
9a10: 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72 69 6f 72  , p->colSepPrior
9a20: 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  , sizeof(p->colS
9a30: 65 70 61 72 61 74 6f 72 29 29 3b 0a 20 20 6d 65  eparator));.  me
9a40: 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65 70 61 72  mcpy(p->rowSepar
9a50: 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53 65 70 50  ator, p->rowSepP
9a60: 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  rior, sizeof(p->
9a70: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  rowSeparator));.
9a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
9a90: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
9aa0: 20 61 73 20 61 20 68 65 78 2d 65 6e 63 6f 64 65   as a hex-encode
9ab0: 64 20 62 6c 6f 62 20 28 65 67 2e 20 58 27 31 32  d blob (eg. X'12
9ac0: 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20  34' ).*/.static 
9ad0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 65 78 5f  void output_hex_
9ae0: 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20  blob(FILE *out, 
9af0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
9b00: 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20  b, int nBlob){. 
9b10: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
9b20: 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72 20 2a 29  zBlob = (char *)
9b30: 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69  pBlob;.  raw_pri
9b40: 6e 74 66 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20  ntf(out,"X'");. 
9b50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f   for(i=0; i<nBlo
9b60: 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69  b; i++){ raw_pri
9b70: 6e 74 66 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a  ntf(out,"%02x",z
9b80: 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d  Blob[i]&0xff); }
9b90: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75  .  raw_printf(ou
9ba0: 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t,"'");.}../*.**
9bb0: 20 46 69 6e 64 20 61 20 73 74 72 69 6e 67 20 74   Find a string t
9bc0: 68 61 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  hat is not found
9bd0: 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d   anywhere in z[]
9be0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
9bf0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73  ter.** to that s
9c00: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79  tring..**.** Try
9c10: 20 74 6f 20 75 73 65 20 7a 41 20 61 6e 64 20 7a   to use zA and z
9c20: 42 20 66 69 72 73 74 2e 20 20 49 66 20 62 6f 74  B first.  If bot
9c30: 68 20 6f 66 20 74 68 6f 73 65 20 61 72 65 20 61  h of those are a
9c40: 6c 72 65 61 64 79 20 66 6f 75 6e 64 20 69 6e 20  lready found in 
9c50: 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  z[].** then make
9c60: 20 75 70 20 73 6f 6d 65 20 73 74 72 69 6e 67 20   up some string 
9c70: 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
9c80: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 2e  the buffer zBuf.
9c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9ca0: 20 63 68 61 72 20 2a 75 6e 75 73 65 64 5f 73 74   char *unused_st
9cb0: 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 63 68  ring(.  const ch
9cc0: 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20  ar *z,          
9cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9ce0: 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20 61 70 70  ult must not app
9cf0: 65 61 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20  ear anywhere in 
9d00: 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  z */.  const cha
9d10: 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61  r *zA, const cha
9d20: 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20  r *zB,   /* Try 
9d30: 74 68 65 73 65 20 66 69 72 73 74 20 2a 2f 0a 20  these first */. 
9d40: 20 63 68 61 72 20 2a 7a 42 75 66 20 20 20 20 20   char *zBuf     
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 73     /* Space to s
9d70: 74 6f 72 65 20 61 20 67 65 6e 65 72 61 74 65 64  tore a generated
9d80: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
9d90: 75 6e 73 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a  unsigned i = 0;.
9da0: 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20    if( strstr(z, 
9db0: 7a 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  zA)==0 ) return 
9dc0: 7a 41 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72  zA;.  if( strstr
9dd0: 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20 72 65 74  (z, zB)==0 ) ret
9de0: 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20  urn zB;.  do{.  
9df0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9e00: 74 66 28 32 30 2c 7a 42 75 66 2c 22 28 25 73 25  tf(20,zBuf,"(%s%
9e10: 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20  u)", zA, i++);. 
9e20: 20 7d 77 68 69 6c 65 28 20 73 74 72 73 74 72 28   }while( strstr(
9e30: 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b 0a 20 20  z,zBuf)!=0 );.  
9e40: 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a  return zBuf;.}..
9e50: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
9e60: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
9e70: 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67   a quoted string
9e80: 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69   using SQL quoti
9e90: 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a  ng conventions..
9ea0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
9eb0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73  output_quoted_es
9ec0: 63 61 70 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a  caped_string().*
9ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
9ee0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
9ef0: 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ng(FILE *out, co
9f00: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
9f10: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b  int i;.  char c;
9f20: 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  .  setBinaryMode
9f30: 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28  (out, 1);.  for(
9f40: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
9f50: 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  =0 && c!='\''; i
9f60: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30  ++){}.  if( c==0
9f70: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
9f80: 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a  ntf(out,"'%s'",z
9f90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9fa0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9fb0: 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  "'");.    while(
9fc0: 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72   *z ){.      for
9fd0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
9fe0: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  !=0 && c!='\''; 
9ff0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
a000: 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a   c=='\'' ) i++;.
a010: 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20        if( i ){. 
a020: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a030: 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  tf(out, "%.*s", 
a040: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
a050: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
a060: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
a080: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
a090: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
a0a0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
a0b0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
a0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a0d0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
a0e0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
a0f0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
a100: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a110: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a120: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a130: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a140: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75   quoted string u
a150: 73 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67  sing SQL quoting
a160: 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a   conventions..**
a170: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c   Additionallly ,
a180: 20 65 73 63 61 70 65 20 74 68 65 20 22 5c 6e 22   escape the "\n"
a190: 20 61 6e 64 20 22 5c 72 22 20 63 68 61 72 61 63   and "\r" charac
a1a0: 74 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  ters so that the
a1b0: 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20  y do not.** get 
a1c0: 63 6f 72 72 75 70 74 65 64 20 62 79 20 65 6e 64  corrupted by end
a1d0: 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61  -of-line transla
a1e0: 74 69 6f 6e 20 66 61 63 69 6c 69 74 69 65 73 20  tion facilities 
a1f0: 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e  in some operatin
a200: 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a  g.** systems..**
a210: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c 69 6b 65  .** This is like
a220: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
a230: 74 72 69 6e 67 28 29 20 62 75 74 20 77 69 74 68  tring() but with
a240: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
a250: 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63   the \r\n.** esc
a260: 61 70 65 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a  ape mechanism..*
a270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
a280: 74 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61  tput_quoted_esca
a290: 70 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20  ped_string(FILE 
a2a0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
a2b0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
a2c0: 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69   char c;.  setBi
a2d0: 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29  naryMode(out, 1)
a2e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20  ;.  for(i=0; (c 
a2f0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
a300: 3d 27 5c 27 27 20 26 26 20 63 21 3d 27 5c 6e 27  ='\'' && c!='\n'
a310: 20 26 26 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b   && c!='\r'; i++
a320: 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  ){}.  if( c==0 )
a330: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
a340: 66 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b  f(out,"'%s'",z);
a350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
a360: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20  nst char *zNL = 
a370: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
a380: 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20  r *zCR = 0;.    
a390: 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20  int nNL = 0;.   
a3a0: 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20   int nCR = 0;.  
a3b0: 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30 5d    char zBuf1[20]
a3c0: 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20  , zBuf2[20];.   
a3d0: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
a3e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
a3f0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c  z[i]=='\n' ) nNL
a400: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ++;.      if( z[
a410: 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b  i]=='\r' ) nCR++
a420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a430: 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nNL ){.      raw
a440: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65  _printf(out, "re
a450: 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20  place(");.      
a460: 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zNL = unused_str
a470: 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c  ing(z, "\\n", "\
a480: 5c 30 31 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20  \012", zBuf1);. 
a490: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 52     }.    if( nCR
a4a0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a4b0: 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61  intf(out, "repla
a4c0: 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 43 52  ce(");.      zCR
a4d0: 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67   = unused_string
a4e0: 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31  (z, "\\r", "\\01
a4f0: 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20 20 20 20  5", zBuf2);.    
a500: 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
a510: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20  (out, "'");.    
a520: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
a530: 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
a540: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
a550: 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 20  '\n' && c!='\r' 
a560: 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29  && c!='\''; i++)
a570: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  {}.      if( c==
a580: 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20  '\'' ) i++;.    
a590: 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20    if( i ){.     
a5a0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
a5b0: 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a  ut, "%.*s", i, z
a5c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  );.        z += 
a5d0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
a5e0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a   if( c=='\'' ){.
a5f0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
a600: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
a610: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
a620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a630: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
a640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
a650: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
a660: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
a670: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
a680: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
a690: 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  NL);.        con
a6a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a6b0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a6c0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b  out, "%s", zCR);
a6d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
a6e0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a6f0: 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a  .    if( nCR ){.
a700: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
a710: 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61  (out, ",'%s',cha
a720: 72 28 31 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20  r(13))", zCR);. 
a730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c     }.    if( nNL
a740: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a750: 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27  intf(out, ",'%s'
a760: 2c 63 68 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c  ,char(10))", zNL
a770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a780: 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20  etTextMode(out, 
a790: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  1);.}../*.** Out
a7a0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
a7b0: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
a7c0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 43 20   according to C 
a7d0: 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e 67 20 72  or TCL quoting r
a7e0: 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ules..*/.static 
a7f0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 5f 73 74  void output_c_st
a800: 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ring(FILE *out, 
a810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a820: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63    unsigned int c
a830: 3b 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f  ;.  fputc('"', o
a840: 75 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63  ut);.  while( (c
a850: 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b   = *(z++))!=0 ){
a860: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27  .    if( c=='\\'
a870: 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28   ){.      fputc(
a880: 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  c, out);.      f
a890: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
a8a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
a8b0: 22 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  "' ){.      fput
a8c0: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a8d0: 20 20 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f      fputc('"', o
a8e0: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a8f0: 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20  f( c=='\t' ){.  
a900: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a910: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a920: 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('t', out);.   
a930: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
a940: 6e 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74  n' ){.      fput
a950: 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20  c('\\', out);.  
a960: 20 20 20 20 66 70 75 74 63 28 27 6e 27 2c 20 6f      fputc('n', o
a970: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a980: 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20  f( c=='\r' ){.  
a990: 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20      fputc('\\', 
a9a0: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
a9b0: 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20  c('r', out);.   
a9c0: 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 70 72   }else if( !ispr
a9d0: 69 6e 74 28 63 26 30 78 66 66 29 20 29 7b 0a 20  int(c&0xff) ){. 
a9e0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
a9f0: 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63  out, "\\%03o", c
aa00: 26 30 78 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73  &0xff);.    }els
aa10: 65 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63  e{.      fputc(c
aa20: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  , out);.    }.  
aa30: 7d 0a 20 20 66 70 75 74 63 28 27 22 27 2c 20 6f  }.  fputc('"', o
aa40: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  ut);.}../*.** Ou
aa50: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
aa60: 74 72 69 6e 67 20 77 69 74 68 20 63 68 61 72 61  tring with chara
aa70: 63 74 65 72 73 20 74 68 61 74 20 61 72 65 20 73  cters that are s
aa80: 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d  pecial to.** HTM
aa90: 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74  L escaped..*/.st
aaa0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
aab0: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c  _html_string(FIL
aac0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
aad0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
aae0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20  .  if( z==0 ) z 
aaf0: 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a  = "";.  while( *
ab00: 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  z ){.    for(i=0
ab10: 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20  ;   z[i].       
ab20: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c       && z[i]!='<
ab30: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab40: 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20 20 20 20   z[i]!='&'.     
ab50: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
ab60: 27 3e 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  '>'.            
ab70: 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20  && z[i]!='\"'.  
ab80: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
ab90: 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20 20 20 20  ]!='\'';.       
aba0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   i++){}.    if( 
abb0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  i>0 ){.      utf
abc0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e  8_printf(out,"%.
abd0: 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a  *s",i,z);.    }.
abe0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c      if( z[i]=='<
abf0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac00: 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22  rintf(out,"&lt;"
ac10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
ac20: 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20   z[i]=='&' ){.  
ac30: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
ac40: 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20  ut,"&amp;");.   
ac50: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
ac60: 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='>' ){.      ra
ac70: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 67  w_printf(out,"&g
ac80: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
ac90: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29  if( z[i]=='\"' )
aca0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
acb0: 74 66 28 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29  tf(out,"&quot;")
acc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
acd0: 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  z[i]=='\'' ){.  
ace0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
acf0: 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a 20 20 20  ut,"&#39;");.   
ad00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
ad10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  eak;.    }.    z
ad20: 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d   += i + 1;.  }.}
ad30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65  ../*.** If a fie
ad40: 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ld contains any 
ad50: 63 68 61 72 61 63 74 65 72 20 69 64 65 6e 74 69  character identi
ad60: 66 69 65 64 20 62 79 20 61 20 31 20 69 6e 20 74  fied by a 1 in t
ad70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
ad80: 61 72 72 61 79 2c 20 74 68 65 6e 20 74 68 65 20  array, then the 
ad90: 73 74 72 69 6e 67 20 6d 75 73 74 20 62 65 20 71  string must be q
ada0: 75 6f 74 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a  uoted for CSV..*
adb0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
adc0: 68 61 72 20 6e 65 65 64 43 73 76 51 75 6f 74 65  har needCsvQuote
add0: 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31  [] = {.  1, 1, 1
ade0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
adf0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
ae00: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
ae10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ae20: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
ae30: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
ae40: 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20   1, 0, 1, 0, 0, 
ae50: 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c  0, 0, 1,   0, 0,
ae60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae70: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
ae80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
ae90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aea0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
aeb0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
aec0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
aed0: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
aee0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aef0: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
af00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
af10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af20: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
af30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af40: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
af50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
af60: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af70: 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   0, 1,.  1, 1, 1
af80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af90: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
afa0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
afb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afc0: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
afd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
afe0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
aff0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
b000: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b010: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
b020: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
b030: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b040: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
b050: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b060: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
b070: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
b080: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b090: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
b0a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
b0b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0c0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
b0d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0e0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
b0f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
b100: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b110: 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   1, 1,.};../*.**
b120: 20 4f 75 74 70 75 74 20 61 20 73 69 6e 67 6c 65   Output a single
b130: 20 74 65 72 6d 20 6f 66 20 43 53 56 2e 20 20 41   term of CSV.  A
b140: 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53  ctually, p->colS
b150: 65 70 61 72 61 74 6f 72 20 69 73 20 75 73 65 64  eparator is used
b160: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 65 70 61   for.** the sepa
b170: 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79  rator, which may
b180: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
b190: 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c   comma.  p->null
b1a0: 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74 68 65 20  Value is.** the 
b1b0: 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20 53 74 72  null value.  Str
b1c0: 69 6e 67 73 20 61 72 65 20 71 75 6f 74 65 64 20  ings are quoted 
b1d0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
b1e0: 68 65 20 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20  he separator.** 
b1f0: 69 73 20 6f 6e 6c 79 20 69 73 73 75 65 64 20 69  is only issued i
b200: 66 20 62 53 65 70 20 69 73 20 74 72 75 65 2e 0a  f bSep is true..
b210: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
b220: 75 74 70 75 74 5f 63 73 76 28 53 68 65 6c 6c 53  utput_csv(ShellS
b230: 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
b240: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70  har *z, int bSep
b250: 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  ){.  FILE *out =
b260: 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a   p->out;.  if( z
b270: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
b280: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
b290: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
b2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
b2b0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 70 20  i;.    int nSep 
b2c0: 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f  = strlen30(p->co
b2d0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
b2e0: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
b2f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b300: 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 28 28 75  needCsvQuote[((u
b310: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 29  nsigned char*)z)
b320: 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c  [i]].         ||
b330: 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65   (z[i]==p->colSe
b340: 70 61 72 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20  parator[0] &&.  
b350: 20 20 20 20 20 20 20 20 20 20 20 28 6e 53 65 70             (nSep
b360: 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c  ==1 || memcmp(z,
b370: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b380: 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a  , nSep)==0)) ){.
b390: 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
b3a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b3b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b3c0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
b3d0: 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 64 20    char *zQuoted 
b3e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
b3f0: 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a  f("\"%w\"", z);.
b400: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
b410: 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 51 75  f(out, "%s", zQu
b420: 6f 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  oted);.      sql
b430: 69 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65  ite3_free(zQuote
b440: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
b450: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
b460: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  (out, "%s", z);.
b470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b480: 62 53 65 70 20 29 7b 0a 20 20 20 20 75 74 66 38  bSep ){.    utf8
b490: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b4a0: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
b4b0: 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rator);.  }.}../
b4c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b4d0: 65 20 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20  e runs when the 
b4e0: 75 73 65 72 20 70 72 65 73 73 65 73 20 43 74 72  user presses Ctr
b4f0: 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  l-C.*/.static vo
b500: 69 64 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e  id interrupt_han
b510: 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55 73 65 64  dler(int NotUsed
b520: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
b530: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
b540: 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 2b    seenInterrupt+
b550: 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e 49 6e 74  +;.  if( seenInt
b560: 65 72 72 75 70 74 3e 32 20 29 20 65 78 69 74 28  errupt>2 ) exit(
b570: 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c  1);.  if( global
b580: 44 62 20 29 20 73 71 6c 69 74 65 33 5f 69 6e 74  Db ) sqlite3_int
b590: 65 72 72 75 70 74 28 67 6c 6f 62 61 6c 44 62 29  errupt(globalDb)
b5a0: 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66 69 6e 65  ;.}..#if (define
b5b0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
b5c0: 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26 26 20  ined(WIN32)) && 
b5d0: 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f  !defined(_WIN32_
b5e0: 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  WCE)./*.** This 
b5f0: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 66 6f 72  routine runs for
b600: 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20   console events 
b610: 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e  (e.g. Ctrl-C) on
b620: 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63   Win32.*/.static
b630: 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e   BOOL WINAPI Con
b640: 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c 65 72 28  soleCtrlHandler(
b650: 0a 20 20 44 57 4f 52 44 20 64 77 43 74 72 6c 54  .  DWORD dwCtrlT
b660: 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ype /* One of th
b670: 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63  e CTRL_*_EVENT c
b680: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20  onstants */.){. 
b690: 20 69 66 28 20 64 77 43 74 72 6c 54 79 70 65 3d   if( dwCtrlType=
b6a0: 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b  =CTRL_C_EVENT ){
b6b0: 0a 20 20 20 20 69 6e 74 65 72 72 75 70 74 5f 68  .    interrupt_h
b6c0: 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20 20 20 72  andler(0);.    r
b6d0: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
b6e0: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
b6f0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b700: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b710: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  THORIZATION./*.*
b720: 2a 20 57 68 65 6e 20 74 68 65 20 22 2e 61 75 74  * When the ".aut
b730: 68 20 4f 4e 22 20 69 73 20 73 65 74 2c 20 74 68  h ON" is set, th
b740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68  e following auth
b750: 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20  orizer callback 
b760: 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20  is.** invoked.  
b770: 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
b780: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
b790: 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
b7a0: 41 75 74 68 28 0a 20 20 76 6f 69 64 20 2a 70 43  Auth(.  void *pC
b7b0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74  lientData,.  int
b7c0: 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   op,.  const cha
b7d0: 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20  r *zA1,.  const 
b7e0: 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e  char *zA2,.  con
b7f0: 73 74 20 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20  st char *zA3,.  
b800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 34 0a  const char *zA4.
b810: 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  ){.  ShellState 
b820: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
b830: 2a 29 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20  *)pClientData;. 
b840: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
b850: 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d  ar *azAction[] =
b860: 20 7b 20 30 2c 0a 20 20 20 20 20 22 43 52 45 41   { 0,.     "CREA
b870: 54 45 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20  TE_INDEX",      
b880: 20 20 20 22 43 52 45 41 54 45 5f 54 41 42 4c 45     "CREATE_TABLE
b890: 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41  ",         "CREA
b8a0: 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a  TE_TEMP_INDEX",.
b8b0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d       "CREATE_TEM
b8c0: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 22 43 52  P_TABLE",    "CR
b8d0: 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45  EATE_TEMP_TRIGGE
b8e0: 52 22 2c 20 20 22 43 52 45 41 54 45 5f 54 45 4d  R",  "CREATE_TEM
b8f0: 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22 43  P_VIEW",.     "C
b900: 52 45 41 54 45 5f 54 52 49 47 47 45 52 22 2c 20  REATE_TRIGGER", 
b910: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 49        "CREATE_VI
b920: 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 22 44  EW",          "D
b930: 45 4c 45 54 45 22 2c 0a 20 20 20 20 20 22 44 52  ELETE",.     "DR
b940: 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20 20 20 20  OP_INDEX",      
b950: 20 20 20 20 20 22 44 52 4f 50 5f 54 41 42 4c 45       "DROP_TABLE
b960: 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52  ",           "DR
b970: 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a  OP_TEMP_INDEX",.
b980: 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f       "DROP_TEMP_
b990: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 22 44 52  TABLE",      "DR
b9a0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22  OP_TEMP_TRIGGER"
b9b0: 2c 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f  ,    "DROP_TEMP_
b9c0: 56 49 45 57 22 2c 0a 20 20 20 20 20 22 44 52 4f  VIEW",.     "DRO
b9d0: 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20  P_TRIGGER",     
b9e0: 20 20 20 20 22 44 52 4f 50 5f 56 49 45 57 22 2c      "DROP_VIEW",
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
ba00: 45 52 54 22 2c 0a 20 20 20 20 20 22 50 52 41 47  ERT",.     "PRAG
ba10: 4d 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  MA",            
ba20: 20 20 20 22 52 45 41 44 22 2c 20 20 20 20 20 20     "READ",      
ba30: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
ba40: 43 54 22 2c 0a 20 20 20 20 20 22 54 52 41 4e 53  CT",.     "TRANS
ba50: 41 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20  ACTION",        
ba60: 20 20 22 55 50 44 41 54 45 22 2c 20 20 20 20 20    "UPDATE",     
ba70: 20 20 20 20 20 20 20 20 20 20 22 41 54 54 41 43            "ATTAC
ba80: 48 22 2c 0a 20 20 20 20 20 22 44 45 54 41 43 48  H",.     "DETACH
ba90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
baa0: 20 22 41 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20   "ALTER_TABLE", 
bab0: 20 20 20 20 20 20 20 20 20 22 52 45 49 4e 44 45           "REINDE
bac0: 58 22 2c 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a  X",.     "ANALYZ
bad0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
bae0: 20 22 43 52 45 41 54 45 5f 56 54 41 42 4c 45 22   "CREATE_VTABLE"
baf0: 2c 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56  ,        "DROP_V
bb00: 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 46 55  TABLE",.     "FU
bb10: 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20 20 20 20  NCTION",        
bb20: 20 20 20 20 20 22 53 41 56 45 50 4f 49 4e 54 22       "SAVEPOINT"
bb30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45  ,            "RE
bb40: 43 55 52 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20  CURSIVE".  };.  
bb50: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
bb60: 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a  har *az[4];.  az
bb70: 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b  [0] = zA1;.  az[
bb80: 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32  1] = zA2;.  az[2
bb90: 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d  ] = zA3;.  az[3]
bba0: 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70   = zA4;.  utf8_p
bbb0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61  rintf(p->out, "a
bbc0: 75 74 68 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20  uthorizer: %s", 
bbd0: 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20  azAction[op]);. 
bbe0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69   for(i=0; i<4; i
bbf0: 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  ++){.    raw_pri
bc00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29  ntf(p->out, " ")
bc10: 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b 69 5d 20  ;.    if( az[i] 
bc20: 29 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f  ){.      output_
bc30: 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
bc40: 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c   az[i]);.    }el
bc50: 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
bc60: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55  intf(p->out, "NU
bc70: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LL");.    }.  }.
bc80: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
bc90: 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65  out, "\n");.  re
bca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bcb0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
bcc0: 50 72 69 6e 74 20 61 20 73 63 68 65 6d 61 20 73  Print a schema s
bcd0: 74 61 74 65 6d 65 6e 74 2e 20 20 50 61 72 74 20  tatement.  Part 
bce0: 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64  of MODE_Semi and
bcf0: 20 4d 4f 44 45 5f 50 72 65 74 74 79 20 6f 75 74   MODE_Pretty out
bd00: 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  put..**.** This 
bd10: 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73  routine converts
bd20: 20 73 6f 6d 65 20 43 52 45 41 54 45 20 54 41 42   some CREATE TAB
bd30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  LE statements fo
bd40: 72 20 73 68 61 64 6f 77 20 74 61 62 6c 65 73 0a  r shadow tables.
bd50: 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f 35 20 69  ** in FTS3/4/5 i
bd60: 6e 74 6f 20 43 52 45 41 54 45 20 54 41 42 4c 45  nto CREATE TABLE
bd70: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73   IF NOT EXISTS s
bd80: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
bd90: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
bda0: 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a  chemaLine(FILE *
bdb0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
bdc0: 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *z, const char *
bdd0: 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28 20 7a 3d  zTail){.  if( z=
bde0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
bdf0: 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65  f( zTail==0 ) re
be00: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
be10: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45  te3_strglob("CRE
be20: 41 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a  ATE TABLE ['\"]*
be30: 22 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", z)==0 ){.    
be40: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
be50: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
be60: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25  F NOT EXISTS %s%
be70: 73 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29  s", z+13, zTail)
be80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
be90: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
bea0: 22 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c  "%s%s", z, zTail
beb0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
bec0: 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61  void printSchema
bed0: 4c 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c  LineN(FILE *out,
bee0: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
bef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
bf00: 69 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20  il){.  char c = 
bf10: 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30  z[n];.  z[n] = 0
bf20: 3b 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  ;.  printSchemaL
bf30: 69 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69  ine(out, z, zTai
bf40: 6c 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a  l);.  z[n] = c;.
bf50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bf60: 74 72 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a  true if string z
bf70: 5b 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62  [] has nothing b
bf80: 75 74 20 77 68 69 74 65 73 70 61 63 65 20 61 6e  ut whitespace an
bf90: 64 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68  d comments to th
bfa0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
bfb0: 66 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73  first line..*/.s
bfc0: 74 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f  tatic int wsToEo
bfd0: 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  l(const char *z)
bfe0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
bff0: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
c000: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
c010: 27 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b  '\n' ) return 1;
c020: 0a 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65  .    if( IsSpace
c030: 28 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75  (z[i]) ) continu
c040: 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  e;.    if( z[i]=
c050: 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d  ='-' && z[i+1]==
c060: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  '-' ) return 1;.
c070: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
c090: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
c0a0: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 45 58   entry to the EX
c0b0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
c0c0: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
c0d0: 76 6f 69 64 20 65 71 70 5f 61 70 70 65 6e 64 28  void eqp_append(
c0e0: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69  ShellState *p, i
c0f0: 6e 74 20 69 45 71 70 49 64 2c 20 69 6e 74 20 70  nt iEqpId, int p
c100: 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  2, const char *z
c110: 54 65 78 74 29 7b 0a 20 20 45 51 50 47 72 61 70  Text){.  EQPGrap
c120: 68 52 6f 77 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  hRow *pNew;.  in
c130: 74 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e  t nText = strlen
c140: 33 30 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28  30(zText);.  if(
c150: 20 70 2d 3e 61 75 74 6f 45 51 50 74 65 73 74 20   p->autoEQPtest 
c160: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
c170: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 2c 25  tf(p->out, "%d,%
c180: 64 2c 25 73 5c 6e 22 2c 20 69 45 71 70 49 64 2c  d,%s\n", iEqpId,
c190: 20 70 32 2c 20 7a 54 65 78 74 29 3b 0a 20 20 7d   p2, zText);.  }
c1a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
c1b0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
c1c0: 6f 66 28 2a 70 4e 65 77 29 20 2b 20 6e 54 65 78  of(*pNew) + nTex
c1d0: 74 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  t );.  if( pNew=
c1e0: 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
c1f0: 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 70 4e  f_memory();.  pN
c200: 65 77 2d 3e 69 45 71 70 49 64 20 3d 20 69 45 71  ew->iEqpId = iEq
c210: 70 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 50 61  pId;.  pNew->iPa
c220: 72 65 6e 74 49 64 20 3d 20 70 32 3b 0a 20 20 6d  rentId = p2;.  m
c230: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54 65 78  emcpy(pNew->zTex
c240: 74 2c 20 7a 54 65 78 74 2c 20 6e 54 65 78 74 2b  t, zText, nText+
c250: 31 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  1);.  pNew->pNex
c260: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
c270: 73 47 72 61 70 68 2e 70 4c 61 73 74 20 29 7b 0a  sGraph.pLast ){.
c280: 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c      p->sGraph.pL
c290: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ast->pNext = pNe
c2a0: 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  w;.  }else{.    
c2b0: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d  p->sGraph.pRow =
c2c0: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e   pNew;.  }.  p->
c2d0: 73 47 72 61 70 68 2e 70 4c 61 73 74 20 3d 20 70  sGraph.pLast = p
c2e0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
c2f0: 65 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ee and reset the
c300: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c310: 4c 41 4e 20 64 61 74 61 20 74 68 61 74 20 68 61  LAN data that ha
c320: 73 20 62 65 65 6e 20 63 6f 6c 6c 65 63 74 65 64  s been collected
c330: 0a 2a 2a 20 69 6e 20 70 2d 3e 73 47 72 61 70 68  .** in p->sGraph
c340: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c350: 20 65 71 70 5f 72 65 73 65 74 28 53 68 65 6c 6c   eqp_reset(Shell
c360: 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50  State *p){.  EQP
c370: 47 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20  GraphRow *pRow, 
c380: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 52  *pNext;.  for(pR
c390: 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68 2e 70  ow = p->sGraph.p
c3a0: 52 6f 77 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20  Row; pRow; pRow 
c3b0: 3d 20 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  = pNext){.    pN
c3c0: 65 78 74 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78  ext = pRow->pNex
c3d0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  t;.    sqlite3_f
c3e0: 72 65 65 28 70 52 6f 77 29 3b 0a 20 20 7d 0a 20  ree(pRow);.  }. 
c3f0: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 73 47 72 61   memset(&p->sGra
c400: 70 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ph, 0, sizeof(p-
c410: 3e 73 47 72 61 70 68 29 29 3b 0a 7d 0a 0a 2f 2a  >sGraph));.}../*
c420: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   Return the next
c430: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c440: 4c 41 4e 20 6c 69 6e 65 20 77 69 74 68 20 69 45  LAN line with iE
c450: 71 70 49 64 20 74 68 61 74 20 6f 63 63 75 72 73  qpId that occurs
c460: 20 61 66 74 65 72 0a 2a 2a 20 70 4f 6c 64 2c 20   after.** pOld, 
c470: 6f 72 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  or return the fi
c480: 72 73 74 20 73 75 63 68 20 6c 69 6e 65 20 69 66  rst such line if
c490: 20 70 4f 6c 64 20 69 73 20 4e 55 4c 4c 0a 2a 2f   pOld is NULL.*/
c4a0: 0a 73 74 61 74 69 63 20 45 51 50 47 72 61 70 68  .static EQPGraph
c4b0: 52 6f 77 20 2a 65 71 70 5f 6e 65 78 74 5f 72 6f  Row *eqp_next_ro
c4c0: 77 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  w(ShellState *p,
c4d0: 20 69 6e 74 20 69 45 71 70 49 64 2c 20 45 51 50   int iEqpId, EQP
c4e0: 47 72 61 70 68 52 6f 77 20 2a 70 4f 6c 64 29 7b  GraphRow *pOld){
c4f0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c500: 70 52 6f 77 20 3d 20 70 4f 6c 64 20 3f 20 70 4f  pRow = pOld ? pO
c510: 6c 64 2d 3e 70 4e 65 78 74 20 3a 20 70 2d 3e 73  ld->pNext : p->s
c520: 47 72 61 70 68 2e 70 52 6f 77 3b 0a 20 20 77 68  Graph.pRow;.  wh
c530: 69 6c 65 28 20 70 52 6f 77 20 26 26 20 70 52 6f  ile( pRow && pRo
c540: 77 2d 3e 69 50 61 72 65 6e 74 49 64 21 3d 69 45  w->iParentId!=iE
c550: 71 70 49 64 20 29 20 70 52 6f 77 20 3d 20 70 52  qpId ) pRow = pR
c560: 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74  ow->pNext;.  ret
c570: 75 72 6e 20 70 52 6f 77 3b 0a 7d 0a 0a 2f 2a 20  urn pRow;.}../* 
c580: 52 65 6e 64 65 72 20 61 20 73 69 6e 67 6c 65 20  Render a single 
c590: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 67 72 61  level of the gra
c5a0: 70 68 20 74 68 61 74 20 68 61 73 20 69 45 71 70  ph that has iEqp
c5b0: 49 64 20 61 73 20 69 74 73 20 70 61 72 65 6e 74  Id as its parent
c5c0: 2e 20 20 43 61 6c 6c 65 64 0a 2a 2a 20 72 65 63  .  Called.** rec
c5d0: 75 72 73 69 76 65 6c 79 20 74 6f 20 72 65 6e 64  ursively to rend
c5e0: 65 72 20 73 75 62 6c 65 76 65 6c 73 2e 0a 2a 2f  er sublevels..*/
c5f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70  .static void eqp
c600: 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 53 68  _render_level(Sh
c610: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
c620: 20 69 45 71 70 49 64 29 7b 0a 20 20 45 51 50 47   iEqpId){.  EQPG
c630: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 2c 20 2a  raphRow *pRow, *
c640: 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6e 20 3d  pNext;.  int n =
c650: 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 73 47 72   strlen30(p->sGr
c660: 61 70 68 2e 7a 50 72 65 66 69 78 29 3b 0a 20 20  aph.zPrefix);.  
c670: 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 70  char *z;.  for(p
c680: 52 6f 77 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72  Row = eqp_next_r
c690: 6f 77 28 70 2c 20 69 45 71 70 49 64 2c 20 30 29  ow(p, iEqpId, 0)
c6a0: 3b 20 70 52 6f 77 3b 20 70 52 6f 77 20 3d 20 70  ; pRow; pRow = p
c6b0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
c6c0: 20 3d 20 65 71 70 5f 6e 65 78 74 5f 72 6f 77 28   = eqp_next_row(
c6d0: 70 2c 20 69 45 71 70 49 64 2c 20 70 52 6f 77 29  p, iEqpId, pRow)
c6e0: 3b 0a 20 20 20 20 7a 20 3d 20 70 52 6f 77 2d 3e  ;.    z = pRow->
c6f0: 7a 54 65 78 74 3b 0a 20 20 20 20 75 74 66 38 5f  zText;.    utf8_
c700: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c710: 25 73 25 73 25 73 5c 6e 22 2c 20 70 2d 3e 73 47  %s%s%s\n", p->sG
c720: 72 61 70 68 2e 7a 50 72 65 66 69 78 2c 20 70 4e  raph.zPrefix, pN
c730: 65 78 74 20 3f 20 22 7c 2d 2d 22 20 3a 20 22 60  ext ? "|--" : "`
c740: 2d 2d 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28  --", z);.    if(
c750: 20 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   n<(int)sizeof(p
c760: 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78  ->sGraph.zPrefix
c770: 29 2d 37 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-7 ){.      mem
c780: 63 70 79 28 26 70 2d 3e 73 47 72 61 70 68 2e 7a  cpy(&p->sGraph.z
c790: 50 72 65 66 69 78 5b 6e 5d 2c 20 70 4e 65 78 74  Prefix[n], pNext
c7a0: 20 3f 20 22 7c 20 20 22 20 3a 20 22 20 20 20 22   ? "|  " : "   "
c7b0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  , 4);.      eqp_
c7c0: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c7d0: 70 52 6f 77 2d 3e 69 45 71 70 49 64 29 3b 0a 20  pRow->iEqpId);. 
c7e0: 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e 7a       p->sGraph.z
c7f0: 50 72 65 66 69 78 5b 6e 5d 20 3d 20 30 3b 0a 20  Prefix[n] = 0;. 
c800: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c810: 2a 20 44 69 73 70 6c 61 79 20 61 6e 64 20 72 65  * Display and re
c820: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c830: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a  QUERY PLAN data.
c840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c850: 71 70 5f 72 65 6e 64 65 72 28 53 68 65 6c 6c 53  qp_render(ShellS
c860: 74 61 74 65 20 2a 70 29 7b 0a 20 20 45 51 50 47  tate *p){.  EQPG
c870: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c880: 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 0a  p->sGraph.pRow;.
c890: 20 20 69 66 28 20 70 52 6f 77 20 29 7b 0a 20 20    if( pRow ){.  
c8a0: 20 20 69 66 28 20 70 52 6f 77 2d 3e 7a 54 65 78    if( pRow->zTex
c8b0: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  t[0]=='-' ){.   
c8c0: 20 20 20 69 66 28 20 70 52 6f 77 2d 3e 70 4e 65     if( pRow->pNe
c8d0: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  xt==0 ){.       
c8e0: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
c8f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c910: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c920: 20 22 25 73 5c 6e 22 2c 20 70 52 6f 77 2d 3e 7a   "%s\n", pRow->z
c930: 54 65 78 74 2b 33 29 3b 0a 20 20 20 20 20 20 70  Text+3);.      p
c940: 2d 3e 73 47 72 61 70 68 2e 70 52 6f 77 20 3d 20  ->sGraph.pRow = 
c950: 70 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pRow->pNext;.   
c960: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c970: 70 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRow);.    }else
c980: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
c990: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 51 55 45  ntf(p->out, "QUE
c9a0: 52 59 20 50 4c 41 4e 5c 6e 22 29 3b 0a 20 20 20  RY PLAN\n");.   
c9b0: 20 7d 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68   }.    p->sGraph
c9c0: 2e 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 30 3b  .zPrefix[0] = 0;
c9d0: 0a 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f  .    eqp_render_
c9e0: 6c 65 76 65 6c 28 70 2c 20 30 29 3b 0a 20 20 20  level(p, 0);.   
c9f0: 20 65 71 70 5f 72 65 73 65 74 28 70 29 3b 0a 20   eqp_reset(p);. 
ca00: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
ca10: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
ca20: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
ca30: 2a 20 50 72 6f 67 72 65 73 73 20 68 61 6e 64 6c  * Progress handl
ca40: 65 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  er callback..*/.
ca50: 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67 72  static int progr
ca60: 65 73 73 5f 68 61 6e 64 6c 65 72 28 76 6f 69 64  ess_handler(void
ca70: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 29 20 7b   *pClientData) {
ca80: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
ca90: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
caa0: 70 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 70  pClientData;.  p
cab0: 2d 3e 6e 50 72 6f 67 72 65 73 73 2b 2b 3b 0a 20  ->nProgress++;. 
cac0: 20 69 66 28 20 70 2d 3e 6e 50 72 6f 67 72 65 73   if( p->nProgres
cad0: 73 3e 3d 70 2d 3e 6d 78 50 72 6f 67 72 65 73 73  s>=p->mxProgress
cae0: 20 26 26 20 70 2d 3e 6d 78 50 72 6f 67 72 65 73   && p->mxProgres
caf0: 73 3e 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  s>0 ){.    raw_p
cb00: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
cb10: 72 6f 67 72 65 73 73 20 6c 69 6d 69 74 20 72 65  rogress limit re
cb20: 61 63 68 65 64 20 28 25 75 29 5c 6e 22 2c 20 70  ached (%u)\n", p
cb30: 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20 20  ->nProgress);.  
cb40: 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72 6f 67    if( p->flgProg
cb50: 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f  ress & SHELL_PRO
cb60: 47 52 45 53 53 5f 52 45 53 45 54 20 29 20 70 2d  GRESS_RESET ) p-
cb70: 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >nProgress = 0;.
cb80: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 67 50 72      if( p->flgPr
cb90: 6f 67 72 65 73 73 20 26 20 53 48 45 4c 4c 5f 50  ogress & SHELL_P
cba0: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 29 20 70  ROGRESS_ONCE ) p
cbb0: 2d 3e 6d 78 50 72 6f 67 72 65 73 73 20 3d 20 30  ->mxProgress = 0
cbc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
cbd0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c    }.  if( (p->fl
cbe0: 67 50 72 6f 67 72 65 73 73 20 26 20 53 48 45 4c  gProgress & SHEL
cbf0: 4c 5f 50 52 4f 47 52 45 53 53 5f 51 55 49 45 54  L_PROGRESS_QUIET
cc00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  )==0 ){.    raw_
cc10: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cc20: 50 72 6f 67 72 65 73 73 20 25 75 5c 6e 22 2c 20  Progress %u\n", 
cc30: 70 2d 3e 6e 50 72 6f 67 72 65 73 73 29 3b 0a 20  p->nProgress);. 
cc40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cc50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cc60: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
cc70: 43 41 4c 4c 42 41 43 4b 20 2a 2f 0a 0a 2f 2a 0a  CALLBACK */../*.
cc80: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
cc90: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
cca0: 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a  that the shell.*
ccb0: 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61  * invokes for ea
ccc0: 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72  ch row of a quer
ccd0: 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  y result..*/.sta
cce0: 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61  tic int shell_ca
ccf0: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
cd00: 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67  pArg,.  int nArg
cd10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
cd20: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
cd30: 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  umns */.  char *
cd40: 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65  *azArg,    /* Te
cd50: 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c  xt of each resul
cd60: 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  t column */.  ch
cd70: 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f  ar **azCol,    /
cd80: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  * Column names *
cd90: 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20  /.  int *aiType 
cda0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
cdb0: 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ypes */.){.  int
cdc0: 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   i;.  ShellState
cdd0: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
cde0: 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20  e*)pArg;..  if( 
cdf0: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
ce00: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
ce10: 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63  ->cMode ){.    c
ce20: 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b  ase MODE_Line: {
ce30: 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35  .      int w = 5
ce40: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  ;.      if( azAr
ce50: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
ce60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
ce70: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
ce80: 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
ce90: 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f  len30(azCol[i] ?
cea0: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
ceb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
cec0: 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20  >w ) w = len;.  
ced0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cee0: 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66  p->cnt++>0 ) utf
cef0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
cf00: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
cf10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66  arator);.      f
cf20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
cf30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74  i++){.        ut
cf40: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cf50: 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77  ,"%*s = %s%s", w
cf60: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20  , azCol[i],.    
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
cf80: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
cf90: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20  : p->nullValue, 
cfa0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
cfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cfc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cfd0: 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61   case MODE_Expla
cfe0: 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44  in:.    case MOD
cff0: 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20  E_Column: {.    
d000: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
d010: 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68  nt aExplainWidth
d020: 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c  s[] = {4, 13, 4,
d030: 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33   4, 4, 13, 2, 13
d040: 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  };.      const i
d050: 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20  nt *colWidth;.  
d060: 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b      int showHdr;
d070: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77  .      char *row
d080: 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Sep;.      if( p
d090: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f  ->cMode==MODE_Co
d0a0: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
d0b0: 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f  colWidth = p->co
d0c0: 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20  lWidth;.        
d0d0: 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f  showHdr = p->sho
d0e0: 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20  wHeader;.       
d0f0: 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77   rowSep = p->row
d100: 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20  Separator;.     
d110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d120: 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c  colWidth = aExpl
d130: 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20  ainWidths;.     
d140: 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a     showHdr = 1;.
d150: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d160: 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20   SEP_Row;.      
d170: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  }.      if( p->c
d180: 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt++==0 ){.     
d190: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
d1a0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
d1b0: 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20      int w, n;.  
d1c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
d1d0: 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69  raySize(p->colWi
d1e0: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d1f0: 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68      w = colWidth
d200: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  [i];.          }
d210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d220: 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    w = 0;.       
d230: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d240: 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( w==0 ){.     
d250: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d260: 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f  nChar(azCol[i] ?
d270: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
d280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
d290: 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a   w<10 ) w = 10;.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
d2b0: 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67  strlenChar(azArg
d2c0: 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61   && azArg[i] ? a
d2d0: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
d2e0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
d2f0: 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77       if( w<n ) w
d300: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   = n;.          
d310: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
d320: 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61  i<ArraySize(p->a
d330: 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20  ctualWidth) ){. 
d340: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63             p->ac
d350: 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77  tualWidth[i] = w
d360: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d370: 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77          if( show
d380: 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Hdr ){.         
d390: 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72     utf8_width_pr
d3a0: 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61  int(p->out, w, a
d3b0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
d3c0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d3d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d3e0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d3f0: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d410: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68  }.        if( sh
d420: 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20  owHdr ){.       
d430: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
d440: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
d450: 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20        int w;.   
d460: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
d470: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
d480: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
d490: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70             w = p
d4a0: 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d  ->actualWidth[i]
d4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d4c0: 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d   if( w<0 ) w = -
d4d0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  w;.            }
d4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d4f0: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
d500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d510: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d520: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a  tf(p->out,"%-*.*
d530: 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20  s%s",w,w,.      
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
d550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d580: 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20  --------".      
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
d5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20  --------",.     
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d5f0: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
d600: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
d610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
d620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d630: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
d640: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
d650: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d660: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b  {.        int w;
d670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41  .        if( i<A
d680: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
d690: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
d6a0: 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63         w = p->ac
d6b0: 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20  tualWidth[i];.  
d6c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d6d0: 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a          w = 10;.
d6e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d6f0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d700: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20  MODE_Explain && 
d710: 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c  azArg[i] && strl
d720: 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29  enChar(azArg[i])
d730: 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >w ){.          
d740: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
d750: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
d760: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d770: 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64  i==1 && p->aiInd
d780: 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  ent && p->pStmt 
d790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
d7a0: 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e   p->iIndent<p->n
d7b0: 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Indent ){.      
d7c0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d7d0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22  f(p->out, "%*.s"
d7e0: 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d  , p->aiIndent[p-
d7f0: 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a  >iIndent], "");.
d800: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d810: 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74        p->iIndent
d820: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
d830: 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68        utf8_width
d840: 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77  _print(p->out, w
d850: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
d860: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
d870: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75  alue);.        u
d880: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d890: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
d8a0: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
d8b0: 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ");.      }.   
d8c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d8d0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65      case MODE_Se
d8e0: 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65  mi: {   /* .sche
d8f0: 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65  ma and .fullsche
d900: 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  ma output */.   
d910: 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69     printSchemaLi
d920: 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ne(p->out, azArg
d930: 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  [0], ";\n");.   
d940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d950: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72      case MODE_Pr
d960: 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68  etty: {  /* .sch
d970: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
d980: 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e  ema with --inden
d990: 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  t */.      char 
d9a0: 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *z;.      int j;
d9b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65  .      int nPare
d9c0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61  n = 0;.      cha
d9d0: 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  r cEnd = 0;.    
d9e0: 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20    char c;.      
d9f0: 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20  int nLine = 0;. 
da00: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
da10: 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  g==1 );.      if
da20: 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20  ( azArg[0]==0 ) 
da30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
da40: 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
da50: 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22 2c  ("CREATE VIEW%",
da60: 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30   azArg[0], 0)==0
da70: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
da80: 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41  e3_strlike("CREA
da90: 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67  TE TRIG%", azArg
daa0: 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  [0], 0)==0.     
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
dac0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
dad0: 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30  "%s;\n", azArg[0
dae0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ]);.        brea
daf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
db00: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
db10: 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67  intf("%s", azArg
db20: 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  [0]);.      j = 
db30: 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  0;.      for(i=0
db40: 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b  ; IsSpace(z[i]);
db50: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f   i++){}.      fo
db60: 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  r(; (c = z[i])!=
db70: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
db80: 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20   if( IsSpace(c) 
db90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
dba0: 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20   z[j-1]=='\r' ) 
dbb0: 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20  z[j-1] = '\n';. 
dbc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53           if( IsS
dbd0: 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20  pace(z[j-1]) || 
dbe0: 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f  z[j-1]=='(' ) co
dbf0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
dc00: 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28  }else if( (c=='(
dc10: 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20  ' || c==')') && 
dc20: 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a  j>0 && IsSpace(z
dc30: 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  [j-1]) ){.      
dc40: 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
dc50: 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b   }.        z[j++
dc60: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
dc70: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
dc80: 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31  && IsSpace(z[j-1
dc90: 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  ]) ){ j--; }.   
dca0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
dcb0: 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28     if( strlen30(
dcc0: 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20  z)>=79 ){.      
dcd0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
dce0: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
dcf0: 7b 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67  {  /* Copy chang
dd00: 65 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63  es from z[i] bac
dd10: 6b 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20  k to z[j] */.   
dd20: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45         if( c==cE
dd30: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
dd40: 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20    cEnd = 0;.    
dd50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd60: 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27  c=='"' || c=='\'
dd70: 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20  ' || c=='`' ){. 
dd80: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dd90: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = c;.          }
dda0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
ddb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
ddc0: 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20  End = ']';.     
ddd0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
dde0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d  =='-' && z[i+1]=
ddf0: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
de00: 20 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b      cEnd = '\n';
de10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
de20: 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20   if( c=='(' ){. 
de30: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
de40: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
de50: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20  else if( c==')' 
de60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
de70: 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  Paren--;.       
de80: 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30       if( nLine>0
de90: 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26   && nParen==0 &&
dea0: 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j>0 ){.        
deb0: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
dec0: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
ded0: 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  , j, "\n");.    
dee0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
def0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
df00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
df10: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b       z[j++] = c;
df20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
df30: 50 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64  Paren==1 && cEnd
df40: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
df50: 26 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d  & (c=='(' || c==
df60: 27 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20  '\n' || (c==',' 
df70: 26 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b  && !wsToEol(z+i+
df80: 31 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  1))).          )
df90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
dfa0: 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b  ( c=='\n' ) j--;
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
dfc0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
dfd0: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20  >out, z, j, "\n 
dfe0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
dff0: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
e000: 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20      nLine++;.   
e010: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
e020: 49 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20  IsSpace(z[i+1]) 
e030: 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ i++; }.      
e040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e050: 20 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30          z[j] = 0
e060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e070: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
e080: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22  p->out, z, ";\n"
e090: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e0a0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
e0b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e0c0: 20 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a   case MODE_List:
e0d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e0e0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e0f0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e100: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e110: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e120: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e130: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c  f(p->out,"%s%s",
e140: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
e150: 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e              i==n
e160: 41 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65  Arg-1 ? p->rowSe
e170: 70 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c  parator : p->col
e180: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e190: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e1a0: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
e1b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
e1c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e1d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
e1e0: 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69  har *z = azArg[i
e1f0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
e200: 3d 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c  ==0 ) z = p->nul
e210: 6c 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  lValue;.        
e220: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e230: 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20  ut, "%s", z);.  
e240: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67        if( i<nArg
e250: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
e260: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e270: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
e280: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e2a0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e2b0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
e2c0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
e2d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e2e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e2f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e300: 4f 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20  ODE_Html: {.    
e310: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e320: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e330: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  er ){.        ra
e340: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e350: 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TR>");.       
e360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
e370: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
e380: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
e390: 6f 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20  out,"<TH>");.   
e3a0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74         output_ht
e3b0: 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ml_string(p->out
e3c0: 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20  , azCol[i]);.   
e3d0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e3e0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c  f(p->out,"</TH>\
e3f0: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n");.        }. 
e400: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e410: 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c  f(p->out,"</TR>\
e420: 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
e430: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e440: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72  ) break;.      r
e450: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e460: 2c 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TR>");.      
e470: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
e480: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
e490: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e4a0: 2c 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20  ,"<TD>");.      
e4b0: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
e4c0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
e4d0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
e4e0: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
e4f0: 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
e500: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54  intf(p->out,"</T
e510: 44 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  D>\n");.      }.
e520: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e530: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
e540: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
e550: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e560: 4d 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20  MODE_Tcl: {.    
e570: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e580: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e590: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e5a0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e5b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
e5c0: 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
e5d0: 2d 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f  ->out,azCol[i] ?
e5e0: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
e5f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 69 3c  .          if(i<
e600: 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69  nArg-1) utf8_pri
e610: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e620: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
e630: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e640: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e650: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e660: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
e670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e680: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
e690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
e6a0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e6b0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  ){.        outpu
e6c0: 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
e6d0: 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  t, azArg[i] ? az
e6e0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
e6f0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
e700: 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66  if(i<nArg-1) utf
e710: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e720: 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70   "%s", p->colSep
e730: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e740: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
e750: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e760: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e770: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e780: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e790: 4f 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20  ODE_Csv: {.     
e7a0: 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70   setBinaryMode(p
e7b0: 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
e7c0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e7d0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e7e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
e7f0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e800: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
e810: 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f  tput_csv(p, azCo
e820: 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20  l[i] ? azCol[i] 
e830: 3a 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b  : "", i<nArg-1);
e840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e850: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e860: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e870: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
e880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e890: 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20   nArg>0 ){.     
e8a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e8b0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e8c0: 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70      output_csv(p
e8d0: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41  , azArg[i], i<nA
e8e0: 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  rg-1);.        }
e8f0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e900: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e910: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
e920: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
e930: 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
e940: 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
e950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e960: 20 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65    case MODE_Inse
e970: 72 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  rt: {.      if( 
e980: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e990: 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
e9a0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45  ntf(p->out,"INSE
e9b0: 52 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a  RT INTO %s",p->z
e9c0: 44 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  DestTable);.    
e9d0: 20 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61    if( p->showHea
e9e0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  der ){.        r
e9f0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ea00: 2c 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66  ,"(");.        f
ea10: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ea20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
ea30: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
ea40: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
ea50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
ea60: 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c   quoteChar(azCol
ea70: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
ea80: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
ea90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
eaa0: 22 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d  "%w\"", azCol[i]
eab0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
eac0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
ead0: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
eae0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eaf0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  _free(z);.      
eb00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eb10: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
eb20: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
eb30: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
eb40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
eb50: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
eb60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b  ntf(p->out,")");
eb70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
eb80: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66  ->cnt++;.      f
eb90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
eba0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61  i++){.        ra
ebb0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ebc0: 20 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56   i>0 ? "," : " V
ebd0: 41 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20  ALUES(");.      
ebe0: 20 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d    if( (azArg[i]=
ebf0: 3d 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26  =0) || (aiType &
ec00: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
ec10: 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ITE_NULL) ){.   
ec20: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ec30: 74 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22  tf(p->out,"NULL"
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ec50: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
ec60: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
ec70: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  _TEXT ){.       
ec80: 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46     if( ShellHasF
ec90: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
eca0: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
ecb0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
ecc0: 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  ted_string(p->ou
ecd0: 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  t, azArg[i]);.  
ece0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75             outpu
ed00: 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64  t_quoted_escaped
ed10: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
ed20: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
ed40: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
ed50: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
ed60: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
ed70: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
ed80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
ed90: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
eda0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
edb0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
edc0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
edd0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
ede0: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
edf0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
ee00: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
ee10: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
ee20: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
ee30: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 72 3b  lite3_uint64 ur;
ee40: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
ee50: 79 28 26 75 72 2c 26 72 2c 73 69 7a 65 6f 66 28  y(&ur,&r,sizeof(
ee60: 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  r));.          i
ee70: 66 28 20 75 72 3d 3d 30 78 37 66 66 30 30 30 30  f( ur==0x7ff0000
ee80: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
ee90: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
eea0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 31  rintf(p->out, "1
eeb0: 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20 20  e999");.        
eec0: 20 20 7d 65 6c 73 65 20 69 66 28 20 75 72 3d 3d    }else if( ur==
eed0: 30 78 66 66 66 30 30 30 30 30 30 30 30 30 30 30  0xfff00000000000
eee0: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
eef0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ef00: 2d 3e 6f 75 74 2c 20 22 2d 31 65 39 39 39 22 29  ->out, "-1e999")
ef10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
ef20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
ef30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ef40: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
ef50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
ef60: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
ef70: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
ef80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ef90: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
efa0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
efb0: 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d  QLITE_BLOB && p-
efc0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
efd0: 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
efe0: 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
eff0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70  column_blob(p->p
f000: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
f010: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20      int nBlob = 
f020: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f030: 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69  ytes(p->pStmt, i
f040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
f050: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e  put_hex_blob(p->
f060: 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  out, pBlob, nBlo
f070: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
f080: 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61  e if( isNumber(a
f090: 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20  zArg[i], 0) ){. 
f0a0: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
f0b0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
f0c0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f0d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
f0e0: 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
f0f0: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29  HFLG_Newlines) )
f100: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
f110: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
f120: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f130: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f140: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
f150: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
f160: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f170: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f190: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f1a0: 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a  p->out,");\n");.
f1b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f1c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
f1d0: 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20  _Quote: {.      
f1e0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
f1f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
f200: 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e  p->cnt==0 && p->
f210: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
f220: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f230: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f240: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f250: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f260: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
f270: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f280: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
f290: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
f2a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
f2b0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f2c0: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
f2d0: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
f2e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f2f0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
f300: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61      if( i>0 ) ra
f310: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f320: 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69   ",");.        i
f330: 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29  f( (azArg[i]==0)
f340: 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61   || (aiType && a
f350: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f360: 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
f370: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f380: 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a  p->out,"NULL");.
f390: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f3a0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
f3b0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45  pe[i]==SQLITE_TE
f3c0: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
f3d0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
f3e0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
f3f0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f400: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
f410: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f420: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
f430: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f440: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f450: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
f460: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f470: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f480: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
f490: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
f4a0: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
f4b0: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
f4c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f4d0: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
f4e0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
f4f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f500: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
f510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
f520: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f530: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
f540: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
f550: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f560: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
f570: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
f580: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
f590: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
f5a0: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
f5b0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f5c0: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
f5d0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
f5e0: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
f5f0: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
f600: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
f610: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
f620: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
f630: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
f640: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
f650: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f660: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
f670: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
f680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f690: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
f6a0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
f6b0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
f6c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f6d0: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
f6e0: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
f6f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f700: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
f710: 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20  E_Ascii: {.     
f720: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
f730: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f740: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f750: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f760: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f770: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
f780: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f790: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
f7a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  r);.          ut
f7b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f7c0: 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f  ,"%s",azCol[i] ?
f7d0: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
f7e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f7f0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f800: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
f810: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
f820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f830: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
f840: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
f850: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
f860: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
f870: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
f880: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
f890: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
f8a0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
f8b0: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
f8c0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
f8d0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
f8e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f8f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f900: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
f910: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
f920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f930: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 51      case MODE_EQ
f940: 50 3a 20 7b 0a 20 20 20 20 20 20 65 71 70 5f 61  P: {.      eqp_a
f950: 70 70 65 6e 64 28 70 2c 20 61 74 6f 69 28 61 7a  ppend(p, atoi(az
f960: 41 72 67 5b 30 5d 29 2c 20 61 74 6f 69 28 61 7a  Arg[0]), atoi(az
f970: 41 72 67 5b 31 5d 29 2c 20 61 7a 41 72 67 5b 33  Arg[1]), azArg[3
f980: 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ]);.      break;
f990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f9a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
f9b0: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
f9c0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61  back routine tha
f9d0: 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  t the SQLite lib
f9e0: 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20  rary.** invokes 
f9f0: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20  for each row of 
fa00: 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e 0a  a query result..
fa10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
fa20: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72  llback(void *pAr
fa30: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61  g, int nArg, cha
fa40: 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20  r **azArg, char 
fa50: 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20 73  **azCol){.  /* s
fa60: 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68 61  ince we don't ha
fa70: 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63 61  ve type info, ca
fa80: 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61 6c  ll the shell_cal
fa90: 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55 4c  lback with a NUL
faa0: 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65 74  L value */.  ret
fab0: 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  urn shell_callba
fac0: 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20 61  ck(pArg, nArg, a
fad0: 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55 4c  zArg, azCol, NUL
fae0: 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  L);.}../*.** Thi
faf0: 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63  s is the callbac
fb00: 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 73  k routine from s
fb10: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74 68  qlite3_exec() th
fb20: 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a 2a  at appends all.*
fb30: 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74 68  * output onto th
fb40: 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c 6c  e end of a Shell
fb50: 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Text object..*/.
fb60: 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74 75  static int captu
fb70: 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b  reOutputCallback
fb80: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
fb90: 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
fba0: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29 7b  Arg, char **az){
fbb0: 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70 20  .  ShellText *p 
fbc0: 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70 41  = (ShellText*)pA
fbd0: 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55  rg;.  int i;.  U
fbe0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
fbf0: 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72 67  az);.  if( azArg
fc00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fc10: 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70 70    if( p->n ) app
fc20: 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c 20  endText(p, "|", 
fc30: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
fc40: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
fc50: 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64 54   if( i ) appendT
fc60: 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b 0a  ext(p, ",", 0);.
fc70: 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
fc80: 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c   ) appendText(p,
fc90: 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a 20   azArg[i], 0);. 
fca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
fcb0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
fcc0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
fcd0: 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 69  SELFTEST table i
fce0: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
fcf0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
fd00: 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74 65  oid createSelfte
fd10: 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74 61  stTable(ShellSta
fd20: 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  te *p){.  char *
fd30: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
fd40: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
fd50: 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49 4e  b,.    "SAVEPOIN
fd60: 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74 3b  T selftest_init;
fd70: 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  \n".    "CREATE 
fd80: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
fd90: 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e 22  STS selftest(\n"
fda0: 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54 45  .    "  tno INTE
fdb0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
fdc0: 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e 75  \n"   /* Test nu
fdd0: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20 6f  mber */.    "  o
fde0: 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  p TEXT,\n"      
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe00: 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f 20  Operator:  memo 
fe10: 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63 6d  run */.    "  cm
fe20: 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20 20  d TEXT,\n"      
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
fe40: 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a 20  ommand text */. 
fe50: 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c 6e     "  ans TEXT\n
fe60: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fe70: 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 61      /* Desired a
fe80: 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29 3b  nswer */.    ");
fe90: 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54 45  ".    "CREATE TE
fea0: 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c  MP TABLE [_shell
feb0: 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61 6e  $self](op,cmd,an
fec0: 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  s);\n".    "INSE
fed0: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
fee0: 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c 63  self](rowid,op,c
fef0: 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56 41  md)\n".    "  VA
ff00: 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28 53  LUES(coalesce((S
ff10: 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29 2b  ELECT (max(tno)+
ff20: 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65 6c  100)/10 FROM sel
ff30: 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a 20  ftest),10),\n". 
ff40: 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d 65     "         'me
ff50: 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65 72  mo','Tests gener
ff60: 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27 29  ated by --init')
ff70: 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54  ;\n".    "INSERT
ff80: 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65   INTO [_shell$se
ff90: 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45  lf]\n".    "  SE
ffa0: 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a 20  LECT 'run',\n". 
ffb0: 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54 20     "    'SELECT 
ffc0: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
ffd0: 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  'SELECT type,nam
ffe0: 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22  e,tbl_name,sql "
fff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
10020 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
10030 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20  '',224))',\n".  
10040 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33 5f    "    hex(sha3_
10050 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74 79  query('SELECT ty
10060 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
10070 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20  ,sql ".         
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61   "FROM sqlite_ma
100a0 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32 27  ster ORDER BY 2'
100b0 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20 22  ,224));\n".    "
100c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
100d0 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
100e0 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27   "  SELECT 'run'
100f0 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c  ,".    "    'SEL
10100 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75 65  ECT hex(sha3_que
10110 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46 52  ry(''SELECT * FR
10120 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20 22  OM \"' ||".    "
10130 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 27          printf('
10140 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c 22  %w',name) || '\"
10150 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c 32   NOT INDEXED'',2
10160 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20  24))',\n".    " 
10170 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65 72     hex(sha3_quer
10180 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43 54  y(printf('SELECT
10190 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 4e   * FROM \"%w\" N
101a0 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d 65  OT INDEXED',name
101b0 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20 22  ),224))\n".    "
101c0 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20    FROM (\n".    
101d0 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  "    SELECT name
101e0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
101f0 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ter\n".    "    
10200 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62   WHERE type='tab
10210 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  le'\n".    "    
10220 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 65     AND name<>'se
10230 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20 22  lftest'\n".    "
10240 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65         AND coale
10250 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
10260 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e 22  0\n".    "  )\n"
10270 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20  .    " ORDER BY 
10280 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  name;\n".    "IN
10290 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
102a0 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22  l$self]\n".    "
102b0 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c 27    VALUES('run','
102c0 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
102d0 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c 6e  _check','ok');\n
102e0 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
102f0 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f 2c  TO selftest(tno,
10300 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20 20  op,cmd,ans)".   
10310 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64   "  SELECT rowid
10320 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46  *10,op,cmd,ans F
10330 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  ROM [_shell$self
10340 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50 20  ];\n".    "DROP 
10350 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73 65  TABLE [_shell$se
10360 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c 26  lf];".    ,0,0,&
10370 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
10380 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
10390 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
103a0 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e 69  r, "SELFTEST ini
103b0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
103c0 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  ure: %s\n", zErr
103d0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
103e0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
103f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65  .  }.  sqlite3_e
10400 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45  xec(p->db, "RELE
10410 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  ASE selftest_ini
10420 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a 2f  t",0,0,0);.}.../
10430 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
10440 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 66  tination table f
10450 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65 6c  ield of the Shel
10460 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72 65  lState structure
10470 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
10480 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69 76  of the table giv
10490 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79 20  en.  Escape any 
104a0 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73  quote characters
104b0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   in the.** table
104c0 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
104d0 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65 5f   void set_table_
104e0 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65 20  name(ShellState 
104f0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
10500 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  zName){.  int i,
10510 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74   n;.  char cQuot
10520 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  e;.  char *z;.. 
10530 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61 62   if( p->zDestTab
10540 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  le ){.    free(p
10550 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a 20  ->zDestTable);. 
10560 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65     p->zDestTable
10570 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
10580 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
10590 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75  n;.  cQuote = qu
105a0 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a  oteChar(zName);.
105b0 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
105c0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51 75  Name);.  if( cQu
105d0 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b 0a  ote ) n += n+2;.
105e0 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61    z = p->zDestTa
105f0 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 2b  ble = malloc( n+
10600 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  1 );.  if( z==0 
10610 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d  ) shell_out_of_m
10620 65 6d 6f 72 79 28 29 3b 0a 20 20 6e 20 3d 20 30  emory();.  n = 0
10630 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  ;.  if( cQuote )
10640 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65   z[n++] = cQuote
10650 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61  ;.  for(i=0; zNa
10660 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  me[i]; i++){.   
10670 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b   z[n++] = zName[
10680 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  i];.    if( zNam
10690 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a  e[i]==cQuote ) z
106a0 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a  [n++] = cQuote;.
106b0 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74 65    }.  if( cQuote
106c0 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
106d0 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a  te;.  z[n] = 0;.
106e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  }.../*.** Execut
106f0 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65 6d  e a query statem
10700 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65  ent that will ge
10710 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75  nerate SQL outpu
10720 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65  t.  Print.** the
10730 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c   result columns,
10740 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   comma-separated
10750 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20  , on a line and 
10760 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65  then add a.** se
10770 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74  micolon terminat
10780 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
10790 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a   that line..**.*
107a0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
107b0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20  of columns is 1 
107c0 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  and that column 
107d0 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d  contains text "-
107e0 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  -".** then write
107f0 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f   the semicolon o
10800 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e  n a separate lin
10810 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69 66  e.  That way, if
10820 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65   a.** "--" comme
10830 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  nt occurs at the
10840 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74   end of the stat
10850 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65  ement, the comme
10860 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73  nt.** won't cons
10870 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f  ume the semicolo
10880 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f  n terminator..*/
10890 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f  .static int run_
108a0 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
108b0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
108c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
108d0 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f  Query context */
108e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
108f0 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53  Select,     /* S
10900 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10910 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65  to extract conte
10920 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
10930 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20  ar *zFirstRow   
10940 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65   /* Print before
10950 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e   first row, if n
10960 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  ot NULL */.){.  
10970 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
10980 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b  elect;.  int rc;
10990 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a  .  int nResult;.
109a0 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
109b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d   char *z;.  rc =
109c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
109d0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65  _v2(p->db, zSele
109e0 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74  ct, -1, &pSelect
109f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
10a00 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53  SQLITE_OK || !pS
10a10 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74 66  elect ){.    utf
10a20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
10a30 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28   "/**** ERROR: (
10a40 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22  %d) %s *****/\n"
10a50 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  , rc,.          
10a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
10a70 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
10a80 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21    if( (rc&0xff)!
10a90 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
10aa0 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  ) p->nErr++;.   
10ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10ad0 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  tep(pSelect);.  
10ae0 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65  nResult = sqlite
10af0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
10b00 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65  Select);.  while
10b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
10b20 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72   ){.    if( zFir
10b30 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 75  stRow ){.      u
10b40 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10b50 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52  t, "%s", zFirstR
10b60 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73  ow);.      zFirs
10b70 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  tRow = 0;.    }.
10b80 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
10b90 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
10ba0 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74  umn_text(pSelect
10bb0 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  , 0);.    utf8_p
10bc0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
10bd0 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28  s", z);.    for(
10be0 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20  i=1; i<nResult; 
10bf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66 38  i++){.      utf8
10c00 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10c10 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ",%s", sqlite3_c
10c20 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65  olumn_text(pSele
10c30 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20  ct, i));.    }. 
10c40 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
10c50 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28  = "";.    while(
10c60 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d   z[0] && (z[0]!=
10c70 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27  '-' || z[1]!='-'
10c80 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ) ) z++;.    if(
10c90 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 72   z[0] ){.      r
10ca0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10cb0 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20  , "\n;\n");.    
10cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
10cd0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
10ce0 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ";\n");.    }.  
10cf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10d00 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  tep(pSelect);.  
10d10 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10d20 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63  _finalize(pSelec
10d30 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
10d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
10d50 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
10d60 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a  t, "/**** ERROR:
10d70 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c   (%d) %s *****/\
10d80 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20  n", rc,.        
10d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10da0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
10db0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
10dc0 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  )!=SQLITE_CORRUP
10dd0 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  T ) p->nErr++;. 
10de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10df0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
10e00 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76 65  e space and save
10e10 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72 72   off current err
10e20 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  or string..*/.st
10e30 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65 5f  atic char *save_
10e40 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74  err_msg(.  sqlit
10e50 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20 20  e3 *db          
10e60 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
10e70 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69   query */.){.  i
10e80 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73  nt nErrMsg = 1+s
10e90 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
10ea0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 63  errmsg(db));.  c
10eb0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73  har *zErrMsg = s
10ec0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
10ed0 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  nErrMsg);.  if( 
10ee0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d  zErrMsg ){.    m
10ef0 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73  emcpy(zErrMsg, s
10f00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10f10 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d  ), nErrMsg);.  }
10f20 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73  .  return zErrMs
10f30 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  g;.}..#ifdef __l
10f40 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74  inux__./*.** Att
10f50 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79 20  empt to display 
10f60 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e  I/O stats on Lin
10f70 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50  ux using /proc/P
10f80 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20  ID/io.*/.static 
10f90 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e 75  void displayLinu
10fa0 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a 6f  xIoStats(FILE *o
10fb0 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  ut){.  FILE *in;
10fc0 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a  .  char z[200];.
10fd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
10fe0 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
10ff0 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20   "/proc/%d/io", 
11000 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e 20  getpid());.  in 
11010 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29  = fopen(z, "rb")
11020 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
11030 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
11040 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66   fgets(z, sizeof
11050 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20  (z), in)!=0 ){. 
11060 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
11070 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63  struct {.      c
11080 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74  onst char *zPatt
11090 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ern;.      const
110a0 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20   char *zDesc;.  
110b0 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b    } aTrans[] = {
110c0 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72 3a  .      { "rchar:
110d0 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
110e0 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63 65       "Bytes rece
110f0 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a 22  ived by read():"
11100 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63 68   },.      { "wch
11110 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  ar: ",          
11120 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 73          "Bytes s
11130 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a 22  ent to write():"
11140 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
11150 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20 20  syscr: ",       
11160 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61 64             "Read
11170 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a  () system calls:
11180 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  "      },.      
11190 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20 20  { "syscw: ",    
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
111b0 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63 61  rite() system ca
111c0 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20  lls:"     },.   
111d0 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65 73     { "read_bytes
111e0 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
111f0 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72 6f   "Bytes read fro
11200 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a  m storage:"  },.
11210 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f 62        { "write_b
11220 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20  ytes: ",        
11230 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74 74      "Bytes writt
11240 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22 20  en to storage:" 
11250 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e 63  },.      { "canc
11260 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74 65  elled_write_byte
11270 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65  s: ",  "Cancelle
11280 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22 20  d write bytes:" 
11290 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
112a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
112b0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
112c0 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a  (aTrans); i++){.
112d0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
112e0 72 6c 65 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d  rlen30(aTrans[i]
112f0 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  .zPattern);.    
11300 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54    if( strncmp(aT
11310 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11320 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  , z, n)==0 ){.  
11330 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
11340 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
11350 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65  ", aTrans[i].zDe
11360 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20  sc, &z[n]);.    
11370 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11380 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
11390 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e  close(in);.}.#en
113a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  dif../*.** Displ
113b0 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65  ay a single line
113c0 20 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e 67   of status using
113d0 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a   64-bit values..
113e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
113f0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a  isplayStatLine(.
11400 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
11410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11420 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74  he shell context
11430 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62   */.  char *zLab
11440 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
11450 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69  /* Label for thi
11460 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20  s one line */.  
11470 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20  char *zFormat,  
11480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
11490 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65 73 75  mat for the resu
114a0 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  lt */.  int iSta
114b0 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20  tusCtrl,        
114c0 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75    /* Which statu
114d0 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a  s to display */.
114e0 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
114f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11500 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
11510 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73   stats */.){.  s
11520 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75  qlite3_int64 iCu
11530 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  r = -1;.  sqlite
11540 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d  3_int64 iHiwtr =
11550 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50   -1;.  int i, nP
11560 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a  ercent;.  char z
11570 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  Line[200];.  sql
11580 69 74 65 33 5f 73 74 61 74 75 73 36 34 28 69 53  ite3_status64(iS
11590 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72  tatusCtrl, &iCur
115a0 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
115b0 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e  t);.  for(i=0, n
115c0 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d  Percent=0; zForm
115d0 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  at[i]; i++){.   
115e0 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d   if( zFormat[i]=
115f0 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b  ='%' ) nPercent+
11600 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65  +;.  }.  if( nPe
11610 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73  rcent>1 ){.    s
11620 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11630 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
11640 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
11650 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
11660 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
11670 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
11680 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65  of(zLine), zLine
11690 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74  , zFormat, iHiwt
116a0 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72  r);.  }.  raw_pr
116b0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
116c0 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65  36s %s\n", zLabe
116d0 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a  l, zLine);.}../*
116e0 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f  .** Display memo
116f0 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  ry stats..*/.sta
11700 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f  tic int display_
11710 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
11720 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11730 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11740 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
11750 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
11760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
11770 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
11780 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ate */.  int bRe
11790 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
117a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
117b0 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
117c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
117d0 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a  ;.  int iHiwtr;.
117e0 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 69    FILE *out;.  i
117f0 66 28 20 70 41 72 67 3d 3d 30 20 7c 7c 20 70 41  f( pArg==0 || pA
11800 72 67 2d 3e 6f 75 74 3d 3d 30 20 29 20 72 65 74  rg->out==0 ) ret
11810 75 72 6e 20 30 3b 0a 20 20 6f 75 74 20 3d 20 70  urn 0;.  out = p
11820 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20 20 69 66 28  Arg->out;..  if(
11830 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 26 26 20   pArg->pStmt && 
11840 28 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 26  (pArg->statsOn &
11850 20 32 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   2) ){.    int n
11860 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20 20 20 20 73  Col, i, x;.    s
11870 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
11880 6d 74 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  mt = pArg->pStmt
11890 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
118a0 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71  ];.    nCol = sq
118b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
118c0 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  nt(pStmt);.    r
118d0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
118e0 25 2d 33 36 73 20 25 64 5c 6e 22 2c 20 22 4e 75  %-36s %d\n", "Nu
118f0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
11900 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43 6f 6c 29 3b  olumns:", nCol);
11910 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11920 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11930 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11940 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 7a 2c 22  tf(sizeof(z),z,"
11950 43 6f 6c 75 6d 6e 20 25 64 20 25 6e 6e 61 6d 65  Column %d %nname
11960 3a 22 2c 20 69 2c 20 26 78 29 3b 0a 20 20 20 20  :", i, &x);.    
11970 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
11980 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11990 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
119a0 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
119b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
119c0 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
119d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
119e0 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
119f0 22 64 65 63 6c 61 72 65 64 20 74 79 70 65 3a 22  "declared type:"
11a00 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11a10 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11a20 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11a30 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
11a40 70 65 28 70 53 74 6d 74 2c 20 69 29 29 3b 0a 23  pe(pStmt, i));.#
11a50 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
11a60 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
11a70 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
11a80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11a90 66 28 33 30 2c 20 7a 2b 78 2c 20 22 64 61 74 61  f(30, z+x, "data
11aa0 62 61 73 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  base name:");.  
11ab0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11ac0 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11ad0 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11ae0 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
11af0 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
11b00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11b10 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22 74  intf(30, z+x, "t
11b20 61 62 6c 65 20 6e 61 6d 65 3a 22 29 3b 0a 20 20  able name:");.  
11b30 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
11b40 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e  out, "%-36s %s\n
11b50 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f  ", z, sqlite3_co
11b60 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 28  lumn_table_name(
11b70 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
11b80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11b90 66 28 33 30 2c 20 7a 2b 78 2c 20 22 6f 72 69 67  f(30, z+x, "orig
11ba0 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a 20 20 20 20  in name:");.    
11bb0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
11bc0 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
11bd0 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
11be0 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 28 70  mn_origin_name(p
11bf0 53 74 6d 74 2c 69 29 29 3b 0a 23 65 6e 64 69 66  Stmt,i));.#endif
11c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 69  .    }.  }..  di
11c10 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11c20 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64  rg, "Memory Used
11c30 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11c40 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11c50 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11c60 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52 65  MEMORY_USED, bRe
11c70 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53  set);.  displayS
11c80 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
11c90 75 6d 62 65 72 20 6f 66 20 4f 75 74 73 74 61 6e  umber of Outstan
11ca0 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73  ding Allocations
11cb0 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11cc0 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49  max %lld)", SQLI
11cd0 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
11ce0 5f 43 4f 55 4e 54 2c 20 62 52 65 73 65 74 29 3b  _COUNT, bReset);
11cf0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65  .  if( pArg->she
11d00 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50  llFlgs & SHFLG_P
11d10 61 67 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20  agecache ){.    
11d20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
11d30 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
11d40 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
11d50 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  ed:",.       "%l
11d60 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 70 61  ld (max %lld) pa
11d70 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ges", SQLITE_STA
11d80 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53  TUS_PAGECACHE_US
11d90 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 7d  ED, bReset);.  }
11da0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11db0 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
11dc0 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66   of Pcache Overf
11dd0 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20  low Bytes:",.   
11de0 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11df0 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
11e00 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
11e10 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52 65  HE_OVERFLOW, bRe
11e20 73 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53  set);.  displayS
11e30 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c  tatLine(pArg, "L
11e40 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69 6f  argest Allocatio
11e50 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20  n:",.     "%lld 
11e60 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  bytes", SQLITE_S
11e70 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a  TATUS_MALLOC_SIZ
11e80 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69  E, bReset);.  di
11e90 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
11ea0 72 67 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61  rg, "Largest Pca
11eb0 63 68 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22  che Allocation:"
11ec0 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74  ,.     "%lld byt
11ed0 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
11ee0 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
11ef0 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64  E, bReset);.#ifd
11f00 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
11f10 43 4b 44 45 50 54 48 0a 20 20 64 69 73 70 6c 61  CKDEPTH.  displa
11f20 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11f30 22 44 65 65 70 65 73 74 20 50 61 72 73 65 72 20  "Deepest Parser 
11f40 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20 22 25  Stack:",.     "%
11f50 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
11f60 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
11f70 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65  ARSER_STACK, bRe
11f80 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  set);.#endif..  
11f90 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66  if( db ){.    if
11fa0 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67  ( pArg->shellFlg
11fb0 73 20 26 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  s & SHFLG_Lookas
11fc0 69 64 65 20 29 7b 0a 20 20 20 20 20 20 69 48 69  ide ){.      iHi
11fd0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
11fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
11ff0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
12000 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
12010 4b 41 53 49 44 45 5f 55 53 45 44 2c 0a 20 20 20  KASIDE_USED,.   
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12040 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12050 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12060 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20  Arg->out,.      
12070 20 20 20 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69          "Lookasi
12080 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a 20 20  de Slots Used:  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
120a0 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20   (max %d)\n",.  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
120c0 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20  , iHiwtr);.     
120d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
120e0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
120f0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
12100 5f 48 49 54 2c 0a 20 20 20 20 20 20 20 20 20 20  _HIT,.          
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
12120 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
12130 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
12140 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12150 74 2c 20 22 53 75 63 63 65 73 73 66 75 6c 20 6c  t, "Successful l
12160 6f 6f 6b 61 73 69 64 65 20 61 74 74 65 6d 70 74  ookaside attempt
12170 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a  s:       %d\n",.
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
12190 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  iwtr);.      sql
121a0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
121b0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
121c0 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  US_LOOKASIDE_MIS
121d0 53 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  S_SIZE,.        
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12200 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  bReset);.      r
12210 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12220 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20  out, "Lookaside 
12230 66 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20  failures due to 
12240 73 69 7a 65 3a 20 20 20 20 20 20 25 64 5c 6e 22  size:      %d\n"
12250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12260 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73  iHiwtr);.      s
12270 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
12280 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  (db, SQLITE_DBST
12290 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d  ATUS_LOOKASIDE_M
122a0 49 53 53 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20  ISS_FULL,.      
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
122d0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
122e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
122f0 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64  ->out, "Lookasid
12300 65 20 66 61 69 6c 75 72 65 73 20 64 75 65 20 74  e failures due t
12310 6f 20 4f 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c  o OOM:       %d\
12320 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12330 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 7d    iHiwtr);.    }
12340 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
12350 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
12360 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
12370 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12380 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26  US_CACHE_USED, &
12390 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
123a0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
123b0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
123c0 2c 20 22 50 61 67 65 72 20 48 65 61 70 20 55 73  , "Pager Heap Us
123d0 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
123e0 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
123f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12400 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12410 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12420 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12430 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12440 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12450 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  HIT, &iCur, &iHi
12460 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
12470 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12480 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 68  t, "Page cache h
12490 69 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  its:            
124a0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
124b0 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
124c0 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
124d0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
124e0 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
124f0 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d  DBSTATUS_CACHE_M
12500 49 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69  ISS, &iCur, &iHi
12510 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77  wtr, 1);.    raw
12520 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12530 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20 6d  t, "Page cache m
12540 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20  isses:          
12550 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12560 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
12570 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
12580 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
12590 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
125a0 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57  DBSTATUS_CACHE_W
125b0 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48  RITE, &iCur, &iH
125c0 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72 61  iwtr, 1);.    ra
125d0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
125e0 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65 20  ut, "Page cache 
125f0 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20  writes:         
12600 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12610 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12620 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12630 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12640 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12650 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
12660 53 50 49 4c 4c 2c 20 26 69 43 75 72 2c 20 26 69  SPILL, &iCur, &i
12670 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20 20 72  Hiwtr, 1);.    r
12680 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
12690 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63 68 65  out, "Page cache
126a0 20 73 70 69 6c 6c 73 3a 20 20 20 20 20 20 20 20   spills:        
126b0 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
126c0 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69  , iCur);.    iHi
126d0 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
126e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
126f0 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
12700 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d  E_DBSTATUS_SCHEM
12710 41 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  A_USED, &iCur, &
12720 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
12730 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12740 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 63 68 65  pArg->out, "Sche
12750 6d 61 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  ma Heap Usage:  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
12780 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
12790 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
127a0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
127b0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
127c0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
127d0 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26 69  US_STMT_USED, &i
127e0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
127f0 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12800 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12810 20 22 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70   "Statement Heap
12820 2f 4c 6f 6f 6b 61 73 69 64 65 20 55 73 61 67 65  /Lookaside Usage
12830 3a 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c  :      %d bytes\
12840 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
12850 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  iCur);.  }..  if
12860 28 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b  ( pArg->pStmt ){
12870 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
12880 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
12890 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
128a0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
128b0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20  ULLSCAN_STEP,.  
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65               bRe
128e0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
128f0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12900 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12930 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
12940 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
12950 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
12960 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
12970 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
12980 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12990 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74  pArg->out, "Sort
129a0 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20   Operations:    
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
129d0 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
129e0 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
129f0 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12a00 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
12a10 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a  OINDEX,bReset);.
12a20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12a30 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69  Arg->out, "Autoi
12a40 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20  ndex Inserts:   
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12a70 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
12a80 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
12a90 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
12aa0 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
12ab0 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  TEP, bReset);.  
12ac0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12ad0 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c  g->out, "Virtual
12ae0 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20   Machine Steps: 
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12b00 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12b10 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12b20 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12b30 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12b40 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50  TMTSTATUS_REPREP
12b50 41 52 45 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  ARE, bReset);.  
12b60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12b70 67 2d 3e 6f 75 74 2c 20 22 52 65 70 72 65 70 61  g->out, "Reprepa
12b80 72 65 20 6f 70 65 72 61 74 69 6f 6e 73 3a 20 20  re operations:  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
12ba0 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
12bb0 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73  iCur = sqlite3_s
12bc0 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d  tmt_status(pArg-
12bd0 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53  >pStmt, SQLITE_S
12be0 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 2c 20 62  TMTSTATUS_RUN, b
12bf0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
12c00 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12c10 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  , "Number of tim
12c20 65 73 20 72 75 6e 3a 20 20 20 20 20 20 20 20 20  es run:         
12c30 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12c40 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12c50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12c60 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12c70 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12c80 54 55 53 5f 4d 45 4d 55 53 45 44 2c 20 62 52 65  TUS_MEMUSED, bRe
12c90 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
12ca0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
12cb0 22 4d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20  "Memory used by 
12cc0 70 72 65 70 61 72 65 64 20 73 74 6d 74 3a 20 20  prepared stmt:  
12cd0 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
12ce0 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  r);.  }..#ifdef 
12cf0 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70  __linux__.  disp
12d00 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
12d10 70 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  pArg->out);.#end
12d20 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  if..  /* Do not 
12d30 72 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68  remove this mach
12d40 69 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d  ine readable com
12d50 6d 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74  ment: extra-stat
12d60 73 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f  s-output-here */
12d70 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
12d80 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73  ./*.** Display s
12d90 63 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74  can stats..*/.st
12da0 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
12db0 79 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73  y_scanstats(.  s
12dc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12de0 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
12df0 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74  ery */.  ShellSt
12e00 61 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20  ate *pArg       
12e10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12e20 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
12e30 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  e */.){.#ifndef 
12e40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
12e50 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
12e60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12e70 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
12e80 41 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a  ARAMETER(pArg);.
12e90 23 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b  #else.  int i, k
12ea0 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70  , n, mx;.  raw_p
12eb0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12ec0 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73   "-------- scans
12ed0 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  tats --------\n"
12ee0 29 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66  );.  mx = 0;.  f
12ef0 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b  or(k=0; k<=mx; k
12f00 2b 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ++){.    double 
12f10 72 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a  rEstLoop = 1.0;.
12f20 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31      for(i=n=0; 1
12f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
12f40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20  lite3_stmt *p = 
12f50 70 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  pArg->pStmt;.   
12f60 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
12f70 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a   nLoop, nVisit;.
12f80 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73        double rEs
12f90 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69  t;.      int iSi
12fa0 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  d;.      const c
12fb0 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20  har *zExplain;. 
12fc0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12fd0 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
12fe0 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43  (p, i, SQLITE_SC
12ff0 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76  ANSTAT_NLOOP, (v
13000 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a  oid*)&nLoop) ){.
13010 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13030 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
13040 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
13050 45 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43  E_SCANSTAT_SELEC
13060 54 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69  TID, (void*)&iSi
13070 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53  d);.      if( iS
13080 69 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69  id>mx ) mx = iSi
13090 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  d;.      if( iSi
130a0 64 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b  d!=k ) continue;
130b0 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
130c0 29 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c  ){.        rEstL
130d0 6f 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c  oop = (double)nL
130e0 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  oop;.        if(
130f0 20 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   k>0 ) raw_print
13100 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
13110 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20  ------ subquery 
13120 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b  %d -------\n", k
13130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13140 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69   n++;.      sqli
13150 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
13160 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
13170 5f 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54  _SCANSTAT_NVISIT
13180 2c 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74  , (void*)&nVisit
13190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
131a0 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
131b0 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43  (p, i, SQLITE_SC
131c0 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69  ANSTAT_EST, (voi
131d0 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20  d*)&rEst);.     
131e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
131f0 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
13200 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
13210 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26  XPLAIN, (void*)&
13220 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  zExplain);.     
13230 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
13240 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32  g->out, "Loop %2
13250 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78  d: %s\n", n, zEx
13260 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45  plain);.      rE
13270 73 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a  stLoop *= rEst;.
13280 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13290 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20  (pArg->out,.    
132a0 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20        "         
132b0 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f  nLoop=%-8lld nRo
132c0 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d  w=%-8lld estRow=
132d0 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f  %-8lld estRow/Lo
132e0 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20  op=%-8g\n",.    
132f0 20 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69        nLoop, nVi
13300 73 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  sit, (sqlite3_in
13310 74 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e  t64)(rEstLoop+0.
13320 35 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29  5), rEst.      )
13330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61  ;.    }.  }.  ra
13340 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13350 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ut, "-----------
13360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13370 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  \n");.#endif.}..
13380 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
13390 61 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74  azArray points t
133a0 6f 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  o a zero-termina
133b0 74 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72  ted array of str
133c0 69 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f  ings. zStr.** po
133d0 69 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65  ints to a single
133e0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
133f0 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e  string. Return n
13400 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a  on-zero if zStr.
13410 2a 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63  ** is equal, acc
13420 6f 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70  ording to strcmp
13430 28 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  (), to any of th
13440 65 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  e strings in the
13450 20 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72   array..** Other
13460 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72  wise, return zer
13470 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
13480 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f   str_in_array(co
13490 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20  nst char *zStr, 
134a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41  const char **azA
134b0 72 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rray){.  int i;.
134c0 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72    for(i=0; azArr
134d0 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ay[i]; i++){.   
134e0 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
134f0 53 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29  Str, azArray[i])
13500 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
13510 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
13520 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*.** If compile
13530 64 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c  d statement pSql
13540 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61   appears to be a
13550 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
13560 65 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a  ent, allocate.**
13570 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
13580 65 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49  e ShellState.aiI
13590 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69  ndent[] array wi
135a0 74 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  th the number of
135b0 0a 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20  .** spaces each 
135c0 6f 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65  opcode should be
135d0 20 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65   indented before
135e0 20 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a   it is output..*
135f0 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69  *.** The indenti
13600 6e 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a  ng rules are:.**
13610 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61  .**     * For ea
13620 63 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76  ch "Next", "Prev
13630 22 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56  ", "VNext" or "V
13640 50 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f  Prev" instructio
13650 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20  n, indent.**    
13660 20 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74     all opcodes t
13670 68 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65  hat occur betwee
13680 6e 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65  n the p2 jump de
13690 73 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68  stination and th
136a0 65 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20  e opcode.**     
136b0 20 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70    itself by 2 sp
136c0 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  aces..**.**     
136d0 2a 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f  * For each "Goto
136e0 22 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64  ", if the jump d
136f0 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61  estination is ea
13700 72 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f  rlier in the pro
13710 67 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e  gram.**       an
13720 64 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66  d ends on one of
13730 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69  :.**          Yi
13740 65 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65  eld  SeekGt  See
13750 6b 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20  kLt  RowSetRead 
13760 20 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20   Rewind.**      
13770 20 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61   or if the P1 pa
13780 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69  rameter is one i
13790 6e 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a  nstead of zero,.
137a0 2a 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e  **       then in
137b0 64 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73  dent all opcodes
137c0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72   between the ear
137d0 6c 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  lier instruction
137e0 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47  .**       and "G
137f0 6f 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73  oto" by 2 spaces
13800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13810 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
13820 65 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65  epare(ShellState
13830 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d   *p, sqlite3_stm
13840 74 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73  t *pSql){.  cons
13850 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
13860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13870 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53  he text of the S
13880 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
13890 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65    /* Used to che
138c0 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ck if this is an
138d0 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e   EXPLAIN */.  in
138e0 74 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20  t *abYield = 0; 
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13900 20 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61   True if op is a
13910 6e 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20  n OP_Yield */.  
13920 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20  int nAlloc = 0; 
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
13950 65 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74  e of p->aiIndent
13960 5b 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20  [], abYield */. 
13970 20 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20   int iOp;       
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65   /* Index of ope
139a0 72 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49  ration in p->aiI
139b0 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f  ndent[] */..  co
139c0 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74  nst char *azNext
139d0 5b 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22  [] = { "Next", "
139e0 50 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20  Prev", "VPrev", 
139f0 22 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72  "VNext", "Sorter
13a00 4e 65 78 74 22 2c 20 30 20 7d 3b 0a 20 20 63 6f  Next", 0 };.  co
13a10 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c  nst char *azYiel
13a20 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c  d[] = { "Yield",
13a30 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b   "SeekLT", "Seek
13a40 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64  GT", "RowSetRead
13a50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13a70 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20  Rewind", 0 };.  
13a80 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f  const char *azGo
13a90 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c  to[] = { "Goto",
13aa0 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20   0 };..  /* Try 
13ab0 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66  to figure out if
13ac0 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20   this is really 
13ad0 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
13ae0 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20  ment. If this.  
13af0 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72  ** cannot be ver
13b00 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61  ified, return ea
13b10 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  rly.  */.  if( s
13b20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
13b30 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a  unt(pSql)!=8 ){.
13b40 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
13b50 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  ->mode;.    retu
13b60 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  rn;.  }.  zSql =
13b70 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
13b80 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  l);.  if( zSql==
13b90 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
13ba0 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20  r(z=zSql; *z==' 
13bb0 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c  ' || *z=='\t' ||
13bc0 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d   *z=='\n' || *z=
13bd0 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72  ='\f' || *z=='\r
13be0 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73  '; z++);.  if( s
13bf0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
13c00 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29  z, "explain", 7)
13c10 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65   ){.    p->cMode
13c20 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
13c30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
13c40 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45  or(iOp=0; SQLITE
13c50 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
13c60 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29  ep(pSql); iOp++)
13c70 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13c80 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
13c90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13ca0 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f  pSql, 0);.    co
13cb0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
13cc0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
13cd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
13ce0 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20  (pSql, 1);..    
13cf0 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65  /* Set p2 to the
13d00 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65   P2 field of the
13d10 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e   current opcode.
13d20 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20   Then, assuming 
13d30 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69  that.    ** p2 i
13d40 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  s an instruction
13d50 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61   address, set va
13d60 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74  riable p2op to t
13d70 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
13d80 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
13d90 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64  ion in the aiInd
13da0 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20  ent[] array. p2 
13db0 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20  and p2op may be 
13dc0 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20  different if.   
13dd0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
13de0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70  instruction is p
13df0 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f  art of a sub-pro
13e00 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62  gram generated b
13e10 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20  y an.    ** SQL 
13e20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69  trigger or forei
13e30 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20  gn key.  */.    
13e40 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33  int p2 = sqlite3
13e50 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
13e60 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32  , 3);.    int p2
13e70 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d  op = (p2 + (iOp-
13e80 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  iAddr));..    /*
13e90 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49   Grow the p->aiI
13ea0 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72  ndent array as r
13eb0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
13ec0 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29  f( iOp>=nAlloc )
13ed0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d  {.      if( iOp=
13ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
13ef0 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66   Do further verf
13f00 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69  ication that thi
13f10 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74  s is explain out
13f20 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20  put.  Abort if. 
13f30 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
13f40 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  not */.        s
13f50 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
13f60 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20   *explainCols[] 
13f70 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22  = {.           "
13f80 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c  addr", "opcode",
13f90 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33   "p1", "p2", "p3
13fa0 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22  ", "p4", "p5", "
13fb0 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20  comment" };.    
13fc0 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
13fd0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
13fe0 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61  <ArraySize(expla
13ff0 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a  inCols); jj++){.
14000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
14010 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c  rcmp(sqlite3_col
14020 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a  umn_name(pSql,jj
14030 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a  ),explainCols[jj
14040 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
14050 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20       p->cMode = 
14060 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  p->mode;.       
14070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14080 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20  et(pSql);.      
14090 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
140a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
140b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
140c0 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b    nAlloc += 100;
140d0 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  .      p->aiInde
140e0 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  nt = (int*)sqlit
140f0 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
14100 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63  aiIndent, nAlloc
14110 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
14120 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69 49 6e       if( p->aiIn
14130 64 65 6e 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  dent==0 ) shell_
14140 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
14150 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d  .      abYield =
14160 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
14170 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64  ealloc64(abYield
14180 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
14190 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28  int));.      if(
141a0 20 61 62 59 69 65 6c 64 3d 3d 30 20 29 20 73 68   abYield==0 ) sh
141b0 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
141c0 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  y();.    }.    a
141d0 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74  bYield[iOp] = st
141e0 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
141f0 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d  azYield);.    p-
14200 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d  >aiIndent[iOp] =
14210 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65   0;.    p->nInde
14220 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20  nt = iOp+1;..   
14230 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
14240 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29  y(zOp, azNext) )
14250 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32  {.      for(i=p2
14260 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20  op; i<iOp; i++) 
14270 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b  p->aiIndent[i] +
14280 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 2;.    }.    i
14290 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  f( str_in_array(
142a0 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20  zOp, azGoto) && 
142b0 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a  p2op<p->nIndent.
142c0 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64       && (abYield
142d0 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65  [p2op] || sqlite
142e0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
142f0 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20  l, 2)).    ){.  
14300 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20      for(i=p2op; 
14310 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61  i<iOp; i++) p->a
14320 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b  iIndent[i] += 2;
14330 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d  .    }.  }..  p-
14340 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >iIndent = 0;.  
14350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59  sqlite3_free(abY
14360 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ield);.  sqlite3
14370 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a  _reset(pSql);.}.
14380 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
14390 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20  array allocated 
143a0 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  by explain_data_
143b0 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
143c0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
143d0 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68  n_data_delete(Sh
143e0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
143f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
14400 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e  aiIndent);.  p->
14410 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  aiIndent = 0;.  
14420 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->nIndent = 0;.
14430 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30    p->iIndent = 0
14440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  ;.}../*.** Disab
14450 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e  le and restore .
14460 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e  wheretrace and .
14470 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74  selecttrace sett
14480 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ings..*/.#if def
14490 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
144a0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
144b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
144c0 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20  CTTRACE).extern 
144d0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
144e0 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  tTrace;.static i
144f0 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72  nt savedSelectTr
14500 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ace;.#endif.#if 
14510 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
14520 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
14530 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
14540 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72  HERETRACE).exter
14550 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
14560 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  reTrace;.static 
14570 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72  int savedWhereTr
14580 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74  ace;.#endif.stat
14590 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  ic void disable_
145a0 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
145b0 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
145c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
145d0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
145e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
145f0 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  CTTRACE).  saved
14600 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71  SelectTrace = sq
14610 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
14620 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
14630 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  tTrace = 0;.#end
14640 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14650 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14660 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
14670 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
14680 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72  ).  savedWhereTr
14690 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ace = sqlite3Whe
146a0 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  reTrace;.  sqlit
146b0 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30  e3WhereTrace = 0
146c0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69  ;.#endif.}.stati
146d0 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64  c void restore_d
146e0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
146f0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
14700 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
14710 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14720 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
14730 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  TTRACE).  sqlite
14740 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  3SelectTrace = s
14750 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b  avedSelectTrace;
14760 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
14770 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
14780 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
14790 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
147a0 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
147b0 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76  WhereTrace = sav
147c0 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
147d0 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 43 72 65 61 74  ndif.}../* Creat
147e0 65 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65  e the TEMP table
147f0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 70   used to store p
14800 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67  arameter binding
14810 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
14820 20 62 69 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74   bind_table_init
14830 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
14840 0a 20 20 69 6e 74 20 77 72 53 63 68 65 6d 61 20  .  int wrSchema 
14850 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64  = 0;.  sqlite3_d
14860 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
14870 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
14880 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41 2c  WRITABLE_SCHEMA,
14890 20 2d 31 2c 20 26 77 72 53 63 68 65 6d 61 29 3b   -1, &wrSchema);
148a0 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  .  sqlite3_db_co
148b0 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49  nfig(p->db, SQLI
148c0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54  TE_DBCONFIG_WRIT
148d0 41 42 4c 45 5f 53 43 48 45 4d 41 2c 20 31 2c 20  ABLE_SCHEMA, 1, 
148e0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  0);.  sqlite3_ex
148f0 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 43  ec(p->db,.    "C
14900 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
14910 4f 54 20 45 58 49 53 54 53 20 74 65 6d 70 2e 73  OT EXISTS temp.s
14920 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65 72 73  qlite_parameters
14930 28 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20  (\n".    "  key 
14940 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
14950 2c 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75  ,\n".    "  valu
14960 65 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20  e ANY\n".    ") 
14970 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c  WITHOUT ROWID;",
14980 0a 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20  .    0, 0, 0);. 
14990 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
149a0 69 67 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  ig(p->db, SQLITE
149b0 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42  _DBCONFIG_WRITAB
149c0 4c 45 5f 53 43 48 45 4d 41 2c 20 77 72 53 63 68  LE_SCHEMA, wrSch
149d0 65 6d 61 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ema, 0);.}../*.*
149e0 2a 20 42 69 6e 64 20 70 61 72 61 6d 65 74 65 72  * Bind parameter
149f0 73 20 6f 6e 20 61 20 70 72 65 70 61 72 65 64 20  s on a prepared 
14a00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
14a10 20 50 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69   Parameter bindi
14a20 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
14a30 6f 6d 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  om a TEMP table 
14a40 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
14a50 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  **    CREATE TEM
14a60 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 70  P TABLE sqlite_p
14a70 61 72 61 6d 65 74 65 72 73 28 6b 65 79 20 54 45  arameters(key TE
14a80 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
14a90 76 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49 54  value).**    WIT
14aa0 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a 2a  HOUT ROWID;.**.*
14ab0 2a 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f 63  * No bindings oc
14ac0 63 75 72 20 69 66 20 74 68 69 73 20 74 61 62 6c  cur if this tabl
14ad0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
14ae0 2e 20 20 54 68 65 20 73 70 65 63 69 61 6c 20 63  .  The special c
14af0 68 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a 20  haracter '$'.** 
14b00 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
14b10 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
14b20 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63 6f   help prevent co
14b30 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61 63  llisions with ac
14b40 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a 20  tual tables..** 
14b50 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  The table must b
14b60 65 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73 63  e in the TEMP sc
14b70 68 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hema..*/.static 
14b80 76 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61 72  void bind_prepar
14b90 65 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74 61  ed_stmt(ShellSta
14ba0 74 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74 65  te *pArg, sqlite
14bb0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  3_stmt *pStmt){.
14bc0 20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69 6e    int nVar;.  in
14bd0 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t i;.  int rc;. 
14be0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
14bf0 51 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20 3d  Q = 0;..  nVar =
14c00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
14c10 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
14c20 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61 72  tmt);.  if( nVar
14c30 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  ==0 ) return;  /
14c40 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * Nothing to do 
14c50 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
14c60 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
14c70 74 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62 2c  tadata(pArg->db,
14c80 20 22 54 45 4d 50 22 2c 20 22 73 71 6c 69 74 65   "TEMP", "sqlite
14c90 5f 70 61 72 61 6d 65 74 65 72 73 22 2c 0a 20 20  _parameters",.  
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 20 20 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30    "key", 0, 0, 0
14cd0 2c 20 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f  , 0, 0)!=SQLITE_
14ce0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
14cf0 3b 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74  ; /* Parameter t
14d00 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  able does not ex
14d10 69 73 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20  ist */.  }.  rc 
14d20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
14d30 65 5f 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20  e_v2(pArg->db,. 
14d40 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
14d50 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70   value FROM temp
14d60 2e 73 71 6c 69 74 65 5f 70 61 72 61 6d 65 74 65  .sqlite_paramete
14d70 72 73 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  rs".          " 
14d80 57 48 45 52 45 20 6b 65 79 3d 3f 31 22 2c 20 2d  WHERE key=?1", -
14d90 31 2c 20 26 70 51 2c 20 30 29 3b 0a 20 20 69 66  1, &pQ, 0);.  if
14da0 28 20 72 63 20 7c 7c 20 70 51 3d 3d 30 20 29 20  ( rc || pQ==0 ) 
14db0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
14dc0 31 3b 20 69 3c 3d 6e 56 61 72 3b 20 69 2b 2b 29  1; i<=nVar; i++)
14dd0 7b 0a 20 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b  {.    char zNum[
14de0 33 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  30];.    const c
14df0 68 61 72 20 2a 7a 56 61 72 20 3d 20 73 71 6c 69  har *zVar = sqli
14e00 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
14e10 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  er_name(pStmt, i
14e20 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 72 3d  );.    if( zVar=
14e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
14e40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
14e50 65 6f 66 28 7a 4e 75 6d 29 2c 7a 4e 75 6d 2c 22  eof(zNum),zNum,"
14e60 3f 25 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 7a  ?%d",i);.      z
14e70 56 61 72 20 3d 20 7a 4e 75 6d 3b 0a 20 20 20 20  Var = zNum;.    
14e80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  }.    sqlite3_bi
14e90 6e 64 5f 74 65 78 74 28 70 51 2c 20 31 2c 20 7a  nd_text(pQ, 1, z
14ea0 56 61 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Var, -1, SQLITE_
14eb0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28  STATIC);.    if(
14ec0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
14ed0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
14ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
14ef0 69 6e 64 5f 76 61 6c 75 65 28 70 53 74 6d 74 2c  ind_value(pStmt,
14f00 20 69 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   i, sqlite3_colu
14f10 6d 6e 5f 76 61 6c 75 65 28 70 51 2c 20 30 29 29  mn_value(pQ, 0))
14f20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14f30 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
14f40 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b 0a  null(pStmt, i);.
14f50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14f60 33 5f 72 65 73 65 74 28 70 51 29 3b 0a 20 20 7d  3_reset(pQ);.  }
14f70 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
14f80 69 7a 65 28 70 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ize(pQ);.}../*.*
14f90 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72 65 64  * Run a prepared
14fa0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74   statement.*/.st
14fb0 61 74 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70  atic void exec_p
14fc0 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20  repared_stmt(.  
14fd0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
14fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
15010 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73  hellState */.  s
15020 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15030 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mt              
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72  /* Statment to r
15060 75 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  un */.){.  int r
15070 63 3b 0a 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d  c;..  /* perform
15080 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 2e   the first step.
15090 20 20 74 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c    this will tell
150a0 20 75 73 20 69 66 20 77 65 0a 20 20 2a 2a 20 68   us if we.  ** h
150b0 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
150c0 20 6f 72 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20   or not and how 
150d0 77 69 64 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f  wide it is..  */
150e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
150f0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f  step(pStmt);.  /
15100 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 72  * if we have a r
15110 65 73 75 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a  esult set... */.
15120 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
15130 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a   == rc ){.    /*
15140 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
15150 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72  for col name ptr
15160 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64  , value ptr, and
15170 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 6e 74   type */.    int
15180 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
15190 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
151a0 6d 74 29 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70  mt);.    void *p
151b0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Data = sqlite3_m
151c0 61 6c 6c 6f 63 36 34 28 33 2a 6e 43 6f 6c 2a 73  alloc64(3*nCol*s
151d0 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63 68 61 72  izeof(const char
151e0 2a 29 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28  *) + 1);.    if(
151f0 20 21 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20   !pData ){.     
15200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15210 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
15220 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f       char **azCo
15230 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44  ls = (char **)pD
15240 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ata;      /* Nam
15250 65 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  es of result col
15260 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 63 68  umns */.      ch
15270 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61  ar **azVals = &a
15280 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20  zCols[nCol];    
15290 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f     /* Results */
152a0 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79  .      int *aiTy
152b0 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a  pes = (int *)&az
152c0 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52  Vals[nCol]; /* R
152d0 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20  esult types */. 
152e0 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b 0a 20       int i, x;. 
152f0 20 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65       assert(size
15300 6f 66 28 69 6e 74 29 20 3c 3d 20 73 69 7a 65 6f  of(int) <= sizeo
15310 66 28 63 68 61 72 20 2a 29 29 3b 0a 20 20 20 20  f(char *));.    
15320 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20 70 74    /* save off pt
15330 72 73 20 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  rs to column nam
15340 65 73 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  es */.      for(
15350 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
15360 29 7b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c  ){.        azCol
15370 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29 73  s[i] = (char *)s
15380 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
15390 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  me(pStmt, i);.  
153a0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 7b 0a      }.      do{.
153b0 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61          /* extra
153c0 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20  ct the data and 
153d0 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20  data types */.  
153e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
153f0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
15400 20 20 20 20 20 20 20 61 69 54 79 70 65 73 5b 69         aiTypes[i
15410 5d 20 3d 20 78 20 3d 20 73 71 6c 69 74 65 33 5f  ] = x = sqlite3_
15420 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
15430 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  t, i);.         
15440 20 69 66 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42   if( x==SQLITE_B
15450 4c 4f 42 20 26 26 20 70 41 72 67 20 26 26 20 70  LOB && pArg && p
15460 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
15470 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 20  _Insert ){.     
15480 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
15490 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
154a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
154b0 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20      azVals[i] = 
154c0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
154d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
154e0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
154f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
15500 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61  !azVals[i] && (a
15510 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54  iTypes[i]!=SQLIT
15520 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
15530 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15540 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15550 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2f 2a 20        break; /* 
15560 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a 20 20 20 20  from for */.    
15570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15580 7d 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a  } /* end for */.
15590 0a 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 64  .        /* if d
155a0 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65 78  ata and types ex
155b0 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73 66  tracted successf
155c0 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  ully... */.     
155d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
155e0 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20  W == rc ){.     
155f0 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65       /* call the
15600 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
15610 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75  ck with the resu
15620 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20  lt row data */. 
15630 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 65           if( she
15640 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
15650 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20  , nCol, azVals, 
15660 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29  azCols, aiTypes)
15670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15680 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52  rc = SQLITE_ABOR
15690 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  T;.          }el
156a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
156b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
156c0 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  p(pStmt);.      
156d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
156e0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53        } while( S
156f0 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
15700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15710 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
15720 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
15730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15740 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
15750 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15760 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
15770 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65 20  cess SQL if the 
15780 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20 63  previous shell c
15790 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e  ommand.** was ".
157a0 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73 73  expert". It pass
157b0 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74 68  es the SQL in th
157c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
157d0 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  t directly to.**
157e0 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70 65   the sqlite3expe
157f0 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rt object..**.**
15800 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
15810 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
15820 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
15830 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
15840 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68  r.** code. In th
15850 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72  is case, (*pzErr
15860 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  ) may be set to 
15870 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
15880 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  r containing.** 
15890 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
158a0 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  age error messag
158b0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
158c0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
158d0 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
158e0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
158f0 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e  this buffer usin
15900 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
15910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15920 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28  expertHandleSQL(
15930 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
15940 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20  State, .  const 
15950 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63  char *zSql, .  c
15960 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
15970 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d   assert( pState-
15980 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
15990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a 45  );.  assert( pzE
159a0 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d  rr==0 || *pzErr=
159b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
159c0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71  qlite3_expert_sq
159d0 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  l(pState->expert
159e0 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20  .pExpert, zSql, 
159f0 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pzErr);.}../*.**
15a00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15a10 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72 20  s called either 
15a20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61  to silently clea
15a30 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 0a  n up the object.
15a40 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
15a50 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d  e ".expert" comm
15a60 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c 3d  and (if bCancel=
15a70 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72  =1), or to gener
15a80 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74  ate a .** report
15a90 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68 65   from it and the
15aa0 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28 69  n clean it up (i
15ab0 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a  f bCancel==0)..*
15ac0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
15ad0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
15ae0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
15af0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
15b00 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49  error.** code. I
15b10 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a 70  n this case, (*p
15b20 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65 74  zErr) may be set
15b30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
15b40 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
15b50 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  .** an English l
15b60 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d 65  anguage error me
15b70 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
15b80 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
15b90 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  of the.** caller
15ba0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
15bb0 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72 20  ree this buffer 
15bc0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
15bd0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
15be0 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73 68  int expertFinish
15bf0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
15c00 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62 43  pState,.  int bC
15c10 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a  ancel,.  char **
15c20 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72  pzErr.){.  int r
15c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15c40 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a   sqlite3expert *
15c50 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  p = pState->expe
15c60 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61 73  rt.pExpert;.  as
15c70 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73 73  sert( p );.  ass
15c80 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20  ert( bCancel || 
15c90 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45  pzErr==0 || *pzE
15ca0 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 62  rr==0 );.  if( b
15cb0 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  Cancel==0 ){.   
15cc0 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74   FILE *out = pSt
15cd0 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e  ate->out;.    in
15ce0 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53 74  t bVerbose = pSt
15cf0 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72  ate->expert.bVer
15d00 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20  bose;..    rc = 
15d10 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61  sqlite3_expert_a
15d20 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72 29  nalyze(p, pzErr)
15d30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15d50 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73 71   int nQuery = sq
15d60 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 75  lite3_expert_cou
15d70 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e 74  nt(p);.      int
15d80 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62   i;..      if( b
15d90 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
15da0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15db0 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f 65  Cand = sqlite3_e
15dc0 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 30  xpert_report(p,0
15dd0 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43  ,EXPERT_REPORT_C
15de0 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20 20  ANDIDATES);.    
15df0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
15e00 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61 74  ut, "-- Candidat
15e10 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  es -------------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e30 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 61  \n");.        ra
15e40 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
15e50 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20  s\n", zCand);.  
15e60 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15e70 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69  i=0; i<nQuery; i
15e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
15e90 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20  st char *zSql = 
15ea0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15eb0 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15ec0 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a  RT_REPORT_SQL);.
15ed0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15ee0 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74  ar *zIdx = sqlit
15ef0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
15f00 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
15f10 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20  PORT_INDEXES);. 
15f20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15f30 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74 65  r *zEQP = sqlite
15f40 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
15f50 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
15f60 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20  ORT_PLAN);.     
15f70 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20 29     if( zIdx==0 )
15f80 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77   zIdx = "(no new
15f90 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20   indexes)\n";.  
15fa0 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f        if( bVerbo
15fb0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
15fc0 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15fd0 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d 2d  "-- Query %d ---
15fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
16000 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,i+1);.         
16010 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
16020 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29   "%s\n\n", zSql)
16030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
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 49 64 78  ut, "%s\n", zIdx
16060 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
16070 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
16080 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ", zEQP);.      
16090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
160a0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73  lite3_expert_des
160b0 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61 74  troy(p);.  pStat
160c0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
160d0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
160e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
160f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
16100 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d  .expert" dot com
16110 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
16120 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d  int expertDotCom
16130 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61  mand(.  ShellSta
16140 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
16150 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
16160 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
16170 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
16180 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
16190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
161a0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
161b0 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
161c0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
161d0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
161e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
161f0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
16200 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
16210 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16220 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45  E_OK;.  char *zE
16230 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  rr = 0;.  int i;
16240 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d  .  int iSample =
16250 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
16260 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
16270 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65  xpert==0 );.  me
16280 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78  mset(&pState->ex
16290 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pert, 0, sizeof(
162a0 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20  ExpertInfo));.. 
162b0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
162c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72  LITE_OK && i<nAr
162d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  g; i++){.    cha
162e0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
162f0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
16300 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
16310 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
16320 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
16330 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
16340 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d  >=2 && 0==strncm
16350 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c  p(z, "-verbose",
16360 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74   n) ){.      pSt
16370 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72  ate->expert.bVer
16380 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bose = 1;.    }.
16390 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d      else if( n>=
163a0 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
163b0 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29  z, "-sample", n)
163c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
163d0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
163e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
163f0 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20  stderr, "option 
16400 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
16410 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  ment: %s\n", z);
16420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
16430 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
16440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16450 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29   iSample = (int)
16460 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
16470 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20  rg[++i]);.      
16480 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20    if( iSample<0 
16490 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29  || iSample>100 )
164a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
164b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
164c0 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e  value out of ran
164d0 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  ge: %s\n", azArg
164e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
164f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16500 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
16510 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
16520 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
16530 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
16540 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
16550 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
16560 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16570 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
16580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16590 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d  K ){.    pState-
165a0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
165b0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
165c0 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c  _new(pState->db,
165d0 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
165e0 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
165f0 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20  pExpert==0 ){.  
16600 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16610 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f  tderr, "sqlite3_
16620 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e  expert_new: %s\n
16630 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
16640 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
16650 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
16660 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65      sqlite3_expe
16670 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20  rt_config(.     
16680 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70       pState->exp
16690 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50  ert.pExpert, EXP
166a0 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c  ERT_CONFIG_SAMPL
166b0 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20  E, iSample.     
166c0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
166d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
166e0 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
166f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16700 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
16710 2a 20 45 78 65 63 75 74 65 20 61 20 73 74 61 74  * Execute a stat
16720 65 6d 65 6e 74 20 6f 72 20 73 65 74 20 6f 66 20  ement or set of 
16730 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 50 72 69  statements.  Pri
16740 6e 74 0a 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74  nt.** any result
16750 20 72 6f 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65   rows/columns de
16760 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 63  pending on the c
16770 75 72 72 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73  urrent mode.** s
16780 65 74 20 76 69 61 20 74 68 65 20 73 75 70 70 6c  et via the suppl
16790 69 65 64 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  ied callback..**
167a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 76 65 72 79  .** This is very
167b0 20 73 69 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69   similar to SQLi
167c0 74 65 27 73 20 62 75 69 6c 74 2d 69 6e 20 73 71  te's built-in sq
167d0 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
167e0 66 75 6e 63 74 69 6f 6e 20 65 78 63 65 70 74 20  function except 
167f0 69 74 20 74 61 6b 65 73 20 61 20 73 6c 69 67 68  it takes a sligh
16800 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 63 61  tly different ca
16810 6c 6c 62 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61  llback.** and ca
16820 6c 6c 62 61 63 6b 20 64 61 74 61 20 61 72 67 75  llback data argu
16830 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
16840 69 6e 74 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a  int shell_exec(.
16850 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
16860 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
16870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16880 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
16890 74 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tate */.  const 
168a0 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65      /* SQL to be
168d0 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20 20   evaluated */.  
168e0 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
16910 6f 72 20 6d 73 67 20 77 72 69 74 74 65 6e 20 68  or msg written h
16920 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
16930 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
16940 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53  = NULL;     /* S
16950 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63  tatement to exec
16960 75 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ute. */.  int rc
16970 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
16980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16990 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
169a0 74 20 72 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63  t rc2;.  const c
169b0 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20  har *zLeftover; 
169c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 69 6c           /* Tail
169d0 20 6f 66 20 75 6e 70 72 6f 63 65 73 73 65 64 20   of unprocessed 
169e0 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  SQL */.  sqlite3
169f0 20 2a 64 62 20 3d 20 70 41 72 67 2d 3e 64 62 3b   *db = pArg->db;
16a00 0a 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67  ..  if( pzErrMsg
16a10 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
16a20 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 23  g = NULL;.  }..#
16a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16a40 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
16a50 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65    if( pArg->expe
16a60 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20  rt.pExpert ){.  
16a70 20 20 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e    rc = expertHan
16a80 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71  dleSQL(pArg, zSq
16a90 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  l, pzErrMsg);.  
16aa0 20 20 72 65 74 75 72 6e 20 65 78 70 65 72 74 46    return expertF
16ab0 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72 63 21  inish(pArg, (rc!
16ac0 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45  =SQLITE_OK), pzE
16ad0 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 23 65 6e 64  rrMsg);.  }.#end
16ae0 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71  if..  while( zSq
16af0 6c 5b 30 5d 20 26 26 20 28 53 51 4c 49 54 45 5f  l[0] && (SQLITE_
16b00 4f 4b 20 3d 3d 20 72 63 29 20 29 7b 0a 20 20 20  OK == rc) ){.   
16b10 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
16b20 61 72 20 2a 7a 53 74 6d 74 53 71 6c 3b 0a 20 20  ar *zStmtSql;.  
16b30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
16b40 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
16b50 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
16b60 26 7a 4c 65 66 74 6f 76 65 72 29 3b 0a 20 20 20  &zLeftover);.   
16b70 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21   if( SQLITE_OK !
16b80 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  = rc ){.      if
16b90 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
16ba0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
16bb0 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64  = save_err_msg(d
16bc0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
16bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
16be0 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20   !pStmt ){.     
16bf0 20 20 20 2f 2a 20 74 68 69 73 20 68 61 70 70 65     /* this happe
16c00 6e 73 20 66 6f 72 20 61 20 63 6f 6d 6d 65 6e 74  ns for a comment
16c10 20 6f 72 20 77 68 69 74 65 2d 73 70 61 63 65 20   or white-space 
16c20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20  */.        zSql 
16c30 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20  = zLeftover;.   
16c40 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
16c50 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a  ace(zSql[0]) ) z
16c60 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  Sql++;.        c
16c70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
16c80 0a 20 20 20 20 20 20 7a 53 74 6d 74 53 71 6c 20  .      zStmtSql 
16c90 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
16ca0 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
16cb0 7a 53 74 6d 74 53 71 6c 3d 3d 30 20 29 20 7a 53  zStmtSql==0 ) zS
16cc0 74 6d 74 53 71 6c 20 3d 20 22 22 3b 0a 20 20 20  tmtSql = "";.   
16cd0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
16ce0 65 28 7a 53 74 6d 74 53 71 6c 5b 30 5d 29 20 29  e(zStmtSql[0]) )
16cf0 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b 0a 0a 20 20   zStmtSql++;..  
16d00 20 20 20 20 2f 2a 20 73 61 76 65 20 6f 66 66 20      /* save off 
16d10 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16d20 74 6d 65 6e 74 20 68 61 6e 64 6c 65 20 61 6e 64  tment handle and
16d30 20 72 65 73 65 74 20 72 6f 77 20 63 6f 75 6e 74   reset row count
16d40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
16d50 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  rg ){.        pA
16d60 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70 53 74 6d  rg->pStmt = pStm
16d70 74 3b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  t;.        pArg-
16d80 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >cnt = 0;.      
16d90 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 65 63 68 6f  }..      /* echo
16da0 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
16db0 6e 74 20 69 66 20 65 63 68 6f 20 6f 6e 20 2a 2f  nt if echo on */
16dc0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
16dd0 26 26 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  && ShellHasFlag(
16de0 70 41 72 67 2c 20 53 48 46 4c 47 5f 45 63 68 6f  pArg, SHFLG_Echo
16df0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ) ){.        utf
16e00 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  8_printf(pArg->o
16e10 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 74 6d  ut, "%s\n", zStm
16e20 74 53 71 6c 20 3f 20 7a 53 74 6d 74 53 71 6c 20  tSql ? zStmtSql 
16e30 3a 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d  : zSql);.      }
16e40 0a 0a 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20  ..      /* Show 
16e50 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
16e60 59 20 50 4c 41 4e 20 69 66 20 2e 65 71 70 20 69  Y PLAN if .eqp i
16e70 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  s on */.      if
16e80 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
16e90 61 75 74 6f 45 51 50 20 26 26 20 73 71 6c 69 74  autoEQP && sqlit
16ea0 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69  e3_stmt_isexplai
16eb0 6e 28 70 53 74 6d 74 29 3d 3d 30 20 29 7b 0a 20  n(pStmt)==0 ){. 
16ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
16ed0 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20  tmt *pExplain;. 
16ee0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51         char *zEQ
16ef0 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  P;.        int t
16f00 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20  riggerEQP = 0;. 
16f10 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64         disable_d
16f20 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
16f30 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ();.        sqli
16f40 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
16f50 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
16f60 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d  G_TRIGGER_EQP, -
16f70 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b  1, &triggerEQP);
16f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
16f90 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
16fa0 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20  EQP_trigger ){. 
16fb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16fc0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
16fd0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
16fe0 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30  RIGGER_EQP, 1, 0
16ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17000 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69       zEQP = sqli
17010 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
17020 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
17030 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
17040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17050 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
17060 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
17070 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
17080 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17090 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
170a0 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
170b0 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
170c0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
170d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
170e0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 4c 69 6e  st char *zEQPLin
170f0 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
17100 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
17110 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 33 29  text(pExplain,3)
17120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
17130 74 20 69 45 71 70 49 64 20 3d 20 73 71 6c 69 74  t iEqpId = sqlit
17140 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
17150 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
17160 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72          int iPar
17170 65 6e 74 49 64 20 3d 20 73 71 6c 69 74 65 33 5f  entId = sqlite3_
17180 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
17190 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ain, 1);.       
171a0 20 20 20 20 20 69 66 28 20 7a 45 51 50 4c 69 6e       if( zEQPLin
171b0 65 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71 70 5f  e[0]=='-' ) eqp_
171c0 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 20 20  render(pArg);.  
171d0 20 20 20 20 20 20 20 20 20 20 65 71 70 5f 61 70            eqp_ap
171e0 70 65 6e 64 28 70 41 72 67 2c 20 69 45 71 70 49  pend(pArg, iEqpI
171f0 64 2c 20 69 50 61 72 65 6e 74 49 64 2c 20 7a 45  d, iParentId, zE
17200 51 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  QPLine);.       
17210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
17220 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b  qp_render(pArg);
17230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17240 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
17250 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
17260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
17270 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20  ree(zEQP);.     
17280 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
17290 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75  oEQP>=AUTOEQP_fu
172a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
172b0 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58  /* Also do an EX
172c0 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20  PLAIN for ".eqp 
172d0 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20  full" mode */.  
172e0 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73          zEQP = s
172f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17300 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74  EXPLAIN %s", zSt
17310 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  mtSql);.        
17320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
17330 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45  repare_v2(db, zE
17340 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  QP, -1, &pExplai
17350 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n, 0);.         
17360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17380 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20    pArg->cMode = 
17390 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20  MODE_Explain;.  
173a0 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
173b0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70  n_data_prepare(p
173c0 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a  Arg, pExplain);.
173d0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63              exec
173e0 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70  _prepared_stmt(p
173f0 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a  Arg, pExplain);.
17400 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
17410 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
17420 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  pArg);.         
17430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
17440 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
17450 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20  xplain);.       
17460 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17470 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d  zEQP);.        }
17480 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
17490 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
174a0 45 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74  EQP_trigger && t
174b0 72 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a  riggerEQP==0 ){.
174c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
174d0 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
174e0 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
174f0 54 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20  TRIGGER_EQP, 0, 
17500 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  0);.          /*
17510 20 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74   Reprepare pStmt
17520 20 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69   before reactivi
17530 6e 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a  ng trace modes *
17540 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
17550 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
17560 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  mt);.          s
17570 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
17580 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
17590 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
175a0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
175b0 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20 70   pArg->pStmt = p
175c0 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Stmt;.        }.
175d0 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f          restore_
175e0 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
175f0 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s();.      }..  
17600 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a      if( pArg ){.
17610 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d          pArg->cM
17620 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f 64 65  ode = pArg->mode
17630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
17640 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20  rg->autoExplain 
17650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17660 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73   sqlite3_stmt_is
17670 65 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d  explain(pStmt)==
17680 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
17690 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
176a0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
176b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
176c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
176d0 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53  tmt_isexplain(pS
176e0 74 6d 74 29 3d 3d 32 20 29 7b 0a 20 20 20 20 20  tmt)==2 ){.     
176f0 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17700 64 65 20 3d 20 4d 4f 44 45 5f 45 51 50 3b 0a 20  de = MODE_EQP;. 
17710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17720 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
17730 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69 73   If the shell is
17740 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e   currently in ".
17750 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67  explain" mode, g
17760 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61 0a  ather the extra.
17770 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
17780 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64 20  required to add 
17790 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20 6f  indents to the o
177a0 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20  utput.*/.       
177b0 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65   if( pArg->cMode
177c0 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
177d0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 6c  {.          expl
177e0 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
177f0 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20  (pArg, pStmt);. 
17800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17810 0a 0a 20 20 20 20 20 20 62 69 6e 64 5f 70 72 65  ..      bind_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 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
17850 74 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  t(pArg, pStmt);.
17860 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
17870 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b  ta_delete(pArg);
17880 0a 20 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65  .      eqp_rende
17890 72 28 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20  r(pArg);..      
178a0 2f 2a 20 70 72 69 6e 74 20 75 73 61 67 65 20 73  /* print usage s
178b0 74 61 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e  tats if stats on
178c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41   */.      if( pA
178d0 72 67 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74  rg && pArg->stat
178e0 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64  sOn ){.        d
178f0 69 73 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c  isplay_stats(db,
17900 20 70 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20   pArg, 0);.     
17910 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69   }..      /* pri
17920 6e 74 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73  nt loop-counters
17930 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
17940 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
17950 26 20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74  & pArg->scanstat
17960 73 4f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64  sOn ){.        d
17970 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
17980 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20  (db, pArg);.    
17990 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
179a0 6e 61 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65  nalize the state
179b0 6d 65 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74  ment just execut
179c0 65 64 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c  ed. If this fail
179d0 73 2c 20 73 61 76 65 20 61 0a 20 20 20 20 20 20  s, save a.      
179e0 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65  ** copy of the e
179f0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74  rror message. Ot
17a00 68 65 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71  herwise, set zSq
17a10 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  l to point to th
17a20 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20  e.      ** next 
17a30 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65  statement to exe
17a40 63 75 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  cute. */.      r
17a50 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
17a60 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
17a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17a80 54 45 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20  TE_NOMEM ) rc = 
17a90 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc2;.      if( r
17aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17ab0 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a          zSql = z
17ac0 4c 65 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20  Leftover;.      
17ad0 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
17ae0 28 7a 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c  (zSql[0]) ) zSql
17af0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
17b00 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
17b10 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
17b20 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67  g = save_err_msg
17b30 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  (db);.      }.. 
17b40 20 20 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61       /* clear sa
17b50 76 65 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20  ved stmt handle 
17b60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
17b70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
17b80 67 2d 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  g->pStmt = NULL;
17b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ba0 20 7d 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20   } /* end while 
17bb0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  */..  return rc;
17bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
17bd0 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75  e memory previou
17be0 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
17bf0 20 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74   tableColumnList
17c00 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
17c10 69 64 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73  id freeColumnLis
17c20 74 28 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  t(char **azCol){
17c30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
17c40 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69  i=1; azCol[i]; i
17c50 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
17c60 5f 66 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b  _free(azCol[i]);
17c70 0a 20 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b  .  }.  /* azCol[
17c80 30 5d 20 69 73 20 61 20 73 74 61 74 69 63 20 73  0] is a static s
17c90 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  tring */.  sqlit
17ca0 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a  e3_free(azCol);.
17cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17cc0 61 20 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65  a list of pointe
17cd0 72 73 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68  rs to strings wh
17ce0 69 63 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65  ich are the name
17cf0 73 20 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75  s of all.** colu
17d00 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61  mns in table zTa
17d10 62 2e 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20  b.   The memory 
17d20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
17d30 73 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  s is dynamically
17d40 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
17d50 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73  d must be releas
17d60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
17d70 20 75 73 69 6e 67 20 61 20 73 75 62 73 65 71 75   using a subsequ
17d80 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  ent call.** to f
17d90 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  reeColumnList().
17da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c  .**.** The azCol
17db0 5b 30 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75  [0] entry is usu
17dc0 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65  ally NULL.  Howe
17dd0 76 65 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e  ver, if zTab con
17de0 74 61 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a  tains a rowid.**
17df0 20 76 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64   value that need
17e00 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76 65  s to be preserve
17e10 64 2c 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d  d, then azCol[0]
17e20 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
17e30 74 68 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  th the.** name o
17e40 66 20 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75  f the rowid colu
17e50 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  mn..**.** The fi
17e60 72 73 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  rst regular colu
17e70 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
17e80 69 73 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68  is azCol[1].  Th
17e90 65 20 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e  e list is termin
17ea0 61 74 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e  ated.** by an en
17eb0 74 72 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69  try with azCol[i
17ec0 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ]==0..*/.static 
17ed0 63 68 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75  char **tableColu
17ee0 6d 6e 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74  mnList(ShellStat
17ef0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
17f00 20 2a 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20   *zTab){.  char 
17f10 2a 2a 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73  **azCol = 0;.  s
17f20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17f30 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt;.  char *zSql
17f40 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30  ;.  int nCol = 0
17f50 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  ;.  int nAlloc =
17f60 20 30 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20   0;.  int nPK = 
17f70 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
17f80 65 72 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45  er of PRIMARY KE
17f90 59 20 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a  Y columns seen *
17fa0 2f 0a 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20  /.  int isIPK = 
17fb0 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
17fc0 66 20 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45  f one PRIMARY KE
17fd0 59 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65  Y column of type
17fe0 20 49 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e   INTEGER */.  in
17ff0 74 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  t preserveRowid 
18000 3d 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  = ShellHasFlag(p
18010 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65  , SHFLG_Preserve
18020 52 6f 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63  Rowid);.  int rc
18030 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
18040 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41  te3_mprintf("PRA
18050 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
18060 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20  Q", zTab);.  rc 
18070 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18080 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
18090 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
180a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
180b0 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63  (zSql);.  if( rc
180c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
180d0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
180e0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
180f0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
18100 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20   nCol>=nAlloc-2 
18110 29 7b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  ){.      nAlloc 
18120 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f  = nAlloc*2 + nCo
18130 6c 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a  l + 10;.      az
18140 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  Col = sqlite3_re
18150 61 6c 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c  alloc(azCol, nAl
18160 6c 6f 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c  loc*sizeof(azCol
18170 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
18180 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65 6c   azCol==0 ) shel
18190 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
181a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43  );.    }.    azC
181b0 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c  ol[++nCol] = sql
181c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
181d0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
181e0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
181f0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
18200 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
18210 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  tmt, 5) ){.     
18220 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nPK++;.      if
18230 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20  ( nPK==1.       
18240 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
18250 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
18260 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
18270 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20  ext(pStmt,2),.  
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52          "INTEGER
182a0 22 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  ")==0.      ){. 
182b0 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31         isIPK = 1
182c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
182d0 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30         isIPK = 0
182e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
182f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
18300 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
18310 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
18320 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f  return 0;.  azCo
18330 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f  l[0] = 0;.  azCo
18340 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a  l[nCol+1] = 0;..
18350 20 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f    /* The decisio
18360 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  n of whether or 
18370 6e 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c  not a rowid real
18380 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ly needs to be p
18390 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73  reserved.  ** is
183a0 20 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76   tricky.  We nev
183b0 65 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65  er need to prese
183c0 72 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20  rve a rowid for 
183d0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
183e0 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20  table.  ** or a 
183f0 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e  table with an IN
18400 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
18410 59 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c  Y.  We are unabl
18420 65 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20  e to preserve.  
18430 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62  ** rowids on tab
18440 6c 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f  les where the ro
18450 77 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69  wid is inaccessi
18460 62 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72  ble because ther
18470 65 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a  e are other.  **
18480 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
18490 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77  table named "row
184a0 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20  id", "_rowid_", 
184b0 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a  and "oid"..  */.
184c0 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f    if( preserveRo
184d0 77 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a  wid && isIPK ){.
184e0 20 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67      /* If a sing
184f0 6c 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  le PRIMARY KEY c
18500 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20  olumn with type 
18510 49 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e  INTEGER was seen
18520 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a  , then it.    **
18530 20 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69   might be an ali
18540 73 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44  se for the ROWID
18550 2e 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20  .  But it might 
18560 61 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55  also be a WITHOU
18570 54 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74  T ROWID.    ** t
18580 61 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45  able or a INTEGE
18590 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45  R PRIMARY KEY DE
185a0 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68  SC column, neith
185b0 65 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a  er of which are.
185c0 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69      ** ROWID ali
185d0 61 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e  ases.  To distin
185e0 67 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65  guish these case
185f0 73 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  s, check to see 
18600 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  if.    ** there 
18610 69 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20  is a "pk" entry 
18620 69 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  in "PRAGMA index
18630 5f 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77  _list".  There w
18640 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f  ill be.    ** no
18650 20 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74   "pk" index if t
18660 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72  he PRIMARY KEY r
18670 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61  eally is an alia
18680 73 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  s for the ROWID.
18690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  .    */.    zSql
186a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
186b0 74 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  tf("SELECT 1 FRO
186c0 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c  M pragma_index_l
186d0 69 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20  ist(%Q)".       
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67      " WHERE orig
18700 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b  in='pk'", zTab);
18710 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18720 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
18730 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
18740 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
18750 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
18760 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
18770 20 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e        freeColumn
18780 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  List(azCol);.   
18790 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
187a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
187b0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
187c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
187d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
187e0 20 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20    preserveRowid 
187f0 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  = rc==SQLITE_ROW
18800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73  ;.  }.  if( pres
18810 65 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20  erveRowid ){.   
18820 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76   /* Only preserv
18830 65 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77  e the rowid if w
18840 65 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d  e can find a nam
18850 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
18860 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f  .    ** rowid */
18870 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
18880 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20   *azRowid[] = { 
18890 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
188a0 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20  _", "oid" };.   
188b0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66   int i, j;.    f
188c0 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
188d0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ){.      for(i=1
188e0 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ; i<=nCol; i++){
188f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18900 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52  ite3_stricmp(azR
18910 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d  owid[j],azCol[i]
18920 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
18930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18940 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i>nCol ){.      
18950 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
18960 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nt, we know that
18970 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e   azRowid[j] is n
18980 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
18990 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  ny.        ** or
189a0 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e  dinary column in
189b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72   the table.  Ver
189c0 69 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64  ify that azRowid
189d0 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20  [j] is a valid. 
189e0 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66         ** name f
189f0 6f 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66  or the rowid bef
18a00 6f 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f  ore adding it to
18a10 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48   azCol[0].  WITH
18a20 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20  OUT ROWID.      
18a30 20 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c    ** tables will
18a40 20 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20   fail this last 
18a50 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  check */.       
18a60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
18a70 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
18a80 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62  ata(p->db,0,zTab
18a90 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c  ,azRowid[j],0,0,
18aa0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  0,0,0);.        
18ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ac0 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61  K ) azCol[0] = a
18ad0 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20  zRowid[j];.     
18ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18af0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18b00 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f  turn azCol;.}../
18b10 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20  *.** Toggle the 
18b20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65  reverse_unordere
18b30 64 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e  d_selects settin
18b40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
18b50 64 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72  d toggleSelectOr
18b60 64 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  der(sqlite3 *db)
18b70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18b80 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69   *pStmt = 0;.  i
18b90 6e 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b  nt iSetting = 0;
18ba0 0a 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30  .  char zStmt[10
18bb0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  0];.  sqlite3_pr
18bc0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52  epare_v2(db, "PR
18bd0 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
18be0 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c  rdered_selects",
18bf0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
18c00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
18c10 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
18c20 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53  TE_ROW ){.    iS
18c30 65 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  etting = sqlite3
18c40 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
18c50 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t, 0);.  }.  sql
18c60 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
18c70 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tmt);.  sqlite3_
18c80 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
18c90 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20  zStmt), zStmt,. 
18ca0 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65        "PRAGMA re
18cb0 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
18cc0 73 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69  selects(%d)", !i
18cd0 53 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69  Setting);.  sqli
18ce0 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74  te3_exec(db, zSt
18cf0 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  mt, 0, 0, 0);.}.
18d00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
18d10 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
18d20 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ack routine used
18d30 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65   for dumping the
18d40 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61   database..** Ea
18d50 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20  ch row received 
18d60 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  by this callback
18d70 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74   consists of a t
18d80 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  able name,.** th
18d90 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69  e table type ("i
18da0 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22  ndex" or "table"
18db0 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65  ) and SQL to cre
18dc0 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
18dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
18de0 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74  hould print text
18df0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72   sufficient to r
18e00 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c  ecreate the tabl
18e10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18e20 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76   dump_callback(v
18e30 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
18e40 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
18e50 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55  g, char **azNotU
18e60 73 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sed){.  int rc;.
18e70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
18e80 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  able;.  const ch
18e90 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e  ar *zType;.  con
18ea0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
18eb0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
18ec0 20 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70   (ShellState *)p
18ed0 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  Arg;..  UNUSED_P
18ee0 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73  ARAMETER(azNotUs
18ef0 65 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21  ed);.  if( nArg!
18f00 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29  =3 || azArg==0 )
18f10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61   return 0;.  zTa
18f20 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a  ble = azArg[0];.
18f30 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b    zType = azArg[
18f40 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41  1];.  zSql = azA
18f50 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74  rg[2];..  if( st
18f60 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
18f70 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
18f80 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
18f90 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45  intf(p->out, "DE
18fa0 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
18fb0 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a  _sequence;\n");.
18fc0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
18fd0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c  te3_strglob("sql
18fe0 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62  ite_stat?", zTab
18ff0 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  le)==0 ){.    ra
19000 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
19010 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
19020 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
19030 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
19040 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74  p(zTable, "sqlit
19050 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
19060 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
19070 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
19080 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49  zSql, "CREATE VI
19090 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30  RTUAL TABLE", 20
190a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
190b0 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20   *zIns;.    if( 
190c0 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65  !p->writableSche
190d0 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  ma ){.      raw_
190e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
190f0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
19100 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a  schema=ON;\n");.
19110 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
19120 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  eSchema = 1;.   
19130 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71   }.    zIns = sq
19140 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
19150 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
19160 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
19170 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e  (type,name,tbl_n
19180 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c  ame,rootpage,sql
19190 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45  )".       "VALUE
191a0 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27  S('table','%q','
191b0 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20  %q',0,'%q');",. 
191c0 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54        zTable, zT
191d0 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  able, zSql);.   
191e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
191f0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e  out, "%s\n", zIn
19200 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
19210 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20  free(zIns);.    
19220 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
19230 65 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65  e{.    printSche
19240 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
19250 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d  Sql, ";\n");.  }
19260 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ..  if( strcmp(z
19270 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d  Type, "table")==
19280 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65  0 ){.    ShellTe
19290 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20  xt sSelect;.    
192a0 53 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65  ShellText sTable
192b0 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  ;.    char **azC
192c0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ol;.    int i;. 
192d0 20 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65     char *savedDe
192e0 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74  stTable;.    int
192f0 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20   savedMode;..   
19300 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f   azCol = tableCo
19310 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62  lumnList(p, zTab
19320 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  le);.    if( azC
19330 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol==0 ){.      p
19340 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
19350 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
19360 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71  .    /* Always q
19370 75 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  uote the table n
19380 61 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20  ame, even if it 
19390 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75  appears to be pu
193a0 72 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a  re ascii,.    **
193b0 20 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61   in case it is a
193c0 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49   keyword. Ex:  I
193d0 4e 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c  NSERT INTO "tabl
193e0 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  e" ... */.    in
193f0 69 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b  itText(&sTable);
19400 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
19410 26 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c  &sTable, zTable,
19420 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c   quoteChar(zTabl
19430 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70  e));.    /* If p
19440 72 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f  reserving the ro
19450 77 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d  wid, add a colum
19460 6e 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65  n list after the
19470 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20   table name..   
19480 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72   ** In other wor
19490 64 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54  ds:  "INSERT INT
194a0 4f 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c  O tab(rowid,a,b,
194b0 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e  c,...) VALUES(..
194c0 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65  .)".    ** inste
194d0 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  ad of the usual 
194e0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62  "INSERT INTO tab
194f0 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20   VALUES(...)".. 
19500 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a     */.    if( az
19510 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
19520 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
19530 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20  le, "(", 0);.   
19540 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
19550 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c  Table, azCol[0],
19560 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
19570 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
19580 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  +){.        appe
19590 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
195a0 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ",", 0);.       
195b0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
195c0 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ble, azCol[i], q
195d0 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
195e0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
195f0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
19600 54 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a  Table, ")", 0);.
19610 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75      }..    /* Bu
19620 69 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ild an appropria
19630 74 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  te SELECT statem
19640 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54  ent */.    initT
19650 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
19660 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
19670 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20  Select, "SELECT 
19680 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
19690 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zCol[0] ){.     
196a0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
196b0 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  lect, azCol[0], 
196c0 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
196d0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
196e0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ,", 0);.    }.  
196f0 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
19700 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
19710 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
19720 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20  lect, azCol[i], 
19730 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
19740 69 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  i]));.      if( 
19750 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20  azCol[i+1] ){.  
19760 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19770 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20  (&sSelect, ",", 
19780 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19790 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e  }.    freeColumn
197a0 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  List(azCol);.   
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 22 20 46 52 4f 4d 20 22 2c 20  lect, " FROM ", 
197d0 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  0);.    appendTe
197e0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61  xt(&sSelect, zTa
197f0 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
19800 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61  Table));..    sa
19810 76 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70  vedDestTable = p
19820 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  ->zDestTable;.  
19830 20 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d    savedMode = p-
19840 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44  >mode;.    p->zD
19850 65 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c  estTable = sTabl
19860 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65  e.z;.    p->mode
19870 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f   = p->cMode = MO
19880 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72  DE_Insert;.    r
19890 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70  c = shell_exec(p
198a0 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b  , sSelect.z, 0);
198b0 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
198c0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)==SQLITE_CORRU
198d0 50 54 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  PT ){.      raw_
198e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
198f0 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49  /****** CORRUPTI
19900 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a  ON ERROR *******
19910 2f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67  /\n");.      tog
19920 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70  gleSelectOrder(p
19930 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65  ->db);.      she
19940 6c 6c 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65  ll_exec(p, sSele
19950 63 74 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20  ct.z, 0);.      
19960 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
19970 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  r(p->db);.    }.
19980 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
19990 65 20 3d 20 73 61 76 65 64 44 65 73 74 54 61 62  e = savedDestTab
199a0 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  le;.    p->mode 
199b0 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20  = savedMode;.   
199c0 20 66 72 65 65 54 65 78 74 28 26 73 54 61 62 6c   freeText(&sTabl
199d0 65 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  e);.    freeText
199e0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
199f0 69 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72  if( rc ) p->nErr
19a00 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
19a10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
19a20 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75   zQuery.  Use du
19a30 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73  mp_callback() as
19a40 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
19a50 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a  utine so that.**
19a60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19a70 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f   the query are o
19a80 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61  utput as SQL sta
19a90 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
19aa0 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54  f we get a SQLIT
19ab0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c  E_CORRUPT error,
19ac0 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79   rerun the query
19ad0 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67   after appending
19ae0 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f  .** "ORDER BY ro
19af0 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65  wid DESC" to the
19b00 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   end..*/.static 
19b10 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64  int run_schema_d
19b20 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
19b30 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f  llState *p,.  co
19b40 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79  nst char *zQuery
19b50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
19b60 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
19b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19b80 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  xec(p->db, zQuer
19b90 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  y, dump_callback
19ba0 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  , p, &zErr);.  i
19bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
19bc0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61  RRUPT ){.    cha
19bd0 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20  r *zQ2;.    int 
19be0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  len = strlen30(z
19bf0 51 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f  Query);.    raw_
19c00 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
19c10 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49  /****** CORRUPTI
19c20 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a  ON ERROR *******
19c30 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  /\n");.    if( z
19c40 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Err ){.      utf
19c50 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
19c60 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a   "/****** %s ***
19c70 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
19c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
19c90 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
19ca0 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  zErr = 0;.    }.
19cb0 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63      zQ2 = malloc
19cc0 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20  ( len+100 );.   
19cd0 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65   if( zQ2==0 ) re
19ce0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
19cf0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65  ite3_snprintf(le
19d00 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20  n+100, zQ2, "%s 
19d10 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
19d20 45 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20  ESC", zQuery);. 
19d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
19d40 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c  exec(p->db, zQ2,
19d50 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
19d60 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  p, &zErr);.    i
19d70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
19d80 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
19d90 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f  t, "/****** ERRO
19da0 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  R: %s ******/\n"
19db0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c  , zErr);.    }el
19dc0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
19dd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
19de0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
19df0 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
19e00 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a   free(zQ2);.  }.
19e10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19e20 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68 65  /*.** Text of he
19e30 6c 70 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a 0a  lp messages..**.
19e40 2a 2a 20 54 68 65 20 68 65 6c 70 20 74 65 78 74  ** The help text
19e50 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69   for each indivi
19e60 64 75 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65 67  dual command beg
19e70 69 6e 73 20 77 69 74 68 20 61 20 6c 69 6e 65 20  ins with a line 
19e80 74 68 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77  that starts.** w
19e90 69 74 68 20 22 2e 22 2e 20 20 53 75 62 73 65 71  ith ".".  Subseq
19ea0 75 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 73  uent lines are s
19eb0 75 70 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66 6f  upplimental info
19ec0 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
19ed0 68 65 72 65 20 6d 75 73 74 20 62 65 20 74 77 6f  here must be two
19ee0 20 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20   or more spaces 
19ef0 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
19f00 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  of the command a
19f10 6e 64 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20  nd the.** start 
19f20 6f 66 20 74 68 65 20 64 65 73 63 72 69 70 74 69  of the descripti
19f30 6f 6e 20 6f 66 20 77 68 61 74 20 74 68 61 74 20  on of what that 
19f40 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a 2f  command does..*/
19f50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
19f60 61 72 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20 3d  ar *(azHelp[]) =
19f70 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   {.#if defined(S
19f80 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
19f90 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
19fa0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19fb0 54 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69  TABLE).  ".archi
19fc0 76 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  ve ...          
19fd0 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72     Manage SQL ar
19fe0 63 68 69 76 65 73 22 2c 0a 20 20 22 20 20 20 45  chives",.  "   E
19ff0 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74  ach command must
1a000 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
1a010 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1a020 6e 67 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20  ng options:",.  
1a030 22 20 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65 61  "     -c, --crea
1a040 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
1a050 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 61 72   Create a new ar
1a060 63 68 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20  chive",.  "     
1a070 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20  -u, --update    
1a080 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20 66             Add f
1a090 69 6c 65 73 20 6f 72 20 75 70 64 61 74 65 20 66  iles or update f
1a0a0 69 6c 65 73 20 77 69 74 68 20 63 68 61 6e 67 65  iles with change
1a0b0 64 20 6d 74 69 6d 65 22 2c 0a 20 20 22 20 20 20  d mtime",.  "   
1a0c0 20 20 2d 69 2c 20 2d 2d 69 6e 73 65 72 74 20 20    -i, --insert  
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b               Lik
1a0e0 65 20 2d 75 20 62 75 74 20 61 6c 77 61 79 73 20  e -u but always 
1a0f0 61 64 64 20 65 76 65 6e 20 69 66 20 6d 74 69 6d  add even if mtim
1a100 65 20 75 6e 63 68 61 6e 67 65 64 22 2c 0a 20 20  e unchanged",.  
1a110 22 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74  "     -t, --list
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a130 20 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f   List contents o
1a140 66 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  f archive",.  " 
1a150 20 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63      -x, --extrac
1a160 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  t              E
1a170 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
1a180 6d 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20  m archive",.  " 
1a190 20 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d    Optional argum
1a1a0 65 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ents:",.  "     
1a1b0 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20  -v, --verbose   
1a1c0 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74             Print
1a1d0 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61   each filename a
1a1e0 73 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65  s it is processe
1a1f0 64 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46  d",.  "     -f F
1a200 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45  ILE, --file FILE
1a210 20 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f         Operate o
1a220 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28  n archive FILE (
1a230 64 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65  default is curre
1a240 6e 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20  nt db)",.  "    
1a250 20 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65   -a FILE, --appe
1a260 6e 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72  nd FILE     Oper
1a270 61 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e  ate on FILE open
1a280 65 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e  ed using the apn
1a290 64 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20  dvfs VFS",.  "  
1a2a0 20 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72     -C DIR, --dir
1a2b0 65 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68  ectory DIR    Ch
1a2c0 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
1a2d0 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78  y DIR to read/ex
1a2e0 74 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20  tract files",.  
1a2f0 22 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72  "     -n, --dryr
1a300 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
1a310 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68   Show the SQL th
1a320 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63  at would have oc
1a330 63 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45  curred",.  "   E
1a340 78 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20  xamples:",.  "  
1a350 20 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69     .ar -cf archi
1a360 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20  ve.sar foo bar  
1a370 23 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65  # Create archive
1a380 2e 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20  .sar from files 
1a390 66 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20  foo and bar",.  
1a3a0 22 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72  "     .ar -tf ar
1a3b0 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
1a3c0 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72     # List member
1a3d0 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72  s of archive.sar
1a3e0 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
1a3f0 78 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  xvf archive.sar 
1a400 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73          # Verbos
1a410 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65  ely extract file
1a420 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73  s from archive.s
1a430 61 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61  ar",.  "   See a
1a440 6c 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  lso:",.  "      
1a450 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
1a460 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
1a470 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
1a480 22 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  ",.#endif.#ifnde
1a490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a4a0 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
1a4b0 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
1a4c0 20 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74          Show aut
1a4d0 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b  horizer callback
1a4e0 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62  s",.#endif.  ".b
1a4f0 61 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20  ackup ?DB? FILE 
1a500 20 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42         Backup DB
1a510 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e   (default \"main
1a520 5c 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  \") to FILE",.  
1a530 22 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64  "       --append
1a540 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
1a550 74 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a  the appendvfs",.
1a560 20 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e    "       --asyn
1a570 63 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72  c             Wr
1a580 69 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68  ite to FILE with
1a590 6f 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e  out a journal an
1a5a0 64 20 77 69 74 68 6f 75 74 20 66 73 79 6e 63 28  d without fsync(
1a5b0 29 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c  )",.  ".bail on|
1a5c0 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  off             
1a5d0 53 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69  Stop after hitti
1a5e0 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65  ng an error.  De
1a5f0 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e  fault OFF",.  ".
1a600 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20  binary on|off   
1a610 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e          Turn bin
1a620 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72  ary output on or
1a630 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f   off.  Default O
1a640 46 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45  FF",.  ".cd DIRE
1a650 43 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 20  CTORY           
1a660 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b   Change the work
1a670 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ing directory to
1a680 20 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22   DIRECTORY",.  "
1a690 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20  .changes on|off 
1a6a0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75           Show nu
1a6b0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61  mber of rows cha
1a6c0 6e 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20  nged by SQL",.  
1a6d0 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20  ".check GLOB    
1a6e0 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69            Fail i
1a6f0 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e  f output since .
1a700 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f  testcase does no
1a710 74 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c  t match",.  ".cl
1a720 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20  one NEWDB       
1a730 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
1a740 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
1a750 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
1a760 74 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74  tabase",.  ".dat
1a770 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20  abases          
1a780 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
1a790 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
1a7a0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 22  ached databases"
1a7b0 2c 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f  ,.  ".dbconfig ?
1a7c0 6f 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69  op? ?val?     Li
1a7d0 73 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c  st or change sql
1a7e0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29  ite3_db_config()
1a7f0 20 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64   options",.  ".d
1a800 62 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20  binfo ?DB?      
1a810 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
1a820 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  us information a
1a830 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
1a840 65 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41  e",.  ".dump ?TA
1a850 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20  BLE? ...        
1a860 52 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62  Render all datab
1a870 61 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53  ase content as S
1a880 51 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f  QL",.  "   Optio
1a890 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d  ns:",.  "     --
1a8a0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
1a8b0 20 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57       Include ROW
1a8c0 49 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ID values in the
1a8d0 20 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20   output",.  "   
1a8e0 20 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20    --newlines    
1a8f0 20 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75           Allow u
1a900 6e 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65  nescaped newline
1a910 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f   characters in o
1a920 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41  utput",.  "   TA
1a930 42 4c 45 20 69 73 20 61 20 4c 49 4b 45 20 70 61  BLE is a LIKE pa
1a940 74 74 65 72 6e 20 66 6f 72 20 74 68 65 20 74 61  ttern for the ta
1a950 62 6c 65 73 20 74 6f 20 64 75 6d 70 22 2c 0a 20  bles to dump",. 
1a960 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20   ".echo on|off  
1a970 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20             Turn 
1a980 63 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20  command echo on 
1a990 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 65 71 70  or off",.  ".eqp
1a9a0 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e 2e   on|off|full|...
1a9b0 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64       Enable or d
1a9c0 69 73 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63  isable automatic
1a9d0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1a9e0 4c 41 4e 22 2c 0a 20 20 22 20 20 20 4f 74 68 65  LAN",.  "   Othe
1a9f0 72 20 4d 6f 64 65 73 3a 22 2c 0a 23 69 66 64 65  r Modes:",.#ifde
1aa00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1aa10 20 22 20 20 20 20 20 20 74 65 73 74 20 20 20 20   "      test    
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
1aa30 6f 77 20 72 61 77 20 45 58 50 4c 41 49 4e 20 51  ow raw EXPLAIN Q
1aa40 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70 75 74  UERY PLAN output
1aa50 22 2c 0a 20 20 22 20 20 20 20 20 20 74 72 61 63  ",.  "      trac
1aa60 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1aa70 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20    Like \"full\" 
1aa80 62 75 74 20 61 6c 73 6f 20 65 6e 61 62 6c 65 20  but also enable 
1aa90 5c 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72  \"PRAGMA vdbe_tr
1aaa0 61 63 65 5c 22 22 2c 0a 23 65 6e 64 69 66 0a 20  ace\"",.#endif. 
1aab0 20 22 20 20 20 20 20 20 74 72 69 67 67 65 72 20   "      trigger 
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69                Li
1aad0 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20  ke \"full\" but 
1aae0 61 6c 73 6f 20 73 68 6f 77 20 74 72 69 67 67 65  also show trigge
1aaf0 72 20 62 79 74 65 63 6f 64 65 22 2c 0a 20 20 22  r bytecode",.  "
1ab00 2e 65 78 63 65 6c 20 20 20 20 20 20 20 20 20 20  .excel          
1ab10 20 20 20 20 20 20 20 20 20 44 69 73 70 6c 61 79           Display
1ab20 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6e   the output of n
1ab30 65 78 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61  ext command in a
1ab40 20 73 70 72 65 61 64 73 68 65 65 74 22 2c 0a 20   spreadsheet",. 
1ab50 20 22 2e 65 78 69 74 20 3f 43 4f 44 45 3f 20 20   ".exit ?CODE?  
1ab60 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
1ab70 74 68 69 73 20 70 72 6f 67 72 61 6d 20 77 69 74  this program wit
1ab80 68 20 72 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f  h return-code CO
1ab90 44 45 22 2c 0a 20 20 22 2e 65 78 70 65 72 74 20  DE",.  ".expert 
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53   EXPERIMENTAL. S
1abc0 75 67 67 65 73 74 20 69 6e 64 65 78 65 73 20 66  uggest indexes f
1abd0 6f 72 20 73 70 65 63 69 66 69 65 64 20 71 75 65  or specified que
1abe0 72 69 65 73 22 2c 0a 2f 2a 20 42 65 63 61 75 73  ries",./* Becaus
1abf0 65 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63  e explain mode c
1ac00 6f 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69  omes on automati
1ac10 63 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22  cally now, the "
1ac20 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a  .explain" mode.*
1ac30 2a 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  * is removed fro
1ac40 6d 20 74 68 65 20 68 65 6c 70 20 73 63 72 65 65  m the help scree
1ac50 6e 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20  n.  It is still 
1ac60 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65  supported for le
1ac70 67 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f  gacy, however */
1ac80 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e  ./*".explain ?on
1ac90 7c 6f 66 66 7c 61 75 74 6f 3f 20 20 20 54 75 72  |off|auto?   Tur
1aca0 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  n EXPLAIN output
1acb0 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20   mode on or off 
1acc0 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 22  or to automatic"
1acd0 2c 2a 2f 0a 20 20 22 2e 66 69 6c 65 63 74 72 6c  ,*/.  ".filectrl
1ace0 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20 20   CMD ...        
1acf0 52 75 6e 20 76 61 72 69 6f 75 73 20 73 71 6c 69  Run various sqli
1ad00 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
1ad10 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 22 2c 0a  () operations",.
1ad20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 75                Ru
1ad40 6e 20 5c 22 2e 66 69 6c 65 63 74 72 6c 5c 22 20  n \".filectrl\" 
1ad50 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
1ad60 73 20 66 6f 72 20 64 65 74 61 69 6c 73 22 2c 0a  s for details",.
1ad70 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f    ".fullschema ?
1ad80 2d 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f 77  --indent?   Show
1ad90 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20   schema and the 
1ada0 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74  content of sqlit
1adb0 65 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c 0a  e_stat tables",.
1adc0 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f    ".headers on|o
1add0 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e  ff          Turn
1ade0 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64   display of head
1adf0 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ers on or off",.
1ae00 20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f 20    ".help ?-all? 
1ae10 3f 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f 77  ?PATTERN?   Show
1ae20 20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20 50   help text for P
1ae30 41 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d 70  ATTERN",.  ".imp
1ae40 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20 20  ort FILE TABLE  
1ae50 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61       Import data
1ae60 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20   from FILE into 
1ae70 54 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66 20  TABLE",.#ifndef 
1ae80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54  SQLITE_OMIT_TEST
1ae90 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70  _CONTROL.  ".imp
1aea0 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c  oster INDEX TABL
1aeb0 45 20 20 20 20 43 72 65 61 74 65 20 69 6d 70 6f  E    Create impo
1aec0 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45  ster table TABLE
1aed0 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 22   on index INDEX"
1aee0 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64  ,.#endif.  ".ind
1aef0 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20  exes ?TABLE?    
1af00 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73 20       Show names 
1af10 6f 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20 22  of indexes",.  "
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af30 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
1af40 42 4c 45 20 69 73 20 73 70 65 63 69 66 69 65 64  BLE is specified
1af50 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65  , only show inde
1af60 78 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20 20  xes for",.  "   
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af80 20 20 20 20 20 20 20 20 74 61 62 6c 65 73 20 6d          tables m
1af90 61 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75 73  atching TABLE us
1afa0 69 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  ing the LIKE ope
1afb0 72 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66 20  rator.",.#ifdef 
1afc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
1afd0 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61 63  TRACE.  ".iotrac
1afe0 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  e FILE          
1aff0 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61    Enable I/O dia
1b000 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20  gnostic logging 
1b010 74 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69 66  to FILE",.#endif
1b020 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49  .  ".limit ?LIMI
1b030 54 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69 73  T? ?VAL?     Dis
1b040 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74  play or change t
1b050 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53  he value of an S
1b060 51 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20 20  QLITE_LIMIT",.  
1b070 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20  ".lint OPTIONS  
1b080 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72 74            Report
1b090 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d   potential schem
1b0a0 61 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22 20  a issues.",.  " 
1b0b0 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20      Options:",. 
1b0c0 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69   "        fkey-i
1b0d0 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20  ndexes     Find 
1b0e0 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20  missing foreign 
1b0f0 6b 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23 69  key indexes",.#i
1b100 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b110 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
1b120 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20 3f  .  ".load FILE ?
1b130 45 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f 61  ENTRY?       Loa
1b140 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c  d an extension l
1b150 69 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66 0a  ibrary",.#endif.
1b160 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66    ".log FILE|off
1b170 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72 6e              Turn
1b180 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f   logging on or o
1b190 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65  ff.  FILE can be
1b1a0 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22 2c   stderr/stdout",
1b1b0 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f  .  ".mode MODE ?
1b1c0 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65 74  TABLE?       Set
1b1d0 20 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a 20   output mode",. 
1b1e0 20 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e 65   "   MODE is one
1b1f0 20 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20 61   of:",.  "     a
1b200 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f  scii    Columns/
1b210 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62  rows delimited b
1b220 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 22  y 0x1F and 0x1E"
1b230 2c 0a 20 20 22 20 20 20 20 20 63 73 76 20 20 20  ,.  "     csv   
1b240 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74     Comma-separat
1b250 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 20  ed values",.  " 
1b260 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66      column   Lef
1b270 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e  t-aligned column
1b280 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29  s.  (See .width)
1b290 22 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c 20  ",.  "     html 
1b2a0 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e      HTML <table>
1b2b0 20 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20 20   code",.  "     
1b2c0 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73  insert   SQL ins
1b2d0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66  ert statements f
1b2e0 6f 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20 20  or TABLE",.  "  
1b2f0 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20     line     One 
1b300 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22 2c  value per line",
1b310 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20 20  .  "     list   
1b320 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74    Values delimit
1b330 65 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20 20  ed by \"|\"",.  
1b340 22 20 20 20 20 20 71 75 6f 74 65 20 20 20 20 45  "     quote    E
1b350 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61 73  scape answers as
1b360 20 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20 20   for SQL",.  "  
1b370 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62 2d     tabs     Tab-
1b380 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73  separated values
1b390 22 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20 20  ",.  "     tcl  
1b3a0 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65      TCL list ele
1b3b0 6d 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c 6c  ments",.  ".null
1b3c0 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20  value STRING    
1b3d0 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20 69      Use STRING i
1b3e0 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20  n place of NULL 
1b3f0 76 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e 63  values",.  ".onc
1b400 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20 20  e (-e|-x|FILE)  
1b410 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72 20       Output for 
1b420 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f 6d  the next SQL com
1b430 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49 4c  mand only to FIL
1b440 45 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20 46  E",.  "     If F
1b450 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68 20  ILE begins with 
1b460 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61 73  '|' then open as
1b470 20 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20 20   a pipe",.  "   
1b480 20 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73 3a    Other options:
1b490 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65 20  ",.  "       -e 
1b4a0 20 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65 6d     Invoke system
1b4b0 20 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a 20   text editor",. 
1b4c0 20 22 20 20 20 20 20 20 20 2d 78 20 20 20 20 4f   "       -x    O
1b4d0 70 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64 73  pen in a spreads
1b4e0 68 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e 20  heet",.  ".open 
1b4f0 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f  ?OPTIONS? ?FILE?
1b500 20 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69 6e     Close existin
1b510 67 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  g database and r
1b520 65 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20 22  eopen FILE",.  "
1b530 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a       Options:",.
1b540 20 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70 70    "        --app
1b550 65 6e 64 20 20 20 20 20 20 20 20 55 73 65 20 61  end        Use a
1b560 70 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70 65  ppendvfs to appe
1b570 6e 64 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  nd database to t
1b580 68 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22 2c  he end of FILE",
1b590 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b5a0 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a  NABLE_DESERIALIZ
1b5b0 45 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 64  E.  "        --d
1b5c0 65 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f 61  eserialize   Loa
1b5d0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75 73  d into memory us
1b5e0 65 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73  eing sqlite3_des
1b5f0 65 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20 22  erialize()",.  "
1b600 20 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62 20          --hexdb 
1b610 20 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68 65          Load the
1b620 20 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62 74   output of \"dbt
1b630 6f 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e 2d  otxt\" as an in-
1b640 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 22  memory database"
1b650 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 6d  ,.  "        --m
1b660 61 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61 78  axsize N     Max
1b670 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d 2d  imum size for --
1b680 68 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65 72  hexdb or --deser
1b690 69 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73 65  ialized database
1b6a0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20 20  ",.#endif.  "   
1b6b0 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20 20       --new      
1b6c0 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20       Initialize 
1b6d0 46 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74 79  FILE to an empty
1b6e0 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20   database",.  " 
1b6f0 20 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e 6c         --readonl
1b700 79 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c 45  y      Open FILE
1b710 20 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22 20   readonly",.  " 
1b720 20 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20 20         --zip    
1b730 20 20 20 20 20 20 20 46 49 4c 45 20 69 73 20 61         FILE is a
1b740 20 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a 20   ZIP archive",. 
1b750 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 3f   ".output ?FILE?
1b760 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20             Send 
1b770 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20 6f  output to FILE o
1b780 72 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c 45  r stdout if FILE
1b790 20 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20 20   is omitted",.  
1b7a0 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65  "     If FILE be
1b7b0 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68  gins with '|' th
1b7c0 65 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61 20  en open it as a 
1b7d0 70 69 70 65 2e 22 2c 0a 20 20 22 2e 70 61 72 61  pipe.",.  ".para
1b7e0 6d 65 74 65 72 20 43 4d 44 20 2e 2e 2e 20 20 20  meter CMD ...   
1b7f0 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 70      Manage SQL p
1b800 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e 67  arameter binding
1b810 73 22 2c 0a 20 20 22 20 20 20 63 6c 65 61 72 20  s",.  "   clear 
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 45 72 61 73 65 20 61 6c 6c 20 62 69 6e 64    Erase all bind
1b840 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 69 6e 69  ings",.  "   ini
1b850 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1b860 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20       Initialize 
1b870 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 74  the TEMP table t
1b880 68 61 74 20 68 6f 6c 64 73 20 62 69 6e 64 69 6e  hat holds bindin
1b890 67 73 22 2c 0a 20 20 22 20 20 20 6c 69 73 74 20  gs",.  "   list 
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8b0 20 20 20 4c 69 73 74 20 74 68 65 20 63 75 72 72     List the curr
1b8c0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62 69  ent parameter bi
1b8d0 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 73  ndings",.  "   s
1b8e0 65 74 20 50 41 52 41 4d 45 54 45 52 20 56 41 4c  et PARAMETER VAL
1b8f0 55 45 20 20 20 20 20 47 69 76 65 6e 20 53 51 4c  UE     Given SQL
1b900 20 70 61 72 61 6d 65 74 65 72 20 50 41 52 41 4d   parameter PARAM
1b910 45 54 45 52 20 61 20 76 61 6c 75 65 20 6f 66 20  ETER a value of 
1b920 56 41 4c 55 45 22 2c 0a 20 20 22 20 20 20 20 20  VALUE",.  "     
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 20 20 20 50 41 52 41 4d 45 54 45 52 20        PARAMETER 
1b950 73 68 6f 75 6c 64 20 73 74 61 72 74 20 77 69 74  should start wit
1b960 68 20 27 24 27 2c 20 27 3a 27 2c 20 27 40 27 2c  h '$', ':', '@',
1b970 20 6f 72 20 27 3f 27 22 2c 0a 20 20 22 20 20 20   or '?'",.  "   
1b980 75 6e 73 65 74 20 50 41 52 41 4d 45 54 45 52 20  unset PARAMETER 
1b990 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 50          Remove P
1b9a0 41 52 41 4d 45 54 45 52 20 66 72 6f 6d 20 74 68  ARAMETER from th
1b9b0 65 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65 22  e binding table"
1b9c0 2c 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49  ,.  ".print STRI
1b9d0 4e 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72  NG...         Pr
1b9e0 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49  int literal STRI
1b9f0 4e 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  NG",.#ifndef SQL
1ba00 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
1ba10 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e 70  S_CALLBACK.  ".p
1ba20 72 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20 20  rogress N       
1ba30 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70 72         Invoke pr
1ba40 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 61  ogress handler a
1ba50 66 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70 63  fter every N opc
1ba60 6f 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c  odes",.  "   --l
1ba70 69 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20 20  imit N          
1ba80 20 20 20 20 20 20 20 49 6e 74 65 72 72 75 70 74         Interrupt
1ba90 20 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65 73   after N progres
1baa0 73 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20  s callbacks",.  
1bab0 22 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20  "   --once      
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f                Do
1bad0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1bae0 65 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65 72  e progress inter
1baf0 72 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71  rupt",.  "   --q
1bb00 75 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20 20  uiet|-q         
1bb10 20 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75 74         No output
1bb20 20 65 78 63 65 70 74 20 61 74 20 69 6e 74 65 72   except at inter
1bb30 72 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d  rupts",.  "   --
1bb40 72 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  reset           
1bb50 20 20 20 20 20 20 20 20 52 65 73 65 74 20 74 68          Reset th
1bb60 65 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63 68  e count for each
1bb70 20 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65 72   input and inter
1bb80 72 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20 20  rupt",.#endif.  
1bb90 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f  ".prompt MAIN CO
1bba0 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61 63  NTINUE    Replac
1bbb0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70  e the standard p
1bbc0 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75 69  rompts",.  ".qui
1bbd0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1bbe0 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
1bbf0 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61  rogram",.  ".rea
1bc00 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  d FILE          
1bc10 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74 20       Read input 
1bc20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 23 69 66 20  from FILE",.#if 
1bc30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1bc40 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1bc50 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
1bc60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41  LITE_ENABLE_DBPA
1bc70 47 45 5f 56 54 41 42 29 0a 20 20 22 2e 72 65 63  GE_VTAB).  ".rec
1bc80 6f 76 65 72 20 20 20 20 20 20 20 20 20 20 20 20  over            
1bc90 20 20 20 20 20 52 65 63 6f 76 65 72 20 61 73 20       Recover as 
1bca0 6d 75 63 68 20 64 61 74 61 20 61 73 20 70 6f 73  much data as pos
1bcb0 73 69 62 6c 65 20 66 72 6f 6d 20 63 6f 72 72 75  sible from corru
1bcc0 70 74 20 64 62 2e 22 2c 0a 23 65 6e 64 69 66 0a  pt db.",.#endif.
1bcd0 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f    ".restore ?DB?
1bce0 20 46 49 4c 45 20 20 20 20 20 20 20 52 65 73 74   FILE       Rest
1bcf0 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44  ore content of D
1bd00 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69  B (default \"mai
1bd10 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c  n\") from FILE",
1bd20 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20  .  ".save FILE  
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1bd40 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
1bd50 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 22  abase into FILE"
1bd60 2c 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20  ,.  ".scanstats 
1bd70 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 54 75  on|off        Tu
1bd80 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  rn sqlite3_stmt_
1bd90 73 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74  scanstatus() met
1bda0 72 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  rics on or off",
1bdb0 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54  .  ".schema ?PAT
1bdc0 54 45 52 4e 3f 20 20 20 20 20 20 20 20 53 68 6f  TERN?        Sho
1bdd0 77 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  w the CREATE sta
1bde0 74 65 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67  tements matching
1bdf0 20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 20 20   PATTERN",.  "  
1be00 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1be10 22 20 20 20 20 20 20 20 20 20 2d 2d 69 6e 64 65  "         --inde
1be20 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 54 72  nt            Tr
1be30 79 20 74 6f 20 70 72 65 74 74 79 2d 70 72 69 6e  y to pretty-prin
1be40 74 20 74 68 65 20 73 63 68 65 6d 61 22 2c 0a 20  t the schema",. 
1be50 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 4f 50 54   ".selftest ?OPT
1be60 49 4f 4e 53 3f 20 20 20 20 20 20 52 75 6e 20 74  IONS?      Run t
1be70 65 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ests defined in 
1be80 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62  the SELFTEST tab
1be90 6c 65 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69  le",.  "    Opti
1bea0 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20  ons:",.  "      
1beb0 20 2d 2d 69 6e 69 74 20 20 20 20 20 20 20 20 20   --init         
1bec0 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
1bed0 65 77 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  ew SELFTEST tabl
1bee0 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 76  e",.  "       -v
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75     Verbose outpu
1bf10 74 22 2c 0a 20 20 22 2e 73 65 70 61 72 61 74 6f  t",.  ".separato
1bf20 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20  r COL ?ROW?     
1bf30 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d  Change the colum
1bf40 6e 20 61 6e 64 20 72 6f 77 20 73 65 70 61 72 61  n and row separa
1bf50 74 6f 72 73 22 2c 0a 23 69 66 20 64 65 66 69 6e  tors",.#if defin
1bf60 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1bf70 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65  _SESSION).  ".se
1bf80 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44  ssion ?NAME? CMD
1bf90 20 2e 2e 2e 20 20 43 72 65 61 74 65 20 6f 72 20   ...  Create or 
1bfa0 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73  control sessions
1bfb0 22 2c 0a 20 20 22 20 20 20 53 75 62 63 6f 6d 6d  ",.  "   Subcomm
1bfc0 61 6e 64 73 3a 22 2c 0a 20 20 22 20 20 20 20 20  ands:",.  "     
1bfd0 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20 20  attach TABLE    
1bfe0 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68 20           Attach 
1bff0 54 41 42 4c 45 22 2c 0a 20 20 22 20 20 20 20 20  TABLE",.  "     
1c000 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20  changeset FILE  
1c010 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
1c020 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20   changeset into 
1c030 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63  FILE",.  "     c
1c040 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
1c050 20 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e          Close on
1c060 65 20 73 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20  e session",.  " 
1c070 20 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c      enable ?BOOL
1c080 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74  EAN?         Set
1c090 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e   or query the en
1c0a0 61 62 6c 65 20 62 69 74 22 2c 0a 20 20 22 20 20  able bit",.  "  
1c0b0 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e     filter GLOB..
1c0c0 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a 65  .           Reje
1c0d0 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  ct tables matchi
1c0e0 6e 67 20 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20  ng GLOBs",.  "  
1c0f0 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f     indirect ?BOO
1c100 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b  LEAN?       Mark
1c110 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 69 6e   or query the in
1c120 64 69 72 65 63 74 20 73 74 61 74 75 73 22 2c 0a  direct status",.
1c130 20 20 22 20 20 20 20 20 69 73 65 6d 70 74 79 20    "     isempty 
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 51 75 65 72 79 20 77 68 65 74 68 65 72 20 74   Query whether t
1c160 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d  he session is em
1c170 70 74 79 22 2c 0a 20 20 22 20 20 20 20 20 6c 69  pty",.  "     li
1c180 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1c190 20 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72         List curr
1c1a0 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69  ently open sessi
1c1b0 6f 6e 20 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20  on names",.  "  
1c1c0 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20     open DB NAME 
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e              Open
1c1e0 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f   a new session o
1c1f0 6e 20 44 42 22 2c 0a 20 20 22 20 20 20 20 20 70  n DB",.  "     p
1c200 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20  atchset FILE    
1c210 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
1c220 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49  patchset into FI
1c230 4c 45 22 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e  LE",.  "   If ?N
1c240 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c  AME? is omitted,
1c250 20 74 68 65 20 66 69 72 73 74 20 64 65 66 69 6e   the first defin
1c260 65 64 20 73 65 73 73 69 6f 6e 20 69 73 20 75 73  ed session is us
1c270 65 64 2e 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  ed.",.#endif.  "
1c280 2e 73 68 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20  .sha3sum ...    
1c290 20 20 20 20 20 20 20 20 20 43 6f 6d 70 75 74 65           Compute
1c2a0 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20   a SHA3 hash of 
1c2b0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
1c2c0 22 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e  ",.  "    Option
1c2d0 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  s:",.  "      --
1c2e0 73 63 68 65 6d 61 20 20 20 20 20 20 20 20 20 20  schema          
1c2f0 20 20 20 20 41 6c 73 6f 20 68 61 73 68 20 74 68      Also hash th
1c300 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1c310 74 61 62 6c 65 22 2c 0a 20 20 22 20 20 20 20 20  table",.  "     
1c320 20 2d 2d 73 68 61 33 2d 32 32 34 20 20 20 20 20   --sha3-224     
1c330 20 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73         Use the s
1c340 68 61 33 2d 32 32 34 20 61 6c 67 6f 72 69 74 68  ha3-224 algorith
1c350 6d 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  m",.  "      --s
1c360 68 61 33 2d 32 35 36 20 20 20 20 20 20 20 20 20  ha3-256         
1c370 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1c380 32 35 36 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20  256 algorithm.  
1c390 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
1c3a0 75 6c 74 2e 22 2c 0a 20 20 22 20 20 20 20 20 20  ult.",.  "      
1c3b0 2d 2d 73 68 61 33 2d 33 38 34 20 20 20 20 20 20  --sha3-384      
1c3c0 20 20 20 20 20 20 55 73 65 20 74 68 65 20 73 68        Use the sh
1c3d0 61 33 2d 33 38 34 20 61 6c 67 6f 72 69 74 68 6d  a3-384 algorithm
1c3e0 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1c3f0 61 33 2d 35 31 32 20 20 20 20 20 20 20 20 20 20  a3-512          
1c400 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 35    Use the sha3-5
1c410 31 32 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20  12 algorithm",. 
1c420 20 22 20 20 20 20 41 6e 79 20 6f 74 68 65 72 20   "    Any other 
1c430 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 4c 49  argument is a LI
1c440 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74  KE pattern for t
1c450 61 62 6c 65 73 20 74 6f 20 68 61 73 68 22 2c 0a  ables to hash",.
1c460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1c470 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1c480 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e  .shell CMD ARGS.
1c490 2e 2e 20 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ..       Run CMD
1c4a0 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1c4b0 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1c4c0 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  dif.  ".show    
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 53 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  Show the current
1c4f0 20 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69   values for vari
1c500 6f 75 73 20 73 65 74 74 69 6e 67 73 22 2c 0a 20  ous settings",. 
1c510 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66   ".stats ?on|off
1c520 3f 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20  ?          Show 
1c530 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74  stats or turn st
1c540 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  ats on or off",.
1c550 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
1c560 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22  OHAVE_SYSTEM.  "
1c570 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53  .system CMD ARGS
1c580 2e 2e 2e 20 20 20 20 20 20 52 75 6e 20 43 4d 44  ...      Run CMD
1c590 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
1c5a0 73 74 65 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e  stem shell",.#en
1c5b0 64 69 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f  dif.  ".tables ?
1c5c0 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 20  TABLE?          
1c5d0 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
1c5e0 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 4c 49  bles matching LI
1c5f0 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
1c600 22 2c 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20  ",.  ".testcase 
1c610 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 42  NAME           B
1c620 65 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67  egin redirecting
1c630 20 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74   output to 'test
1c640 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a  case-out.txt'",.
1c650 20 20 22 2e 74 65 73 74 63 74 72 6c 20 43 4d 44    ".testctrl CMD
1c660 20 2e 2e 2e 20 20 20 20 20 20 20 20 52 75 6e 20   ...        Run 
1c670 76 61 72 69 6f 75 73 20 73 71 6c 69 74 65 33 5f  various sqlite3_
1c680 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 20 6f  test_control() o
1c690 70 65 72 61 74 69 6f 6e 73 22 2c 0a 20 20 22 20  perations",.  " 
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 20 20 20 20 20 20 20 20 20 20 52 75 6e 20 5c 22            Run \"
1c6c0 2e 74 65 73 74 63 74 72 6c 5c 22 20 77 69 74 68  .testctrl\" with
1c6d0 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   no arguments fo
1c6e0 72 20 64 65 74 61 69 6c 73 22 2c 0a 20 20 22 2e  r details",.  ".
1c6f0 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20  timeout MS      
1c700 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e          Try open
1c710 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65  ing locked table
1c720 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65  s for MS millise
1c730 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65  conds",.  ".time
1c740 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
1c750 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d      Turn SQL tim
1c760 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23  er on or off",.#
1c770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c780 49 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61  IT_TRACE.  ".tra
1c790 63 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  ce ?OPTIONS?    
1c7a0 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68       Output each
1c7b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
1c7c0 73 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20  s it is run",.  
1c7d0 22 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20  "    FILE       
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1c7f0 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45  d output to FILE
1c800 22 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74  ",.  "    stdout
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1c830 20 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20   stdout",.  "   
1c840 20 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20   stderr         
1c850 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1c860 74 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c  tput to stderr",
1c870 0a 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20  .  "    off     
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 44 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22  Disable tracing"
1c8a0 2c 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e  ,.  "    --expan
1c8b0 64 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ded             
1c8c0 20 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61   Expand query pa
1c8d0 72 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65  rameters",.#ifde
1c8e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c8f0 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20  NORMALIZE.  "   
1c900 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20   --normalized   
1c910 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20           Normal 
1c920 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1c930 74 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20  ts",.#endif.  " 
1c940 20 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20     --plain      
1c950 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1c960 53 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70  SQL as it is inp
1c970 75 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74  ut",.  "    --st
1c980 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mt              
1c990 20 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d      Trace statem
1c9a0 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53  ent execution (S
1c9b0 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
1c9c0 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f  )",.  "    --pro
1c9d0 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  file            
1c9e0 20 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65     Profile state
1c9f0 6d 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52  ments (SQLITE_TR
1ca00 41 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20  ACE_PROFILE)",. 
1ca10 20 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20   "    --row     
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1ca30 61 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51  ace each row (SQ
1ca40 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22  LITE_TRACE_ROW)"
1ca50 2c 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65  ,.  "    --close
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca70 20 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f   Trace connectio
1ca80 6e 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f  n close (SQLITE_
1ca90 54 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23  TRACE_CLOSE)",.#
1caa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1cab0 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
1cac0 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20  ".vfsinfo ?AUX? 
1cad0 20 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d            Inform
1cae0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1caf0 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c 0a  top-level VFS",.
1cb00 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20    ".vfslist     
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1cb20 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56   all available V
1cb30 46 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e 61  FSes",.  ".vfsna
1cb40 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  me ?AUX?        
1cb50 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
1cb60 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
1cb70 63 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20 4e  ck",.  ".width N
1cb80 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 20  UM1 NUM2 ...    
1cb90 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74   Set column widt
1cba0 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c  hs for \"column\
1cbb0 22 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 20  " mode",.  "    
1cbc0 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   Negative values
1cbd0 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22 2c   right-justify",
1cbe0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
1cbf0 74 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a  t help text..**.
1cc00 2a 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73 63  ** zPattern desc
1cc10 72 69 62 65 73 20 74 68 65 20 73 65 74 20 6f 66  ribes the set of
1cc20 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77 68   commands for wh
1cc30 69 63 68 20 68 65 6c 70 20 74 65 78 74 20 69 73  ich help text is
1cc40 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49 66   provided..** If
1cc50 20 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55 4c   zPattern is NUL
1cc60 4c 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c  L, then show all
1cc70 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f   commands, but o
1cc80 6e 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d 6c  nly give a one-l
1cc90 69 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 69  ine.** descripti
1cca0 6f 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a  on of each..**.*
1ccb0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1ccc0 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e 0a  ber of matches..
1ccd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1cce0 6f 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74  owHelp(FILE *out
1ccf0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1cd00 61 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20 69  attern){.  int i
1cd10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d 20   = 0;.  int j = 
1cd20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
1cd30 20 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20 20    char *zPat;.  
1cd40 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 0a  if( zPattern==0.
1cd50 20 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30     || zPattern[0
1cd60 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74 72  ]=='0'.   || str
1cd70 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61  cmp(zPattern,"-a
1cd80 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 63  ")==0.   || strc
1cd90 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 6c  mp(zPattern,"-al
1cda0 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  l")==0.  ){.    
1cdb0 2f 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d  /* Show all comm
1cdc0 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ands, but only o
1cdd0 6e 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d 6d  ne line per comm
1cde0 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  and */.    if( z
1cdf0 50 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50 61  Pattern==0 ) zPa
1ce00 74 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20 20  ttern = "";.    
1ce10 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1ce20 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b  Size(azHelp); i+
1ce30 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  +){.      if( az
1ce40 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20  Help[i][0]=='.' 
1ce50 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20 29  || zPattern[0] )
1ce60 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1ce70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1ce80 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20  ", azHelp[i]);. 
1ce90 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1cea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1ceb0 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  e{.    /* Look f
1cec0 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  or commands that
1ced0 20 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74 74   for which zPatt
1cee0 65 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74 20  ern is an exact 
1cef0 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a 50  prefix */.    zP
1cf00 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  at = sqlite3_mpr
1cf10 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50 61  intf(".%s*", zPa
1cf20 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1cf30 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1cf40 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1cf50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1cf60 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c 20  3_strglob(zPat, 
1cf70 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b  azHelp[i])==0 ){
1cf80 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1cf90 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1cfa0 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20  , azHelp[i]);.  
1cfb0 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20        j = i+1;. 
1cfc0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1cfd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1cfe0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29  lite3_free(zPat)
1cff0 3b 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a 20  ;.    if( n ){. 
1d000 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29 7b       if( n==1 ){
1d010 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e  .        /* when
1d020 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20 70   zPattern is a p
1d030 72 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c 79  refix of exactly
1d040 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74 68   one command, th
1d050 65 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a 20  en include the. 
1d060 20 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c         ** detail
1d070 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 6e  s of that comman
1d080 64 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  d, which should 
1d090 62 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74 20  begin at offset 
1d0a0 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  j */.        whi
1d0b0 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  le( j<ArraySize(
1d0c0 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48  azHelp)-1 && azH
1d0d0 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29  elp[j][0]!='.' )
1d0e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
1d0f0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1d100 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1d110 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
1d120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d130 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  }.      return n
1d140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4c  ;.    }.    /* L
1d150 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73  ook for commands
1d160 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a 50   that contain zP
1d170 61 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65 2e  attern anywhere.
1d180 20 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c    Show the compl
1d190 65 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74 20  ete.    ** text 
1d1a0 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20  of all commands 
1d1b0 74 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a 20  that match. */. 
1d1c0 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65     zPat = sqlite
1d1d0 33 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73 25  3_mprintf("%%%s%
1d1e0 25 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  %", zPattern);. 
1d1f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1d200 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1d210 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1d220 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27   azHelp[i][0]=='
1d230 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20 20  .' ) j = i;.    
1d240 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1d250 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48 65  rlike(zPat, azHe
1d260 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a  lp[i], 0)==0 ){.
1d270 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1d280 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1d290 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20   azHelp[j]);.   
1d2a0 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72       while( j<Ar
1d2b0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d  raySize(azHelp)-
1d2c0 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d  1 && azHelp[j+1]
1d2d0 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]!='.' ){.    
1d2e0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
1d2f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1d300 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1d310 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1d320 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
1d330 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  j;.        n++;.
1d340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d360 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Pat);.  }.  retu
1d370 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn n;.}../* Forw
1d380 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1d390 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1d3a0 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1d3b0 74 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  tate *p);../*.**
1d3c0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1d3d0 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
1d3e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
1d3f0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1d400 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
1d410 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1d420 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1d430 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
1d440 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1d450 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
1d460 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
1d470 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
1d480 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1d490 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
1d4a0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1d4b0 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
1d4c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
1d4d0 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
1d4e0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
1d4f0 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
1d500 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
1d510 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1d520 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
1d530 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
1d540 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
1d550 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
1d560 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
1d570 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
1d580 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
1d590 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
1d5a0 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
1d5b0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1d5c0 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
1d5d0 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
1d5e0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1d5f0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
1d600 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1d610 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1d620 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
1d630 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
1d640 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1d650 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
1d660 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
1d670 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
1d680 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1d690 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
1d6a0 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
1d6b0 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
1d6c0 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
1d6d0 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
1d6e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
1d6f0 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
1d700 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28  uf==0 ){ fclose(
1d710 69 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d  in); return 0; }
1d720 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64  .  nRead = fread
1d730 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69  (pBuf, nIn, 1, i
1d740 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  n);.  fclose(in)
1d750 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31  ;.  if( nRead!=1
1d760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d770 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20  free(pBuf);.    
1d780 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1d790 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20  pBuf[nIn] = 0;. 
1d7a0 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70   if( pnByte ) *p
1d7b0 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72  nByte = nIn;.  r
1d7c0 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23  eturn pBuf;.}..#
1d7d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d7e0 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1d7f0 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  )./*.** Close a 
1d800 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69  single OpenSessi
1d810 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  on object and re
1d820 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73  lease all of its
1d830 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72   associated.** r
1d840 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61  esources..*/.sta
1d850 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1d860 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69  _close(OpenSessi
1d870 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20  on *pSession){. 
1d880 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
1d890 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28  3session_delete(
1d8a0 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
1d8b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
1d8c0 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ssion->zName);. 
1d8d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1d8e0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1d8f0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1d900 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1d910 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20  azFilter[i]);.  
1d920 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1d930 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1d940 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter);.  memset(p
1d950 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65  Session, 0, size
1d960 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29  of(OpenSession))
1d970 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d980 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e  * Close all Open
1d990 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20  Session objects 
1d9a0 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
1d9b0 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75  associated resou
1d9c0 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rces..*/.#if def
1d9d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d9e0 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
1d9f0 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
1da00 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53  close_all(ShellS
1da10 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
1da20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1da30 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b  p->nSession; i++
1da40 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  ){.    session_c
1da50 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f  lose(&p->aSessio
1da60 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  n[i]);.  }.  p->
1da70 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a  nSession = 0;.}.
1da80 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1da90 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
1daa0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
1dab0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1dac0 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20   of the xFilter 
1dad0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
1dae0 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f  open session.  O
1daf0 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65  mit.** any table
1db00 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73  s named by ".ses
1db10 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74  sion filter" but
1db20 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74   let all other t
1db30 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  able through..*/
1db40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1db50 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1db60 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ON).static int s
1db70 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f  ession_filter(vo
1db80 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20  id *pCtx, const 
1db90 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f  char *zTab){.  O
1dba0 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
1dbb0 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73  sion = (OpenSess
1dbc0 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74  ion*)pCtx;.  int
1dbd0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1dbe0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
1dbf0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  er; i++){.    if
1dc00 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
1dc10 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  b(pSession->azFi
1dc20 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d  lter[i], zTab)==
1dc30 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1dc40 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1dc50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
1dc60 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65 20  y to deduce the 
1dc70 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72  type of file for
1dc80 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20   zName based on 
1dc90 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65  its content.  Re
1dca0 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  turn.** one of t
1dcb0 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20  he SHELL_OPEN_* 
1dcc0 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a  constants..**.**
1dcd0 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
1dce0 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69  s not exist or i
1dcf0 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73 20  s empty but its 
1dd00 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  name looks like 
1dd10 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65  a ZIP.** archive
1dd20 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70   and the dfltZip
1dd30 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
1dd40 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73  hen assume it is
1dd50 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a   a ZIP archive..
1dd60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
1dd70 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79  sume an ordinary
1dd80 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72 64   database regard
1dd90 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65  less of the file
1dda0 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74  name if.** the t
1ddb0 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65  ype cannot be de
1ddc0 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f  termined from co
1ddd0 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65  ntent..*/.int de
1dde0 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
1ddf0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
1de00 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29  me, int dfltZip)
1de10 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f  {.  FILE *f = fo
1de20 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29  pen(zName, "rb")
1de30 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20  ;.  size_t n;.  
1de40 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f  int rc = SHELL_O
1de50 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68  PEN_UNSPEC;.  ch
1de60 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
1de70 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
1de80 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73  if( dfltZip && s
1de90 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
1dea0 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d  %.zip",zName,0)=
1deb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  =0 ){.       ret
1dec0 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  urn SHELL_OPEN_Z
1ded0 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73  IPFILE;.    }els
1dee0 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  e{.       return
1def0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1df00 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AL;.    }.  }.  
1df10 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1df20 31 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28  16, 1, f);.  if(
1df30 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28   n==1 && memcmp(
1df40 7a 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f  zBuf, "SQLite fo
1df50 72 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20  rmat 3", 16)==0 
1df60 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29  ){.    fclose(f)
1df70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45  ;.    return SHE
1df80 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a  LL_OPEN_NORMAL;.
1df90 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d    }.  fseek(f, -
1dfa0 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  25, SEEK_END);. 
1dfb0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1dfc0 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   25, 1, f);.  if
1dfd0 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
1dfe0 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66  (zBuf, "Start-Of
1dff0 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d  -SQLite3-", 17)=
1e000 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1e010 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
1e020 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  VFS;.  }else{.  
1e030 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20    fseek(f, -22, 
1e040 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e  SEEK_END);.    n
1e050 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
1e060 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66  2, 1, f);.    if
1e070 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30  ( n==1 && zBuf[0
1e080 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b  ]==0x50 && zBuf[
1e090 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66  1]==0x4b && zBuf
1e0a0 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20  [2]==0x05.      
1e0b0 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30   && zBuf[3]==0x0
1e0c0 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  6 ){.      rc = 
1e0d0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1e0e0 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LE;.    }else if
1e0f0 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69  ( n==0 && dfltZi
1e100 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  p && sqlite3_str
1e110 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61  like("%.zip",zNa
1e120 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  me,0)==0 ){.    
1e130 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1e140 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
1e150 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
1e160 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ;.  return rc;  
1e170 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1e180 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
1e190 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6e  LIZE./*.** Recon
1e1a0 73 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65 6d  struct an in-mem
1e1b0 6f 72 79 20 64 61 74 61 62 61 73 65 20 75 73 69  ory database usi
1e1c0 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 66 72  ng the output fr
1e1d0 6f 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74 22  om the "dbtotxt"
1e1e0 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52 65  .** program.  Re
1e1f0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1e200 74 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e 7a  the file in p->z
1e210 44 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66 20  DbFilename.  If 
1e220 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a 2a  p->zDbFilename.*
1e230 2a 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65 61  * is 0, then rea
1e240 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
1e250 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  input..*/.static
1e260 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e270 72 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c 53  readHexDb(ShellS
1e280 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  tate *p, int *pn
1e290 44 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Data){.  unsigne
1e2a0 64 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a 20  d char *a = 0;. 
1e2b0 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
1e2c0 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  t n = 0;.  int p
1e2d0 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  gsz = 0;.  int i
1e2e0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e  Offset = 0;.  in
1e2f0 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63  t j, k;.  int rc
1e300 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
1e310 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 5b 31  unsigned int x[1
1e320 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65  6];.  char zLine
1e330 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 70 2d  [1000];.  if( p-
1e340 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29 7b 0a  >zDbFilename ){.
1e350 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 70      in = fopen(p
1e360 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 22  ->zDbFilename, "
1e370 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  r");.    if( in=
1e380 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
1e390 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1e3a0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25  "cannot open \"%
1e3b0 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 5c  s\" for reading\
1e3c0 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  n", p->zDbFilena
1e3d0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1e3e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1e3f0 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Line = 0;.  }els
1e400 65 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d 3e 69  e{.    in = p->i
1e410 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 70  n;.    nLine = p
1e420 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 69 66  ->lineno;.    if
1e430 28 20 69 6e 3d 3d 30 20 29 20 69 6e 20 3d 20 73  ( in==0 ) in = s
1e440 74 64 69 6e 3b 0a 20 20 7d 0a 20 20 2a 70 6e 44  tdin;.  }.  *pnD
1e450 61 74 61 20 3d 20 30 3b 0a 20 20 6e 4c 69 6e 65  ata = 0;.  nLine
1e460 2b 2b 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28  ++;.  if( fgets(
1e470 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
1e480 69 6e 65 29 2c 20 69 6e 29 3d 3d 30 20 29 20 67  ine), in)==0 ) g
1e490 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72  oto readHexDb_er
1e4a0 72 6f 72 3b 0a 20 20 72 63 20 3d 20 73 73 63 61  ror;.  rc = ssca
1e4b0 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 73 69 7a  nf(zLine, "| siz
1e4c0 65 20 25 64 20 70 61 67 65 73 69 7a 65 20 25 64  e %d pagesize %d
1e4d0 22 2c 20 26 6e 2c 20 26 70 67 73 7a 29 3b 0a 20  ", &n, &pgsz);. 
1e4e0 20 69 66 28 20 72 63 21 3d 32 20 29 20 67 6f 74   if( rc!=2 ) got
1e4f0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e500 72 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20 67  r;.  if( n<0 ) g
1e510 6f 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72  oto readHexDb_er
1e520 72 6f 72 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c  ror;.  if( pgsz<
1e530 35 31 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33  512 || pgsz>6553
1e540 36 20 7c 7c 20 28 70 67 73 7a 26 28 70 67 73 7a  6 || (pgsz&(pgsz
1e550 2d 31 29 29 21 3d 30 20 29 20 67 6f 74 6f 20 72  -1))!=0 ) goto r
1e560 65 61 64 48 65 78 44 62 5f 65 72 72 6f 72 3b 0a  eadHexDb_error;.
1e570 20 20 6e 20 3d 20 28 6e 2b 70 67 73 7a 2d 31 29    n = (n+pgsz-1)
1e580 26 7e 28 70 67 73 7a 2d 31 29 3b 20 20 2f 2a 20  &~(pgsz-1);  /* 
1e590 52 6f 75 6e 64 20 6e 20 75 70 20 74 6f 20 74 68  Round n up to th
1e5a0 65 20 6e 65 78 74 20 6d 75 6c 74 69 70 6c 65 20  e next multiple 
1e5b0 6f 66 20 70 67 73 7a 20 2a 2f 0a 20 20 61 20 3d  of pgsz */.  a =
1e5c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e5d0 20 6e 20 3f 20 6e 20 3a 20 31 20 29 3b 0a 20 20   n ? n : 1 );.  
1e5e0 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
1e5f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e600 72 72 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "Out of memo
1e610 72 79 21 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ry!\n");.    got
1e620 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1e630 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  r;.  }.  memset(
1e640 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  a, 0, n);.  if( 
1e650 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a  pgsz<512 || pgsz
1e660 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 20  >65536 || (pgsz 
1e670 26 20 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29  & (pgsz-1))!=0 )
1e680 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1e690 66 28 73 74 64 65 72 72 2c 20 22 69 6e 76 61 6c  f(stderr, "inval
1e6a0 69 64 20 70 61 67 65 73 69 7a 65 5c 6e 22 29 3b  id pagesize\n");
1e6b0 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65  .    goto readHe
1e6c0 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  xDb_error;.  }. 
1e6d0 20 66 6f 72 28 6e 4c 69 6e 65 2b 2b 3b 20 66 67   for(nLine++; fg
1e6e0 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f  ets(zLine, sizeo
1e6f0 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 21 3d 30  f(zLine), in)!=0
1e700 3b 20 6e 4c 69 6e 65 2b 2b 29 7b 0a 20 20 20 20  ; nLine++){.    
1e710 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e  rc = sscanf(zLin
1e720 65 2c 20 22 7c 20 70 61 67 65 20 25 64 20 6f 66  e, "| page %d of
1e730 66 73 65 74 20 25 64 22 2c 20 26 6a 2c 20 26 6b  fset %d", &j, &k
1e740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 32  );.    if( rc==2
1e750 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 73 65   ){.      iOffse
1e760 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20 63 6f 6e  t = k;.      con
1e770 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1e780 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4c 69   if( strncmp(zLi
1e790 6e 65 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29  ne, "| end ", 6)
1e7a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
1e7b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1e7c0 20 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c   = sscanf(zLine,
1e7d0 22 7c 20 25 64 3a 20 25 78 20 25 78 20 25 78 20  "| %d: %x %x %x 
1e7e0 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
1e7f0 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
1e800 20 25 78 20 25 78 22 2c 0a 20 20 20 20 20 20 20   %x %x",.       
1e810 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26 78 5b           &j, &x[
1e820 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b 32 5d  0], &x[1], &x[2]
1e830 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d 2c 20  , &x[3], &x[4], 
1e840 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20 26 78  &x[5], &x[6], &x
1e850 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [7],.           
1e860 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78 5b 39       &x[8], &x[9
1e870 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b 31 31  ], &x[10], &x[11
1e880 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b 31 33  ], &x[12], &x[13
1e890 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b 31 35  ], &x[14], &x[15
1e8a0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ]);.    if( rc==
1e8b0 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20  17 ){.      k = 
1e8c0 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20 20 20  iOffset+j;.     
1e8d0 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29 7b 0a   if( k+16<=n ){.
1e8e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1e8f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
1e900 3b 20 69 69 3c 31 36 3b 20 69 69 2b 2b 29 20 61  ; ii<16; ii++) a
1e910 5b 6b 2b 69 69 5d 20 3d 20 78 5b 69 69 5d 26 30  [k+ii] = x[ii]&0
1e920 78 66 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xff;.      }.   
1e930 20 7d 0a 20 20 7d 0a 20 20 2a 70 6e 44 61 74 61   }.  }.  *pnData
1e940 20 3d 20 6e 3b 0a 20 20 69 66 28 20 69 6e 21 3d   = n;.  if( in!=
1e950 70 2d 3e 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c  p->in ){.    fcl
1e960 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  ose(in);.  }else
1e970 7b 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20  {.    p->lineno 
1e980 3d 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 72  = nLine;.  }.  r
1e990 65 74 75 72 6e 20 61 3b 0a 0a 72 65 61 64 48 65  eturn a;..readHe
1e9a0 78 44 62 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  xDb_error:.  if(
1e9b0 20 69 6e 21 3d 70 2d 3e 69 6e 20 29 7b 0a 20 20   in!=p->in ){.  
1e9c0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1e9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
1e9e0 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ( fgets(zLine, s
1e9f0 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 2d  izeof(zLine), p-
1ea00 3e 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  >in)!=0 ){.     
1ea10 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20   nLine++;.      
1ea20 69 66 28 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65  if(strncmp(zLine
1ea30 2c 20 22 7c 20 65 6e 64 20 22 2c 20 36 29 3d 3d  , "| end ", 6)==
1ea40 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
1ea50 0a 20 20 20 20 70 2d 3e 6c 69 6e 65 6e 6f 20 3d  .    p->lineno =
1ea60 20 6e 4c 69 6e 65 3b 0a 20 20 7d 0a 20 20 73 71   nLine;.  }.  sq
1ea70 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20  lite3_free(a);. 
1ea80 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1ea90 65 72 72 2c 22 45 72 72 6f 72 20 6f 6e 20 6c 69  err,"Error on li
1eaa0 6e 65 20 25 64 20 6f 66 20 2d 2d 68 65 78 64 62  ne %d of --hexdb
1eab0 20 69 6e 70 75 74 5c 6e 22 2c 20 6e 4c 69 6e 65   input\n", nLine
1eac0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1ead0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1eae0 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
1eaf0 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  LIZE */../*.** S
1eb00 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22  calar function "
1eb10 73 68 65 6c 6c 5f 69 6e 74 33 32 22 2e 20 54 68  shell_int32". Th
1eb20 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1eb30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1eb40 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 20 62  n.** must be a b
1eb50 6c 6f 62 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  lob. The second 
1eb60 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
1eb70 6e 74 65 67 65 72 2e 20 54 68 69 73 20 66 75 6e  nteger. This fun
1eb80 63 74 69 6f 6e 0a 2a 2a 20 72 65 61 64 73 20 61  ction.** reads a
1eb90 6e 64 20 72 65 74 75 72 6e 73 20 61 20 33 32 2d  nd returns a 32-
1eba0 62 69 74 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  bit big-endian i
1ebb0 6e 74 65 67 65 72 20 66 72 6f 6d 20 62 79 74 65  nteger from byte
1ebc0 0a 2a 2a 20 6f 66 66 73 65 74 20 28 34 2a 3c 61  .** offset (4*<a
1ebd0 72 67 32 3e 29 20 6f 66 20 74 68 65 20 62 6c 6f  rg2>) of the blo
1ebe0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
1ebf0 64 20 73 68 65 6c 6c 49 6e 74 33 32 28 0a 20 20  d shellInt32(.  
1ec00 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1ec10 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
1ec20 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65   argc, .  sqlite
1ec30 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1ec40 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1ec50 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 0a  ed char *pBlob;.
1ec60 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 20 20 69    int nBlob;.  i
1ec70 6e 74 20 69 49 6e 74 3b 0a 0a 20 20 55 4e 55 53  nt iInt;..  UNUS
1ec80 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1ec90 63 29 3b 0a 20 20 6e 42 6c 6f 62 20 3d 20 73 71  c);.  nBlob = sq
1eca0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
1ecb0 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70 42  s(argv[0]);.  pB
1ecc0 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  lob = (const uns
1ecd0 69 67 6e 65 64 20 63 68 61 72 2a 29 73 71 6c 69  igned char*)sqli
1ece0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1ecf0 72 67 76 5b 30 5d 29 3b 0a 20 20 69 49 6e 74 20  rgv[0]);.  iInt 
1ed00 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed10 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  int(argv[1]);.. 
1ed20 20 69 66 28 20 69 49 6e 74 3e 3d 30 20 26 26 20   if( iInt>=0 && 
1ed30 28 69 49 6e 74 2b 31 29 2a 34 3c 3d 6e 42 6c 6f  (iInt+1)*4<=nBlo
1ed40 62 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  b ){.    const u
1ed50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20  nsigned char *a 
1ed60 3d 20 26 70 42 6c 6f 62 5b 69 49 6e 74 2a 34 5d  = &pBlob[iInt*4]
1ed70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
1ed80 74 36 34 20 69 56 61 6c 20 3d 20 28 28 73 71 6c  t64 iVal = ((sql
1ed90 69 74 65 33 5f 69 6e 74 36 34 29 61 5b 30 5d 3c  ite3_int64)a[0]<
1eda0 3c 32 34 29 0a 20 20 20 20 20 20 20 20 20 20 20  <24).           
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28              + ((
1edc0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b  sqlite3_int64)a[
1edd0 31 5d 3c 3c 31 36 29 0a 20 20 20 20 20 20 20 20  1]<<16).        
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
1edf0 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ((sqlite3_int64
1ee00 29 61 5b 32 5d 3c 3c 20 38 29 0a 20 20 20 20 20  )a[2]<< 8).     
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 2b 20 28 28 73 71 6c 69 74 65 33 5f 69 6e    + ((sqlite3_in
1ee30 74 36 34 29 61 5b 33 5d 3c 3c 20 30 29 3b 0a 20  t64)a[3]<< 0);. 
1ee40 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
1ee50 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
1ee60 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   iVal);.  }.}../
1ee70 2a 0a 2a 2a 20 53 63 61 6c 61 72 20 66 75 6e 63  *.** Scalar func
1ee80 74 69 6f 6e 20 22 73 68 65 6c 6c 5f 69 64 71 75  tion "shell_idqu
1ee90 6f 74 65 28 58 29 22 20 72 65 74 75 72 6e 73 20  ote(X)" returns 
1eea0 73 74 72 69 6e 67 20 58 20 71 75 6f 74 65 64 20  string X quoted 
1eeb0 61 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  as an identifier
1eec0 2c 0a 2a 2a 20 75 73 69 6e 67 20 22 2e 2e 2e 22  ,.** using "..."
1eed0 20 77 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 64   with internal d
1eee0 6f 75 62 6c 65 2d 71 75 6f 74 65 20 63 68 61 72  ouble-quote char
1eef0 61 63 74 65 72 73 20 64 6f 75 62 6c 65 64 2e 0a  acters doubled..
1ef00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1ef10 68 65 6c 6c 49 64 51 75 6f 74 65 28 0a 20 20 73  hellIdQuote(.  s
1ef20 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1ef30 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
1ef40 61 72 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  argc, .  sqlite3
1ef50 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
1ef60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ef70 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
1ef80 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1ef90 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
1efa0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1efb0 54 45 52 28 61 72 67 63 29 3b 0a 20 20 69 66 28  TER(argc);.  if(
1efc0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 63 68   zName ){.    ch
1efd0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1efe0 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22  mprintf("\"%w\""
1eff0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  , zName);.    sq
1f000 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1f010 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31  t(context, z, -1
1f020 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
1f030 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
1f040 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 22 73  alar function "s
1f050 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c  hell_escape_crnl
1f060 22 20 75 73 65 64 20 62 79 20 74 68 65 20 2e 72  " used by the .r
1f070 65 63 6f 76 65 72 20 63 6f 6d 6d 61 6e 64 2e 0a  ecover command..
1f080 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
1f090 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1f0a0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6f  unction is the o
1f0b0 75 74 70 75 74 20 6f 66 20 62 75 69 6c 74 2d 69  utput of built-i
1f0c0 6e 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 71 75  n.** function qu
1f0d0 6f 74 65 28 29 2e 20 49 66 20 74 68 65 20 66 69  ote(). If the fi
1f0e0 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1f0f0 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 22 27   the input is "'
1f100 22 2c 20 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  ", .** indicatin
1f110 67 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  g that the value
1f120 20 70 61 73 73 65 64 20 74 6f 20 71 75 6f 74 65   passed to quote
1f130 28 29 20 77 61 73 20 61 20 74 65 78 74 20 76 61  () was a text va
1f140 6c 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  lue,.** then thi
1f150 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63  s function searc
1f160 68 65 73 20 74 68 65 20 69 6e 70 75 74 20 66 6f  hes the input fo
1f170 72 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20  r "\n" and "\r" 
1f180 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 61 6e  characters.** an
1f190 64 20 61 64 64 73 20 61 20 77 72 61 70 70 65 72  d adds a wrapper
1f1a0 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
1f1b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1f1c0 20 20 20 72 65 70 6c 61 63 65 28 72 65 70 6c 61     replace(repla
1f1d0 63 65 28 3c 69 6e 70 75 74 3e 2c 20 27 5c 6e 27  ce(<input>, '\n'
1f1e0 2c 20 63 68 61 72 28 31 30 29 2c 20 27 5c 72 27  , char(10), '\r'
1f1f0 2c 20 63 68 61 72 28 31 33 29 29 3b 0a 2a 2a 0a  , char(13));.**.
1f200 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 66 69  ** Or, if the fi
1f210 72 73 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  rst character of
1f220 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6e 6f   the input is no
1f230 74 20 22 27 22 2c 20 74 68 65 6e 20 61 20 63 6f  t "'", then a co
1f240 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 70  py.** of the inp
1f250 75 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ut is returned..
1f260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1f270 68 65 6c 6c 45 73 63 61 70 65 43 72 6e 6c 28 0a  hellEscapeCrnl(.
1f280 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f290 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
1f2a0 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c 69  nt argc, .  sqli
1f2b0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
1f2c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1f2d0 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74   *zText = (const
1f2e0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
1f2f0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
1f300 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ]);.  UNUSED_PAR
1f310 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20  AMETER(argc);.  
1f320 69 66 28 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 5c  if( zText[0]=='\
1f330 27 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54  '' ){.    int nT
1f340 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ext = sqlite3_va
1f350 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
1f360 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ]);.    int i;. 
1f370 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b 32 30     char zBuf1[20
1f380 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ];.    char zBuf
1f390 32 5b 32 30 5d 3b 0a 20 20 20 20 63 6f 6e 73 74  2[20];.    const
1f3a0 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a   char *zNL = 0;.
1f3b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f3c0 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zCR = 0;.    int
1f3d0 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e   nCR = 0;.    in
1f3e0 74 20 6e 4e 4c 20 3d 20 30 3b 0a 0a 20 20 20 20  t nNL = 0;..    
1f3f0 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69  for(i=0; zText[i
1f400 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
1f410 66 28 20 7a 4e 4c 3d 3d 30 20 26 26 20 7a 54 65  f( zNL==0 && zTe
1f420 78 74 5b 69 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20  xt[i]=='\n' ){. 
1f430 20 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75         zNL = unu
1f440 73 65 64 5f 73 74 72 69 6e 67 28 7a 54 65 78 74  sed_string(zText
1f450 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22  , "\\n", "\\012"
1f460 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 20 20  , zBuf1);.      
1f470 20 20 6e 4e 4c 20 3d 20 28 69 6e 74 29 73 74 72    nNL = (int)str
1f480 6c 65 6e 28 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  len(zNL);.      
1f490 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 52 3d  }.      if( zCR=
1f4a0 3d 30 20 26 26 20 7a 54 65 78 74 5b 69 5d 3d 3d  =0 && zText[i]==
1f4b0 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\r' ){.        
1f4c0 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
1f4d0 69 6e 67 28 7a 54 65 78 74 2c 20 22 5c 5c 72 22  ing(zText, "\\r"
1f4e0 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
1f4f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 52 20 3d  );.        nCR =
1f500 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 52   (int)strlen(zCR
1f510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f520 0a 0a 20 20 20 20 69 66 28 20 7a 4e 4c 20 7c 7c  ..    if( zNL ||
1f530 20 7a 43 52 20 29 7b 0a 20 20 20 20 20 20 69 6e   zCR ){.      in
1f540 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t iOut = 0;.    
1f550 20 20 69 36 34 20 6e 4d 61 78 20 3d 20 28 6e 4e    i64 nMax = (nN
1f560 4c 20 3e 20 6e 43 52 29 20 3f 20 6e 4e 4c 20 3a  L > nCR) ? nNL :
1f570 20 6e 43 52 3b 0a 20 20 20 20 20 20 69 36 34 20   nCR;.      i64 
1f580 6e 41 6c 6c 6f 63 20 3d 20 6e 4d 61 78 20 2a 20  nAlloc = nMax * 
1f590 6e 54 65 78 74 20 2b 20 28 6e 4d 61 78 2b 36 34  nText + (nMax+64
1f5a0 29 2a 32 3b 0a 20 20 20 20 20 20 63 68 61 72 20  )*2;.      char 
1f5b0 2a 7a 4f 75 74 20 3d 20 28 63 68 61 72 2a 29 73  *zOut = (char*)s
1f5c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1f5d0 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69  nAlloc);.      i
1f5e0 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
1f5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1f600 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1f610 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
1f620 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
1f630 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 7a 4e   }..      if( zN
1f640 4c 20 26 26 20 7a 43 52 20 29 7b 0a 20 20 20 20  L && zCR ){.    
1f650 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f660 5b 69 4f 75 74 5d 2c 20 22 72 65 70 6c 61 63 65  [iOut], "replace
1f670 28 72 65 70 6c 61 63 65 28 22 2c 20 31 36 29 3b  (replace(", 16);
1f680 0a 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d  .        iOut +=
1f690 20 31 36 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   16;.      }else
1f6a0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1f6b0 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 72  (&zOut[iOut], "r
1f6c0 65 70 6c 61 63 65 28 22 2c 20 38 29 3b 0a 20 20  eplace(", 8);.  
1f6d0 20 20 20 20 20 20 69 4f 75 74 20 2b 3d 20 38 3b        iOut += 8;
1f6e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1f6f0 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 5d  or(i=0; zText[i]
1f700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1f710 69 66 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c  if( zText[i]=='\
1f720 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n' ){.          
1f730 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75  memcpy(&zOut[iOu
1f740 74 5d 2c 20 7a 4e 4c 2c 20 6e 4e 4c 29 3b 0a 20  t], zNL, nNL);. 
1f750 20 20 20 20 20 20 20 20 20 69 4f 75 74 20 2b 3d           iOut +=
1f760 20 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65   nNL;.        }e
1f770 6c 73 65 20 69 66 28 20 7a 54 65 78 74 5b 69 5d  lse if( zText[i]
1f780 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
1f790 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f7a0 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 75  );.          iOu
1f7c0 74 20 2b 3d 20 6e 43 52 3b 0a 20 20 20 20 20 20  t += nCR;.      
1f7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f7e0 20 20 20 7a 4f 75 74 5b 69 4f 75 74 5d 20 3d 20     zOut[iOut] = 
1f7f0 7a 54 65 78 74 5b 69 5d 3b 0a 20 20 20 20 20 20  zText[i];.      
1f800 20 20 20 20 69 4f 75 74 2b 2b 3b 0a 20 20 20 20      iOut++;.    
1f810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1f820 20 20 20 20 20 69 66 28 20 7a 4e 4c 20 29 7b 0a       if( zNL ){.
1f830 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f840 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 2c 27 22  zOut[iOut], ",'"
1f850 2c 20 32 29 3b 20 69 4f 75 74 20 2b 3d 20 32 3b  , 2); iOut += 2;
1f860 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1f870 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 7a 4e 4c  &zOut[iOut], zNL
1f880 2c 20 6e 4e 4c 29 3b 20 69 4f 75 74 20 2b 3d 20  , nNL); iOut += 
1f890 6e 4e 4c 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nNL;.        mem
1f8a0 63 70 79 28 26 7a 4f 75 74 5b 69 4f 75 74 5d 2c  cpy(&zOut[iOut],
1f8b0 20 22 27 2c 20 63 68 61 72 28 31 30 29 29 22 2c   "', char(10))",
1f8c0 20 31 32 29 3b 20 69 4f 75 74 20 2b 3d 20 31 32   12); iOut += 12
1f8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f8e0 69 66 28 20 7a 43 52 20 29 7b 0a 20 20 20 20 20  if( zCR ){.     
1f8f0 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b     memcpy(&zOut[
1f900 69 4f 75 74 5d 2c 20 22 2c 27 22 2c 20 32 29 3b  iOut], ",'", 2);
1f910 20 69 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20   iOut += 2;.    
1f920 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74      memcpy(&zOut
1f930 5b 69 4f 75 74 5d 2c 20 7a 43 52 2c 20 6e 43 52  [iOut], zCR, nCR
1f940 29 3b 20 69 4f 75 74 20 2b 3d 20 6e 43 52 3b 0a  ); iOut += nCR;.
1f950 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f960 7a 4f 75 74 5b 69 4f 75 74 5d 2c 20 22 27 2c 20  zOut[iOut], "', 
1f970 63 68 61 72 28 31 33 29 29 22 2c 20 31 32 29 3b  char(13))", 12);
1f980 20 69 4f 75 74 20 2b 3d 20 31 32 3b 0a 20 20 20   iOut += 12;.   
1f990 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1f9a0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1f9b0 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 69  context, zOut, i
1f9c0 4f 75 74 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Out, SQLITE_TRAN
1f9d0 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
1f9e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
1f9f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1fa00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
1fa10 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1fa20 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
1fa30 30 5d 29 3b 0a 7d 0a 0a 2f 2a 20 46 6c 61 67 73  0]);.}../* Flags
1fa40 20 66 6f 72 20 6f 70 65 6e 5f 64 62 28 29 2e 0a   for open_db()..
1fa50 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1fa60 74 20 62 65 68 61 76 69 6f 72 20 6f 66 20 6f 70  t behavior of op
1fa70 65 6e 5f 64 62 28 29 20 69 73 20 74 6f 20 65 78  en_db() is to ex
1fa80 69 74 28 31 29 20 69 66 20 74 68 65 20 64 61 74  it(1) if the dat
1fa90 61 62 61 73 65 20 66 61 69 6c 73 20 74 6f 0a 2a  abase fails to.*
1faa0 2a 20 6f 70 65 6e 2e 20 20 54 68 65 20 4f 50 45  * open.  The OPE
1fab0 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 66  N_DB_KEEPALIVE f
1fac0 6c 61 67 20 63 68 61 6e 67 65 73 20 74 68 61 74  lag changes that
1fad0 20 73 6f 20 74 68 61 74 20 69 74 20 70 72 69 6e   so that it prin
1fae0 74 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 62  ts an error.** b
1faf0 75 74 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 73  ut still returns
1fb00 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
1fb10 20 65 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   exit..**.** The
1fb20 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45   OPEN_DB_ZIPFILE
1fb30 20 66 6c 61 67 20 63 61 75 73 65 73 20 6f 70 65   flag causes ope
1fb40 6e 5f 64 62 28 29 20 74 6f 20 70 72 65 66 65 72  n_db() to prefer
1fb50 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 73 20 61   to open files a
1fb60 73 20 61 0a 2a 2a 20 5a 49 50 20 61 72 63 68 69  s a.** ZIP archi
1fb70 76 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  ve if the file d
1fb80 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
1fb90 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 69 74   is empty and it
1fba0 73 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 0a 2a  s name matches.*
1fbb0 2a 20 74 68 65 20 2a 2e 7a 69 70 20 70 61 74 74  * the *.zip patt
1fbc0 65 72 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ern..*/.#define 
1fbd0 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56  OPEN_DB_KEEPALIV
1fbe0 45 20 20 20 30 78 30 30 31 20 20 20 2f 2a 20 52  E   0x001   /* R
1fbf0 65 74 75 72 6e 20 61 66 74 65 72 20 65 72 72 6f  eturn after erro
1fc00 72 20 69 66 20 74 72 75 65 20 2a 2f 0a 23 64 65  r if true */.#de
1fc10 66 69 6e 65 20 4f 50 45 4e 5f 44 42 5f 5a 49 50  fine OPEN_DB_ZIP
1fc20 46 49 4c 45 20 20 20 20 20 30 78 30 30 32 20 20  FILE     0x002  
1fc30 20 2f 2a 20 4f 70 65 6e 20 61 73 20 5a 49 50 20   /* Open as ZIP 
1fc40 69 66 20 6e 61 6d 65 20 6d 61 74 63 68 65 73 20  if name matches 
1fc50 2a 2e 7a 69 70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *.zip */../*.** 
1fc60 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
1fc70 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
1fc80 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1fc90 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
1fca0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1fcb0 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
1fcc0 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
1fcd0 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
1fce0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fcf0 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
1fd00 74 65 20 2a 70 2c 20 69 6e 74 20 6f 70 65 6e 46  te *p, int openF
1fd10 6c 61 67 73 29 7b 0a 20 20 69 66 28 20 70 2d 3e  lags){.  if( p->
1fd20 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  db==0 ){.    if(
1fd30 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
1fd40 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 20  ELL_OPEN_UNSPEC 
1fd50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
1fd60 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  zDbFilename==0 |
1fd70 7c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  | p->zDbFilename
1fd80 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1fd90 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
1fda0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1fdb0 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  L;.      }else{.
1fdc0 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
1fdd0 6f 64 65 20 3d 20 28 75 38 29 64 65 64 75 63 65  ode = (u8)deduce
1fde0 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
1fdf0 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  zDbFilename, .  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 20 20 20 20 20 20 20 28 6f 70 65 6e             (open
1fe20 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f  Flags & OPEN_DB_
1fe30 5a 49 50 46 49 4c 45 29 21 3d 30 29 3b 0a 20 20  ZIPFILE)!=0);.  
1fe40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fe50 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 65 6e 4d  switch( p->openM
1fe60 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
1fe70 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  e SHELL_OPEN_APP
1fe80 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20 20 20 20  ENDVFS: {.      
1fe90 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1fea0 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1feb0 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20 20 20 20  , &p->db, .     
1fec0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1fed0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1fee0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
1fef0 22 61 70 6e 64 76 66 73 22 29 3b 0a 20 20 20 20  "apndvfs");.    
1ff00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ff10 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48   }.      case SH
1ff20 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3a 0a  ELL_OPEN_HEXDB:.
1ff30 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
1ff40 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a  _OPEN_DESERIALIZ
1ff50 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
1ff60 69 74 65 33 5f 6f 70 65 6e 28 30 2c 20 26 70 2d  ite3_open(0, &p-
1ff70 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
1ff80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ff90 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1ffa0 45 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20  EN_ZIPFILE: {.  
1ffb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1ffc0 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26  en(":memory:", &
1ffd0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1ffe0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fff0 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
20000 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3a 20 7b  OPEN_READONLY: {
20010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20020 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
20030 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
20040 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
20050 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
20060 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20070 7d 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  }.      case SHE
20080 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3a 0a  LL_OPEN_UNSPEC:.
20090 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
200a0 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a  _OPEN_NORMAL: {.
200b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
200c0 6f 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  open(p->zDbFilen
200d0 61 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20  ame, &p->db);.  
200e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
200f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67     }.    }.    g
20100 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b  lobalDb = p->db;
20110 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  .    if( p->db==
20120 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 || SQLITE_OK!=
20130 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
20140 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20  p->db) ){.      
20150 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20160 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c  rr,"Error: unabl
20170 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
20180 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22  se \"%s\": %s\n"
20190 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ,.          p->z
201a0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69  DbFilename, sqli
201b0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
201c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  ));.      if( op
201d0 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 44  enFlags & OPEN_D
201e0 42 5f 4b 45 45 50 41 4c 49 56 45 20 29 7b 0a 20  B_KEEPALIVE ){. 
201f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
20200 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20  pen(":memory:", 
20210 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
20220 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
20230 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
20240 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
20250 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
20260 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c  XTENSION.    sql
20270 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
20280 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62  _extension(p->db
20290 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 1);.#endif.   
202a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
202b0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
202c0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
202d0 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
202e0 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 20 2a 2f  p->db, 0, 0); */
202f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d  .    sqlite3_com
20300 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e  pletion_init(p->
20310 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20 21  db, 0, 0);.#if !
20320 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20330 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
20340 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
20350 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47  ITE_ENABLE_DBPAG
20360 45 5f 56 54 41 42 29 0a 20 20 20 20 73 71 6c 69  E_VTAB).    sqli
20370 74 65 33 5f 64 62 64 61 74 61 5f 69 6e 69 74 28  te3_dbdata_init(
20380 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65  p->db, 0, 0);.#e
20390 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
203a0 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20  TE_HAVE_ZLIB.   
203b0 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65   sqlite3_zipfile
203c0 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
203d0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
203e0 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62  sqlar_init(p->db
203f0 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
20400 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
20410 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
20420 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63  b, "shell_add_sc
20430 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c 49 54 45  hema", 3, SQLITE
20440 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 20 73 68 65 6c 6c 41 64 64 53 63        shellAddSc
20470 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b  hemaName, 0, 0);
20480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
20490 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e  ate_function(p->
204a0 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c  db, "shell_modul
204b0 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c 20 53 51  e_schema", 1, SQ
204c0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 4d            shellM
204f0 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20  oduleSchema, 0, 
20500 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
20510 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20520 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 70 75  p->db, "shell_pu
20530 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45  tsnl", 1, SQLITE
20540 5f 55 54 46 38 2c 20 70 2c 0a 20 20 20 20 20 20  _UTF8, p,.      
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46        shellPutsF
20570 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
20580 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
20590 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
205a0 73 68 65 6c 6c 5f 65 73 63 61 70 65 5f 63 72 6e  shell_escape_crn
205b0 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
205c0 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 73 68 65 6c 6c 45 73 63 61 70 65 43 72     shellEscapeCr
205f0 6e 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nl, 0, 0);.    s
20600 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20610 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
20620 68 65 6c 6c 5f 69 6e 74 33 32 22 2c 20 32 2c 20  hell_int32", 2, 
20630 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
20660 6c 49 6e 74 33 32 2c 20 30 2c 20 30 29 3b 0a 20  lInt32, 0, 0);. 
20670 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20680 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20690 2c 20 22 73 68 65 6c 6c 5f 69 64 71 75 6f 74 65  , "shell_idquote
206a0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
206b0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 73 68 65 6c 6c 49 64 51 75 6f 74 65 2c 20    shellIdQuote, 
206e0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
206f0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
20700 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  TEM.    sqlite3_
20710 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
20720 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31  p->db, "edit", 1
20730 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
20740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
20760 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  itFunc, 0, 0);. 
20770 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
20780 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
20790 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c  , "edit", 2, SQL
207a0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e           editFun
207d0 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  c, 0, 0);.#endif
207e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
207f0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
20800 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
20810 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
20820 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
20830 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
20840 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
20850 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
20860 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
20870 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
20880 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
20890 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
208a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
208b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
208c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
208d0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
208e0 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  IZE.    else.   
208f0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20900 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  ==SHELL_OPEN_DES
20910 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f  ERIALIZE || p->o
20920 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
20930 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20  PEN_HEXDB ){.   
20940 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
20950 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a   int nData = 0;.
20960 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
20970 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 20 20  har *aData;.    
20980 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
20990 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  e==SHELL_OPEN_DE
209a0 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20  SERIALIZE ){.   
209b0 20 20 20 20 20 61 44 61 74 61 20 3d 20 28 75 6e       aData = (un
209c0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72 65 61  signed char*)rea
209d0 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65  dFile(p->zDbFile
209e0 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20  name, &nData);. 
209f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20a00 20 20 20 20 61 44 61 74 61 20 3d 20 72 65 61 64      aData = read
20a10 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74 61 29  HexDb(p, &nData)
20a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  ;.        if( aD
20a30 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
20a40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
20a50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20a70 5f 64 65 73 65 72 69 61 6c 69 7a 65 28 70 2d 3e  _deserialize(p->
20a80 64 62 2c 20 22 6d 61 69 6e 22 2c 20 61 44 61 74  db, "main", aDat
20a90 61 2c 20 6e 44 61 74 61 2c 20 6e 44 61 74 61 2c  a, nData, nData,
20aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ab0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53 45 52      SQLITE_DESER
20ac0 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42 4c  IALIZE_RESIZEABL
20ad0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
20ae0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
20af0 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e  SERIALIZE_FREEON
20b00 43 4c 4f 53 45 29 3b 0a 20 20 20 20 20 20 69 66  CLOSE);.      if
20b10 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
20b20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20b30 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20b40 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
20b50 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  ) returns %d\n",
20b60 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
20b70 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 78      if( p->szMax
20b80 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
20b90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
20ba0 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
20bb0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
20bc0 49 5a 45 5f 4c 49 4d 49 54 2c 20 26 70 2d 3e 73  IZE_LIMIT, &p->s
20bd0 7a 4d 61 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zMax);.      }. 
20be0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
20bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
20c00 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61   to close the da
20c10 74 61 62 61 65 73 20 63 6f 6e 6e 65 63 74 69 6f  tabaes connectio
20c20 6e 2e 20 20 52 65 70 6f 72 74 20 65 72 72 6f 72  n.  Report error
20c30 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6c 6f 73 65  s..*/.void close
20c40 5f 64 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _db(sqlite3 *db)
20c50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
20c60 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
20c70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20c80 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
20c90 72 72 2c 20 22 45 72 72 6f 72 3a 20 73 71 6c 69  rr, "Error: sqli
20ca0 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65 74 75  te3_close() retu
20cb0 72 6e 73 20 25 64 3a 20 25 73 5c 6e 22 2c 0a 20  rns %d: %s\n",. 
20cc0 20 20 20 20 20 20 20 72 63 2c 20 73 71 6c 69 74         rc, sqlit
20cd0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
20ce0 20 20 7d 20 0a 7d 0a 0a 23 69 66 20 48 41 56 45    } .}..#if HAVE
20cf0 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41 56  _READLINE || HAV
20d00 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a 2a  E_EDITLINE./*.**
20d10 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c 65   Readline comple
20d20 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a 2a  tion callbacks.*
20d30 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72  /.static char *r
20d40 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
20d50 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f 6e  on_generator(con
20d60 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20 69  st char *text, i
20d70 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74 61  nt state){.  sta
20d80 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  tic sqlite3_stmt
20d90 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
20da0 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66 28  har *zRet;.  if(
20db0 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20   state==0 ){.   
20dc0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
20dd0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20de0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53  e(pStmt);.    zS
20df0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
20e00 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49 53  intf("SELECT DIS
20e10 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65 20  TINCT candidate 
20e20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
20e50 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
20e60 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20 74  ) ORDER BY 1", t
20e70 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
20e80 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
20e90 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
20ea0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
20eb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
20ec0 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ql);.  }.  if( s
20ed0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
20ee0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
20ef0 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74 72  {.    zRet = str
20f00 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  dup((const char*
20f10 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
20f20 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
20f30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
20f40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
20f50 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74  Stmt);.    pStmt
20f60 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20 3d   = 0;.    zRet =
20f70 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20f80 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63 20   zRet;.}.static 
20f90 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65 5f  char **readline_
20fa0 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74  completion(const
20fb0 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
20fc0 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
20fd0 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d 70  nd){.  rl_attemp
20fe0 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 6f  ted_completion_o
20ff0 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ver = 1;.  retur
21000 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  n rl_completion_
21010 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20 72  matches(zText, r
21020 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69  eadline_completi
21030 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a 7d  on_generator);.}
21040 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e  ..#elif HAVE_LIN
21050 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69 6e  ENOISE./*.** Lin
21060 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69 6f  enoise completio
21070 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  n callback.*/.st
21080 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e 6f  atic void lineno
21090 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63  ise_completion(c
210a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65  onst char *zLine
210b0 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70 6c  , linenoiseCompl
210c0 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20 69  etions *lc){.  i
210d0 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c 65  nt nLine = strle
210e0 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 6e  n30(zLine);.  in
210f0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 73  t i, iStart;.  s
21100 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
21110 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
21120 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75  zSql;.  char zBu
21130 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28 20  f[1000];..  if( 
21140 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42 75  nLine>sizeof(zBu
21150 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b 0a  f)-30 ) return;.
21160 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d    if( zLine[0]==
21170 27 2e 27 20 7c 7c 20 7a 4c 69 6e 65 5b 30 5d 3d  '.' || zLine[0]=
21180 3d 27 23 27 29 20 72 65 74 75 72 6e 3b 0a 20 20  ='#') return;.  
21190 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20 69  for(i=nLine-1; i
211a0 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  >=0 && (isalnum(
211b0 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c 69  zLine[i]) || zLi
211c0 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d 2d  ne[i]=='_'); i--
211d0 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c 69  ){}.  if( i==nLi
211e0 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  ne-1 ) return;. 
211f0 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20   iStart = i+1;. 
21200 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c   memcpy(zBuf, zL
21210 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ine, iStart);.  
21220 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
21230 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
21240 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
21250 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
21260 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
21270 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
21280 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25 51  OM completion(%Q
21290 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22  ,%Q) ORDER BY 1"
212a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
212b0 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69 6e             &zLin
212c0 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e 65  e[iStart], zLine
212d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  );.  sqlite3_pre
212e0 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62  pare_v2(globalDb
212f0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
21300 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
21310 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
21320 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c 6f  sqlite3_exec(glo
21330 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20 70  balDb, "PRAGMA p
21340 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 30  age_count", 0, 0
21350 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74 68  , 0); /* Load th
21360 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77 68  e schema */.  wh
21370 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
21380 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
21390 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
213a0 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65 74  t char *zComplet
213b0 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ion = (const cha
213c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
213d0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
213e0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70 6c  ;.    int nCompl
213f0 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  etion = sqlite3_
21400 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
21410 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
21420 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74 69  iStart+nCompleti
21430 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75 66  on < sizeof(zBuf
21440 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  )-1 ){.      mem
21450 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74 2c  cpy(zBuf+iStart,
21460 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e 43   zCompletion, nC
21470 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20 20  ompletion+1);.  
21480 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64 64      linenoiseAdd
21490 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20 7a  Completion(lc, z
214a0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Buf);.    }.  }.
214b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
214c0 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65 6e  ze(pStmt);.}.#en
214d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43 2d  dif../*.** Do C-
214e0 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20 64  language style d
214f0 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  equoting..**.** 
21500 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61 72     \a    -> alar
21510 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d 3e  m.**    \b    ->
21520 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20 20   backspace.**   
21530 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a 2a   \t    -> tab.**
21540 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65 77      \n    -> new
21550 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20 20  line.**    \v   
21560 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61 62   -> vertical tab
21570 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e 20  .**    \f    -> 
21580 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20 20  form feed.**    
21590 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61 67  \r    -> carriag
215a0 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20 5c  e return.**    \
215b0 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a 2a  s    -> space.**
215c0 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a 2a      \"    -> ".*
215d0 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27 0a  *    \'    -> '.
215e0 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20 62  **    \\    -> b
215f0 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20 5c  ackslash.**    \
21600 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63 68  NNN  -> ascii ch
21610 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20 6f  aracter NNN in o
21620 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ctal.*/.static v
21630 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b  oid resolve_back
21640 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a 29  slashes(char *z)
21650 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
21660 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28  char c;.  while(
21670 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27 20   *z && *z!='\\' 
21680 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  ) z++;.  for(i=j
21690 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
216a0 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  0; i++, j++){.  
216b0 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26 26    if( c=='\\' &&
216c0 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20 20   z[i+1]!=0 ){.  
216d0 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
216e0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61 27        if( c=='a'
216f0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21700 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\a';.      }els
21710 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a  e if( c=='b' ){.
21720 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27          c = '\b'
21730 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21740 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
21750 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20 20      c = '\t';.  
21760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21770 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='n' ){.        
21780 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  c = '\n';.      
21790 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76 27  }else if( c=='v'
217a0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
217b0 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\v';.      }els
217c0 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b 0a  e if( c=='f' ){.
217d0 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
217e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
217f0 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20  ( c=='r' ){.    
21800 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
21810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21820 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='"' ){.        
21830 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 7d  c = '"';.      }
21840 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27  else if( c=='\''
21850 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
21860 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73  '\'';.      }els
21870 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b  e if( c=='\\' ){
21880 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 5c  .        c = '\\
21890 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
218a0 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
218b0 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '7' ){.        c
218c0 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20   -= '0';.       
218d0 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
218e0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
218f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b  ){.          i++
21900 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
21910 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d 20  (c<<3) + z[i] - 
21920 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69  '0';.          i
21930 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20 26  f( z[i+1]>='0' &
21940 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29 7b  & z[i+1]<='7' ){
21950 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b  .            i++
21960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20  ;.            c 
21970 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
21980 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
21990 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
219a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
219b0 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69  [j] = c;.  }.  i
219c0 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d 20  f( j<i ) z[j] = 
219d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  0;.}../*.** Inte
219e0 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65 69  rpret zArg as ei
219f0 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20  ther an integer 
21a00 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  or a boolean val
21a10 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f 72  ue.  Return 1 or
21a20 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20 61   0.** for TRUE a
21a30 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75 72  nd FALSE.  Retur
21a40 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  n the integer va
21a50 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69 61  lue if appropria
21a60 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
21a70 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63  t booleanValue(c
21a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
21a90 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
21aa0 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
21ab0 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
21ac0 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68 65  .    for(i=2; he
21ad0 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
21ae0 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a  [i])>=0; i++){}.
21af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
21b00 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27  (i=0; zArg[i]>='
21b10 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27  0' && zArg[i]<='
21b20 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20  9'; i++){}.  }. 
21b30 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72 67   if( i>0 && zArg
21b40 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [i]==0 ) return 
21b50 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61 6c  (int)(integerVal
21b60 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66 66  ue(zArg) & 0xfff
21b70 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73 71  fffff);.  if( sq
21b80 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
21b90 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20  rg, "on")==0 || 
21ba0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
21bb0 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20 29  zArg,"yes")==0 )
21bc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21bd0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
21be0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
21bf0 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c  "off")==0 || sql
21c00 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
21c10 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20  g,"no")==0 ){.  
21c20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21c30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
21c40 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f  derr, "ERROR: No
21c50 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  t a boolean valu
21c60 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d  e: \"%s\". Assum
21c70 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a  ing \"no\".\n",.
21c80 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29 3b            zArg);
21c90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21ca0 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65  /*.** Set or cle
21cb0 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67 20  ar a shell flag 
21cc0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20 62  according to a b
21cd0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f  oolean value..*/
21ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
21cf0 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65 6c  OrClearFlag(Shel
21d00 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69 67  lState *p, unsig
21d10 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74  ned mFlag, const
21d20 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
21d30 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  if( booleanValue
21d40 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53 68  (zArg) ){.    Sh
21d50 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d 46  ellSetFlag(p, mF
21d60 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lag);.  }else{. 
21d70 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61     ShellClearFla
21d80 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d  g(p, mFlag);.  }
21d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
21da0 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c 20  an output file, 
21db0 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20 6e  assuming it is n
21dc0 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74 64  ot stderr or std
21dd0 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
21de0 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63  id output_file_c
21df0 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  lose(FILE *f){. 
21e00 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74 64   if( f && f!=std
21e10 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72 72  out && f!=stderr
21e20 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a   ) fclose(f);.}.
21e30 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70  ./*.** Try to op
21e40 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c  en an output fil
21e50 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20 22  e.   The names "
21e60 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74 64  stdout" and "std
21e70 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f  err" are.** reco
21e80 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74 68  gnized and do th
21e90 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20 20  e right thing.  
21ea0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
21eb0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   if the output.*
21ec0 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f  * filename is "o
21ed0 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ff"..*/.static F
21ee0 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65  ILE *output_file
21ef0 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  _open(const char
21f00 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54 65   *zFile, int bTe
21f10 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45 20  xtMode){.  FILE 
21f20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  *f;.  if( strcmp
21f30 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29  (zFile,"stdout")
21f40 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
21f50 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69  tdout;.  }else i
21f60 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
21f70 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b   "stderr")==0 ){
21f80 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b  .    f = stderr;
21f90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
21fa0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22  cmp(zFile, "off"
21fb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
21fc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21fd0 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  f = fopen(zFile,
21fe0 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77 22   bTextMode ? "w"
21ff0 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66   : "wb");.    if
22000 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( f==0 ){.      
22010 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22020 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
22030 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
22040 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ", zFile);.    }
22050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 3b  .  }.  return f;
22060 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
22070 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
22080 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f  .** A routine fo
22090 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75  r handling outpu
220a0 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74  t from sqlite3_t
220b0 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  race()..*/.stati
220c0 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f  c int sql_trace_
220d0 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69  callback(.  unsi
220e0 67 6e 65 64 20 6d 54 79 70 65 2c 20 20 20 20 20  gned mType,     
220f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63 65      /* The trace
22100 20 74 79 70 65 20 2a 2f 0a 20 20 76 6f 69 64 20   type */.  void 
22110 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
22120 20 20 20 2f 2a 20 54 68 65 20 53 68 65 6c 6c 53     /* The ShellS
22130 74 61 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  tate pointer */.
22140 20 20 76 6f 69 64 20 2a 70 50 2c 20 20 20 20 20    void *pP,     
22150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 75            /* Usu
22160 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
22170 6f 20 73 71 6c 69 74 65 5f 73 74 6d 74 20 2a 2f  o sqlite_stmt */
22180 0a 20 20 76 6f 69 64 20 2a 70 58 20 20 20 20 20  .  void *pX     
22190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
221a0 78 69 6c 69 61 72 79 20 6f 75 74 70 75 74 20 2a  xiliary output *
221b0 2f 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  /.){.  ShellStat
221c0 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
221d0 74 65 2a 29 70 41 72 67 3b 0a 20 20 73 71 6c 69  te*)pArg;.  sqli
221e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
221f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22200 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 53 71 6c 3b  Sql;.  int nSql;
22210 0a 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f  .  if( p->traceO
22220 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
22230 3b 0a 20 20 69 66 28 20 6d 54 79 70 65 3d 3d 53  ;.  if( mType==S
22240 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
22250 45 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  E ){.    utf8_pr
22260 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
22270 2c 20 22 2d 2d 20 63 6c 6f 73 69 6e 67 20 64 61  , "-- closing da
22280 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
22290 6e 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  n\n");.    retur
222a0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 0;.  }.  if( m
222b0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 54 52 41  Type!=SQLITE_TRA
222c0 43 45 5f 52 4f 57 20 26 26 20 28 28 63 6f 6e 73  CE_ROW && ((cons
222d0 74 20 63 68 61 72 2a 29 70 58 29 5b 30 5d 3d 3d  t char*)pX)[0]==
222e0 27 2d 27 20 29 7b 0a 20 20 20 20 7a 53 71 6c 20  '-' ){.    zSql 
222f0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
22300 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  X;.  }else{.    
22310 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65 33  pStmt = (sqlite3
22320 5f 73 74 6d 74 2a 29 70 50 3b 0a 20 20 20 20 73  _stmt*)pP;.    s
22330 77 69 74 63 68 28 20 70 2d 3e 65 54 72 61 63 65  witch( p->eTrace
22340 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
22350 73 65 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 45  se SHELL_TRACE_E
22360 58 50 41 4e 44 45 44 3a 20 7b 0a 20 20 20 20 20  XPANDED: {.     
22370 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
22380 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70  3_expanded_sql(p
22390 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
223a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
223b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
223c0 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 20  LE_NORMALIZE.   
223d0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52     case SHELL_TR
223e0 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 3a 20  ACE_NORMALIZED: 
223f0 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d  {.        zSql =
22400 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
22410 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  zed_sql(pStmt);.
22420 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22430 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
22440 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
22450 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71         zSql = sq
22460 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
22470 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
22480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22490 20 7d 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30   }.  if( zSql==0
224a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
224b0 53 71 6c 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  Sql = strlen30(z
224c0 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Sql);.  while( n
224d0 53 71 6c 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 53  Sql>0 && zSql[nS
224e0 71 6c 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 6e 53  ql-1]==';' ){ nS
224f0 71 6c 2d 2d 3b 20 7d 0a 20 20 73 77 69 74 63 68  ql--; }.  switch
22500 28 20 6d 54 79 70 65 20 29 7b 0a 20 20 20 20 63  ( mType ){.    c
22510 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
22520 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20 53  _ROW:.    case S
22530 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
22540 3a 20 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  : {.      utf8_p
22550 72 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75  rintf(p->traceOu
22560 74 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 53  t, "%.*s;\n", nS
22570 71 6c 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ql, zSql);.     
22580 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22590 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 52    case SQLITE_TR
225a0 41 43 45 5f 50 52 4f 46 49 4c 45 3a 20 7b 0a 20  ACE_PROFILE: {. 
225b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
225c0 36 34 20 6e 4e 61 6e 6f 73 65 63 20 3d 20 2a 28  64 nNanosec = *(
225d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
225e0 58 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  X;.      utf8_pr
225f0 69 6e 74 66 28 70 2d 3e 74 72 61 63 65 4f 75 74  intf(p->traceOut
22600 2c 20 22 25 2e 2a 73 3b 20 2d 2d 20 25 6c 6c 64  , "%.*s; -- %lld
22610 20 6e 73 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53   ns\n", nSql, zS
22620 71 6c 2c 20 6e 4e 61 6e 6f 73 65 63 29 3b 0a 20  ql, nNanosec);. 
22630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22650 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22660 2a 20 41 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e  * A no-op routin
22670 65 20 74 68 61 74 20 72 75 6e 73 20 77 69 74 68  e that runs with
22680 20 74 68 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e   the ".breakpoin
22690 74 22 20 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20  t" doc-command. 
226a0 20 54 68 69 73 20 69 73 0a 2a 2a 20 61 20 75 73   This is.** a us
226b0 65 66 75 6c 20 73 70 6f 74 20 74 6f 20 73 65 74  eful spot to set
226c0 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65 61   a debugger brea
226d0 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  kpoint..*/.stati
226e0 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61  c void test_brea
226f0 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
22700 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
22710 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b   = 0;.  nCall++;
22720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  .}../*.** An obj
22730 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 61 64  ect used to read
22740 20 61 20 43 53 56 20 61 6e 64 20 6f 74 68 65 72   a CSV and other
22750 20 66 69 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72   files for impor
22760 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
22770 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20 49  ruct ImportCtx I
22780 6d 70 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74  mportCtx;.struct
22790 20 49 6d 70 6f 72 74 43 74 78 20 7b 0a 20 20 63   ImportCtx {.  c
227a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
227b0 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
227c0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
227d0 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20    FILE *in;     
227e0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
227f0 65 20 43 53 56 20 74 65 78 74 20 66 72 6f 6d 20  e CSV text from 
22800 74 68 69 73 20 69 6e 70 75 74 20 73 74 72 65 61  this input strea
22810 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  m */.  char *z; 
22820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
22830 63 75 6d 75 6c 61 74 65 64 20 74 65 78 74 20 66  cumulated text f
22840 6f 72 20 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20  or a field */.  
22850 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
22860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22870 20 62 79 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20   bytes in z */. 
22880 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   int nAlloc;    
22890 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
228a0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20  located for z[] 
228b0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20  */.  int nLine; 
228c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
228d0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
228e0 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 74 46 69 72  */.  int bNotFir
228f0 73 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  st;      /* True
22900 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
22910 62 79 74 65 73 20 61 6c 72 65 61 64 79 20 72 65  bytes already re
22920 61 64 20 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72  ad */.  int cTer
22930 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  m;          /* C
22940 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74 65  haracter that te
22950 72 6d 69 6e 61 74 65 64 20 74 68 65 20 6d 6f 73  rminated the mos
22960 74 20 72 65 63 65 6e 74 20 66 69 65 6c 64 20 2a  t recent field *
22970 2f 0a 20 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b  /.  int cColSep;
22980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22990 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
229a0 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
229b0 61 6c 6c 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69  ally ",") */.  i
229c0 6e 74 20 63 52 6f 77 53 65 70 3b 20 20 20 20 20  nt cRowSep;     
229d0 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 20 73 65     /* The row se
229e0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
229f0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e  r.  (Usually "\n
22a00 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70  ") */.};../* App
22a10 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 62 79 74  end a single byt
22a20 65 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74  e to z[] */.stat
22a30 69 63 20 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61  ic void import_a
22a40 70 70 65 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72  ppend_char(Impor
22a50 74 43 74 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b  tCtx *p, int c){
22a60 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70  .  if( p->n+1>=p
22a70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
22a80 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e  p->nAlloc += p->
22a90 6e 41 6c 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20  nAlloc + 100;.  
22aa0 20 20 70 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33    p->z = sqlite3
22ab0 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c  _realloc64(p->z,
22ac0 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
22ad0 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
22ae0 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
22af0 72 79 28 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a  ry();.  }.  p->z
22b00 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63 68 61 72  [p->n++] = (char
22b10 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61  )c;.}../* Read a
22b20 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66   single field of
22b30 20 43 53 56 20 74 65 78 74 2e 20 20 43 6f 6d 70   CSV text.  Comp
22b40 61 74 69 62 6c 65 20 77 69 74 68 20 72 66 63 34  atible with rfc4
22b50 31 38 30 20 61 6e 64 20 65 78 74 65 6e 64 65 64  180 and extended
22b60 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 70 74  .** with the opt
22b70 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67 20 61 20  ion of having a 
22b80 73 65 70 61 72 61 74 6f 72 20 6f 74 68 65 72 20  separator other 
22b90 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a 2a 2a 20  than ","..**.** 
22ba0 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
22bb0 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
22bc0 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
22bd0 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
22be0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
22bf0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
22c00 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
22c10 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
22c20 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
22c30 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
22c40 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
22c50 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
22c60 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20 2b 20 20  is ","..**   +  
22c70 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74  Use p->rSep as t
22c80 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
22c90 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
22ca0 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20 2b 20 20  s "\n"..**   +  
22cb0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
22cc0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  e line number in
22cd0 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
22ce0 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
22cf0 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
22d00 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
22d10 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
22d20 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
22d30 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
22d40 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
22d50 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
22d60 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
22d70 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
22d80 44 45 43 4c 20 63 73 76 5f 72 65 61 64 5f 6f 6e  DECL csv_read_on
22d90 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74 43 74  e_field(ImportCt
22da0 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63 3b 0a  x *p){.  int c;.
22db0 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70 2d 3e    int cSep = p->
22dc0 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74 20 72  cColSep;.  int r
22dd0 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53 65 70  Sep = p->cRowSep
22de0 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20  ;.  p->n = 0;.  
22df0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
22e00 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46 20 7c  ;.  if( c==EOF |
22e10 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20  | seenInterrupt 
22e20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20  ){.    p->cTerm 
22e30 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74 75 72  = EOF;.    retur
22e40 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  n 0;.  }.  if( c
22e50 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='"' ){.    int
22e60 20 70 63 2c 20 70 70 63 3b 0a 20 20 20 20 69 6e   pc, ppc;.    in
22e70 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 70 2d  t startLine = p-
22e80 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69 6e 74 20  >nLine;.    int 
22e90 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20 20 20 20  cQuote = c;.    
22ea0 70 63 20 3d 20 70 70 63 20 3d 20 30 3b 0a 20 20  pc = ppc = 0;.  
22eb0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
22ec0 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
22ed0 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
22ee0 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e 6e 4c 69  c==rSep ) p->nLi
22ef0 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
22f00 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
22f10 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
22f20 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ote ){.         
22f30 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
22f40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22f60 20 20 20 20 20 69 66 28 20 28 63 3d 3d 63 53 65       if( (c==cSe
22f70 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74 65 29  p && pc==cQuote)
22f80 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d 72  .       || (c==r
22f90 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  Sep && pc==cQuot
22fa0 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d  e).       || (c=
22fb0 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 27 5c 72  =rSep && pc=='\r
22fc0 27 20 26 26 20 70 70 63 3d 3d 63 51 75 6f 74 65  ' && ppc==cQuote
22fd0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63 3d 3d  ).       || (c==
22fe0 45 4f 46 20 26 26 20 70 63 3d 3d 63 51 75 6f 74  EOF && pc==cQuot
22ff0 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
23000 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d 2d 3b 20      do{ p->n--; 
23010 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b 70 2d 3e  }while( p->z[p->
23020 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b 0a 20 20  n]!=cQuote );.  
23030 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
23040 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
23050 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23060 20 69 66 28 20 70 63 3d 3d 63 51 75 6f 74 65 20   if( pc==cQuote 
23070 26 26 20 63 21 3d 27 5c 72 27 20 29 7b 0a 20 20  && c!='\r' ){.  
23080 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
23090 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
230a0 3a 20 75 6e 65 73 63 61 70 65 64 20 25 63 20 63  : unescaped %c c
230b0 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a 20 20 20  haracter\n",.   
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
230d0 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69 6e 65 2c  zFile, p->nLine,
230e0 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20   cQuote);.      
230f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 45  }.      if( c==E
23100 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  OF ){.        ut
23110 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
23120 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74 65 72 6d  , "%s:%d: unterm
23130 69 6e 61 74 65 64 20 25 63 2d 71 75 6f 74 65 64  inated %c-quoted
23140 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20 20 20 20   field\n",.     
23150 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 46             p->zF
23160 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20  ile, startLine, 
23170 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  cQuote);.       
23180 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
23190 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
231a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6d 70 6f      }.      impo
231b0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
231c0 2c 20 63 29 3b 0a 20 20 20 20 20 20 70 70 63 20  , c);.      ppc 
231d0 3d 20 70 63 3b 0a 20 20 20 20 20 20 70 63 20 3d  = pc;.      pc =
231e0 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   c;.    }.  }els
231f0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  e{.    /* If thi
23200 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66  s is the first f
23210 69 65 6c 64 20 62 65 69 6e 67 20 70 61 72 73 65  ield being parse
23220 64 20 61 6e 64 20 69 74 20 62 65 67 69 6e 73 20  d and it begins 
23230 77 69 74 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  with the.    ** 
23240 55 54 46 2d 38 20 42 4f 4d 20 20 28 30 78 45 46  UTF-8 BOM  (0xEF
23250 20 42 42 20 42 46 29 20 74 68 65 6e 20 73 6b 69   BB BF) then ski
23260 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a 20 20 20  p the BOM */.   
23270 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
23280 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f 74 46 69  xef && p->bNotFi
23290 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rst==0 ){.      
232a0 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
232b0 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
232c0 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
232d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 26 30  ;.      if( (c&0
232e0 78 66 66 29 3d 3d 30 78 62 62 20 29 7b 0a 20 20  xff)==0xbb ){.  
232f0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
23300 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
23310 20 20 20 20 20 20 20 20 63 20 3d 20 66 67 65 74          c = fget
23320 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
23330 20 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d    if( (c&0xff)==
23340 30 78 62 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0xbf ){.        
23350 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
23360 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   1;.          p-
23370 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  >n = 0;.        
23380 20 20 72 65 74 75 72 6e 20 63 73 76 5f 72 65 61    return csv_rea
23390 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70 29 3b 0a  d_one_field(p);.
233a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
233b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  }.    }.    whil
233c0 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21 3d  e( c!=EOF && c!=
233d0 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70 20  cSep && c!=rSep 
233e0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
233f0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
23400 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
23410 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 7d  tc(p->in);.    }
23420 0a 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70  .    if( c==rSep
23430 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 69   ){.      p->nLi
23440 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ne++;.      if( 
23450 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e 7a 5b 70  p->n>0 && p->z[p
23460 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 70  ->n-1]=='\r' ) p
23470 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ->n--;.    }.   
23480 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20   p->cTerm = c;. 
23490 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20   }.  if( p->z ) 
234a0 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a  p->z[p->n] = 0;.
234b0 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73 74 20 3d    p->bNotFirst =
234c0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   1;.  return p->
234d0 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64 20 61 20  z;.}../* Read a 
234e0 73 69 6e 67 6c 65 20 66 69 65 6c 64 20 6f 66 20  single field of 
234f0 41 53 43 49 49 20 64 65 6c 69 6d 69 74 65 64 20  ASCII delimited 
23500 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  text..**.**   + 
23510 20 49 6e 70 75 74 20 63 6f 6d 65 73 20 66 72 6f   Input comes fro
23520 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20  m p->in..**   + 
23530 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
23540 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68  n p->z of length
23550 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f   p->n.  Space to
23560 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73   hold p->z comes
23570 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 73 71  .**      from sq
23580 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29  lite3_malloc64()
23590 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d  ..**   +  Use p-
235a0 3e 63 53 65 70 20 61 73 20 74 68 65 20 63 6f 6c  >cSep as the col
235b0 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 2e 20 20  umn separator.  
235c0 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 22  The default is "
235d0 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b 20 20 55  \x1F"..**   +  U
235e0 73 65 20 70 2d 3e 72 53 65 70 20 61 73 20 74 68  se p->rSep as th
235f0 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  e row separator.
23600 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73    The default is
23610 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20 20 2b 20   "\x1E"..**   + 
23620 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
23630 68 65 20 72 6f 77 20 6e 75 6d 62 65 72 20 69 6e  he row number in
23640 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a 20 20 20   p->nLine..**   
23650 2b 20 20 53 74 6f 72 65 20 74 68 65 20 63 68 61  +  Store the cha
23660 72 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d  racter that term
23670 69 6e 61 74 65 73 20 74 68 65 20 66 69 65 6c 64  inates the field
23680 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e 20 20 53   in p->cTerm.  S
23690 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 45 4f 46  tore.**      EOF
236a0 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 2e   on end-of-file.
236b0 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f 72 74 20  .**   +  Report 
236c0 73 79 6e 74 61 78 20 65 72 72 6f 72 73 20 6f 6e  syntax errors on
236d0 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74 61 74 69   stderr.*/.stati
236e0 63 20 63 68 61 72 20 2a 53 51 4c 49 54 45 5f 43  c char *SQLITE_C
236f0 44 45 43 4c 20 61 73 63 69 69 5f 72 65 61 64 5f  DECL ascii_read_
23700 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72 74  one_field(Import
23710 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 63  Ctx *p){.  int c
23720 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20 70  ;.  int cSep = p
23730 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e 74  ->cColSep;.  int
23740 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77 53   rSep = p->cRowS
23750 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a  ep;.  p->n = 0;.
23760 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
23770 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f 46  n);.  if( c==EOF
23780 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75 70   || seenInterrup
23790 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65 72  t ){.    p->cTer
237a0 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65 74  m = EOF;.    ret
237b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  urn 0;.  }.  whi
237c0 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20 63 21  le( c!=EOF && c!
237d0 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53 65 70  =cSep && c!=rSep
237e0 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61   ){.    import_a
237f0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
23800 3b 0a 20 20 20 20 63 20 3d 20 66 67 65 74 63 28  ;.    c = fgetc(
23810 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  p->in);.  }.  if
23820 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
23830 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 7d   p->nLine++;.  }
23840 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63 3b  .  p->cTerm = c;
23850 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29 20 70 2d  .  if( p->z ) p-
23860 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  >z[p->n] = 0;.  
23870 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a  return p->z;.}..
23880 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
23890 6e 73 66 65 72 20 64 61 74 61 20 66 6f 72 20 74  nsfer data for t
238a0 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20 20 49 66  able zTable.  If
238b0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
238c0 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f 76 69 6e  n while.** movin
238d0 67 20 66 6f 72 77 61 72 64 2c 20 74 72 79 20 74  g forward, try t
238e0 6f 20 67 6f 20 62 61 63 6b 77 61 72 64 73 2e 20  o go backwards. 
238f0 20 54 68 65 20 62 61 63 6b 77 61 72 64 73 20 6d   The backwards m
23900 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74 0a 2a 2a  ovement won't.**
23910 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48 4f 55   work for WITHOU
23920 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
23930 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
23940 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61 28 0a 20  ryToCloneData(. 
23950 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
23960 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
23970 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
23980 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73 71 6c 69  zTable.){.  sqli
23990 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
239a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
239b0 73 74 6d 74 20 2a 70 49 6e 73 65 72 74 20 3d 20  stmt *pInsert = 
239c0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72  0;.  char *zQuer
239d0 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  y = 0;.  char *z
239e0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e  Insert = 0;.  in
239f0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  t rc;.  int i, j
23a00 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54 61 62 6c  , n;.  int nTabl
23a10 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 61  e = strlen30(zTa
23a20 62 6c 65 29 3b 0a 20 20 69 6e 74 20 6b 20 3d 20  ble);.  int k = 
23a30 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  0;.  int cnt = 0
23a40 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 70  ;.  const int sp
23a50 69 6e 52 61 74 65 20 3d 20 31 30 30 30 30 3b 0a  inRate = 10000;.
23a60 0a 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69  .  zQuery = sqli
23a70 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
23a80 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
23a90 22 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 72  "", zTable);.  r
23aa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23ab0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
23ac0 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
23ad0 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
23ae0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
23af0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
23b00 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
23b10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23b20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
23b30 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
23b40 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
23b50 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
23b60 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
23b70 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
23b80 78 66 65 72 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  xfer;.  }.  n = 
23b90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
23ba0 6f 75 6e 74 28 70 51 75 65 72 79 29 3b 0a 20 20  ount(pQuery);.  
23bb0 7a 49 6e 73 65 72 74 20 3d 20 73 71 6c 69 74 65  zInsert = sqlite
23bc0 33 5f 6d 61 6c 6c 6f 63 36 34 28 32 30 30 20 2b  3_malloc64(200 +
23bd0 20 6e 54 61 62 6c 65 20 2b 20 6e 2a 33 29 3b 0a   nTable + n*3);.
23be0 20 20 69 66 28 20 7a 49 6e 73 65 72 74 3d 3d 30    if( zInsert==0
23bf0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
23c00 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 73 71 6c 69  memory();.  sqli
23c10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 30  te3_snprintf(200
23c20 2b 6e 54 61 62 6c 65 2c 7a 49 6e 73 65 72 74 2c  +nTable,zInsert,
23c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c40 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
23c50 47 4e 4f 52 45 20 49 4e 54 4f 20 5c 22 25 73 5c  GNORE INTO \"%s\
23c60 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61  " VALUES(?", zTa
23c70 62 6c 65 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c  ble);.  i = strl
23c80 65 6e 33 30 28 7a 49 6e 73 65 72 74 29 3b 0a 20  en30(zInsert);. 
23c90 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a   for(j=1; j<n; j
23ca0 2b 2b 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ++){.    memcpy(
23cb0 7a 49 6e 73 65 72 74 2b 69 2c 20 22 2c 3f 22 2c  zInsert+i, ",?",
23cc0 20 32 29 3b 0a 20 20 20 20 69 20 2b 3d 20 32 3b   2);.    i += 2;
23cd0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 49  .  }.  memcpy(zI
23ce0 6e 73 65 72 74 2b 69 2c 20 22 29 3b 22 2c 20 33  nsert+i, ");", 3
23cf0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
23d00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 6e 65 77  3_prepare_v2(new
23d10 44 62 2c 20 7a 49 6e 73 65 72 74 2c 20 2d 31 2c  Db, zInsert, -1,
23d20 20 26 70 49 6e 73 65 72 74 2c 20 30 29 3b 0a 20   &pInsert, 0);. 
23d30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
23d40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
23d50 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
23d60 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
23d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d80 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
23d90 65 28 6e 65 77 44 62 29 2c 20 73 71 6c 69 74 65  e(newDb), sqlite
23da0 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62 29 2c  3_errmsg(newDb),
23db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
23dc0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
23dd0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
23de0 7d 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 32  }.  for(k=0; k<2
23df0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 77 68 69 6c  ; k++){.    whil
23e00 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
23e10 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
23e20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
23e30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23e40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
23e50 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
23e60 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 51 75 65  column_type(pQue
23e70 72 79 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20  ry, i) ){.      
23e80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
23e90 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20  NULL: {.        
23ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23eb0 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 69  _null(pInsert, i
23ec0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
23ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
23ef0 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
23f00 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  R: {.           
23f10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
23f20 74 36 34 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  t64(pInsert, i+1
23f30 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
23f40 5f 69 6e 74 36 34 28 70 51 75 65 72 79 2c 69 29  _int64(pQuery,i)
23f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
23f60 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23f70 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  }.          case
23f80 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23fa0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
23fb0 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73  (pInsert, i+1, s
23fc0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
23fd0 75 62 6c 65 28 70 51 75 65 72 79 2c 69 29 29 3b  uble(pQuery,i));
23fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
23ff0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
24000 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
24010 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
24020 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24030 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
24040 65 72 74 2c 20 69 2b 31 2c 0a 20 20 20 20 20 20  ert, i+1,.      
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
24070 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
24080 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 69  mn_text(pQuery,i
24090 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
240c0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
240d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
240e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
240f0 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
24100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24110 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
24120 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
24130 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
24140 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24180 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 51 75  column_bytes(pQu
24190 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49      SQLITE_STATI
241d0 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  C);.            
241e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
241f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24200 20 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 20     } /* End for 
24210 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
24220 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
24230 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rt);.      if( r
24240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
24250 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26  rc!=SQLITE_ROW &
24260 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  & rc!=SQLITE_DON
24270 45 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  E ){.        utf
24280 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24290 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 5c 6e   "Error %d: %s\n
242a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  ", sqlite3_exten
242b0 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
242c0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
242d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
242e0 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
242f0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
24300 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
24310 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
24320 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
24330 20 28 63 6e 74 25 73 70 69 6e 52 61 74 65 29 3d   (cnt%spinRate)=
24340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
24350 69 6e 74 66 28 22 25 63 5c 62 22 2c 20 22 7c 2f  intf("%c\b", "|/
24360 2d 5c 5c 22 5b 28 63 6e 74 2f 73 70 69 6e 52 61  -\\"[(cnt/spinRa
24370 74 65 29 25 34 5d 29 3b 0a 20 20 20 20 20 20 20  te)%4]);.       
24380 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
24390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f  .      }.    } /
243a0 2a 20 45 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 20  * End while */. 
243b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
243c0 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a  E_DONE ) break;.
243d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
243e0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
243f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24400 51 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65  Query);.    zQue
24410 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
24420 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
24430 52 4f 4d 20 5c 22 25 77 5c 22 20 4f 52 44 45 52  ROM \"%w\" ORDER
24440 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 3b 22   BY rowid DESC;"
24450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24470 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  Table);.    rc =
24480 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24490 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
244a0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
244b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
244c0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
244d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61 72  ntf(stderr, "War
244e0 6e 69 6e 67 3a 20 63 61 6e 6e 6f 74 20 73 74 65  ning: cannot ste
244f0 70 20 5c 22 25 73 5c 22 20 62 61 63 6b 77 61 72  p \"%s\" backwar
24500 64 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  ds", zTable);.  
24510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24520 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 66 6f 72 28  .  } /* End for(
24530 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a 0a 65 6e 64 5f  k=0...) */..end_
24540 64 61 74 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  data_xfer:.  sql
24550 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
24560 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
24570 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e 73 65 72  _finalize(pInser
24580 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
24590 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 73 71  ee(zQuery);.  sq
245a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 65  lite3_free(zInse
245b0 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  rt);.}.../*.** T
245c0 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 61  ry to transfer a
245d0 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 73  ll rows of the s
245e0 63 68 65 6d 61 20 74 68 61 74 20 6d 61 74 63 68  chema that match
245f0 20 7a 57 68 65 72 65 2e 20 20 46 6f 72 0a 2a 2a   zWhere.  For.**
24600 20 65 61 63 68 20 72 6f 77 2c 20 69 6e 76 6f 6b   each row, invok
24610 65 20 78 46 6f 72 45 61 63 68 28 29 20 6f 6e 20  e xForEach() on 
24620 74 68 65 20 6f 62 6a 65 63 74 20 64 65 66 69 6e  the object defin
24630 65 64 20 62 79 20 74 68 61 74 20 72 6f 77 2e 0a  ed by that row..
24640 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  ** If an error i
24650 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
24660 69 6c 65 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  ile moving forwa
24670 72 64 20 74 68 72 6f 75 67 68 20 74 68 65 0a 2a  rd through the.*
24680 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
24690 74 61 62 6c 65 2c 20 74 72 79 20 61 67 61 69 6e  table, try again
246a0 20 6d 6f 76 69 6e 67 20 62 61 63 6b 77 61 72 64   moving backward
246b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
246c0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65  d tryToCloneSche
246d0 6d 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ma(.  ShellState
246e0 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
246f0 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
24700 68 61 72 20 2a 7a 57 68 65 72 65 2c 0a 20 20 76  har *zWhere,.  v
24710 6f 69 64 20 28 2a 78 46 6f 72 45 61 63 68 29 28  oid (*xForEach)(
24720 53 68 65 6c 6c 53 74 61 74 65 2a 2c 73 71 6c 69  ShellState*,sqli
24730 74 65 33 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  te3*,const char*
24740 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ).){.  sqlite3_s
24750 74 6d 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b  tmt *pQuery = 0;
24760 0a 20 20 63 68 61 72 20 2a 7a 51 75 65 72 79 20  .  char *zQuery 
24770 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
24780 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
24790 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
247a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
247b0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
247c0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a   *zErrMsg = 0;..
247d0 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
247e0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
247f0 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
24800 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
24810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24820 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
24830 45 52 45 20 25 73 22 2c 20 7a 57 68 65 72 65 29  ERE %s", zWhere)
24840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24850 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
24860 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
24870 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
24880 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24890 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
248a0 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
248b0 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
248e0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
248f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
24900 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
24910 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
24920 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
24930 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
24940 20 7d 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20   }.  while( (rc 
24950 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
24960 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
24970 52 4f 57 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ROW ){.    zName
24980 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
24990 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 30  n_text(pQuery, 0
249a0 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
249b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
249c0 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
249d0 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
249e0 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
249f0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 73  h(stdout);.    s
24a00 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
24a10 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
24a20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
24a30 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
24a40 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
24a50 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
24a60 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
24a70 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
24a80 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
24a90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24aa0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
24ab0 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
24ac0 20 20 7d 0a 20 20 20 20 69 66 28 20 78 46 6f 72    }.    if( xFor
24ad0 45 61 63 68 20 29 7b 0a 20 20 20 20 20 20 78 46  Each ){.      xF
24ae0 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
24af0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
24b00 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
24b10 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
24b20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
24b30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
24b40 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24b50 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 20  ize(pQuery);.   
24b60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
24b70 75 65 72 79 29 3b 0a 20 20 20 20 7a 51 75 65 72  uery);.    zQuer
24b80 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
24b90 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
24ba0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
24bb0 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bd0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
24be0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
24bf0 20 44 45 53 43 22 2c 20 7a 57 68 65 72 65 29 3b   DESC", zWhere);
24c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24c10 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
24c20 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
24c30 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
24c40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24c50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
24c60 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
24c70 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
24c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
24ca0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
24cb0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
24cc0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
24cf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
24d00 65 6d 61 5f 78 66 65 72 3b 0a 20 20 20 20 7d 0a  ema_xfer;.    }.
24d10 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
24d20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
24d30 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
24d40 4f 57 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  OW ){.      zNam
24d50 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
24d60 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
24d70 30 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d  0);.      zSql =
24d80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24d90 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 29 3b  text(pQuery, 1);
24da0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
24db0 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
24dc0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
24dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
24de0 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
24df0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
24e00 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
24e10 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
24e20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
24e30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
24e40 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
24e50 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
24e60 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
24e70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
24e80 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
24e90 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
24ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 78     }.      if( x
24eb0 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20 20 20  ForEach ){.     
24ec0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
24ed0 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
24ee0 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  r*)zName);.     
24ef0 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28   }.      printf(
24f00 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7d  "done\n");.    }
24f10 0a 20 20 7d 0a 65 6e 64 5f 73 63 68 65 6d 61 5f  .  }.end_schema_
24f20 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
24f30 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
24f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
24f50 28 7a 51 75 65 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a  (zQuery);.}../*.
24f60 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
24f70 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
24f80 64 20 22 7a 4e 65 77 44 62 22 2e 20 20 54 72 79  d "zNewDb".  Try
24f90 20 74 6f 20 72 65 63 6f 76 65 72 20 61 73 20 6d   to recover as m
24fa0 75 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  uch information.
24fb0 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c 65 20 6f  ** as possible o
24fc0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ut of the main d
24fd0 61 74 61 62 61 73 65 20 28 77 68 69 63 68 20 6d  atabase (which m
24fe0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 29  ight be corrupt)
24ff0 20 61 6e 64 20 77 72 69 74 65 20 69 74 0a 2a 2a   and write it.**
25000 20 69 6e 74 6f 20 7a 4e 65 77 44 62 2e 0a 2a 2f   into zNewDb..*/
25010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
25020 54 6f 43 6c 6f 6e 65 28 53 68 65 6c 6c 53 74 61  ToClone(ShellSta
25030 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  te *p, const cha
25040 72 20 2a 7a 4e 65 77 44 62 29 7b 0a 20 20 69 6e  r *zNewDb){.  in
25050 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
25060 2a 6e 65 77 44 62 20 3d 20 30 3b 0a 20 20 69 66  *newDb = 0;.  if
25070 28 20 61 63 63 65 73 73 28 7a 4e 65 77 44 62 2c  ( access(zNewDb,
25080 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  0)==0 ){.    utf
25090 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
250a0 20 22 46 69 6c 65 20 5c 22 25 73 5c 22 20 61 6c   "File \"%s\" al
250b0 72 65 61 64 79 20 65 78 69 73 74 73 2e 5c 6e 22  ready exists.\n"
250c0 2c 20 7a 4e 65 77 44 62 29 3b 0a 20 20 20 20 72  , zNewDb);.    r
250d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
250e0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
250f0 4e 65 77 44 62 2c 20 26 6e 65 77 44 62 29 3b 0a  NewDb, &newDb);.
25100 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25110 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25120 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 72 65 61  rr, "Cannot crea
25130 74 65 20 6f 75 74 70 75 74 20 64 61 74 61 62 61  te output databa
25140 73 65 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  se: %s\n",.     
25150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
25160 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
25170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25180 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
25190 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
251a0 5f 73 63 68 65 6d 61 3d 4f 4e 3b 22 2c 20 30 2c  _schema=ON;", 0,
251b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
251c0 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20  te3_exec(newDb, 
251d0 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
251e0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
251f0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
25200 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
25210 70 65 3d 27 74 61 62 6c 65 27 22 2c 20 74 72 79  pe='table'", try
25220 54 6f 43 6c 6f 6e 65 44 61 74 61 29 3b 0a 20 20  ToCloneData);.  
25230 20 20 74 72 79 54 6f 43 6c 6f 6e 65 53 63 68 65    tryToCloneSche
25240 6d 61 28 70 2c 20 6e 65 77 44 62 2c 20 22 74 79  ma(p, newDb, "ty
25250 70 65 21 3d 27 74 61 62 6c 65 27 22 2c 20 30 29  pe!='table'", 0)
25260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
25270 65 63 28 6e 65 77 44 62 2c 20 22 43 4f 4d 4d 49  ec(newDb, "COMMI
25280 54 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  T;", 0, 0, 0);. 
25290 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
252a0 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
252b0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
252c0 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  FF;", 0, 0, 0);.
252d0 20 20 7d 0a 20 20 63 6c 6f 73 65 5f 64 62 28 6e    }.  close_db(n
252e0 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
252f0 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
25300 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
25310 74 64 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tdout..**.** If 
25320 74 68 65 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e  the p->doXdgOpen
25330 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
25340 61 74 20 6d 65 61 6e 73 20 74 68 65 20 6f 75 74  at means the out
25350 70 75 74 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a  put was being.**
25360 20 72 65 64 69 72 65 63 74 65 64 20 74 6f 20 61   redirected to a
25370 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
25380 6e 61 6d 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d  named by p->zTem
25390 70 46 69 6c 65 2e 20 20 49 6e 20 74 68 61 74 20  pFile.  In that 
253a0 63 61 73 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20  case,.** launch 
253b0 73 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f  start/open/xdg-o
253c0 70 65 6e 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  pen on that temp
253d0 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73  orary file..*/.s
253e0 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
253f0 74 5f 72 65 73 65 74 28 53 68 65 6c 6c 53 74 61  t_reset(ShellSta
25400 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
25410 3e 6f 75 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27  >outfile[0]=='|'
25420 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
25430 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20  TE_OMIT_POPEN.  
25440 20 20 70 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29    pclose(p->out)
25450 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
25460 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c  {.    output_fil
25470 65 5f 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b  e_close(p->out);
25480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25490 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
254a0 20 20 69 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70    if( p->doXdgOp
254b0 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  en ){.      cons
254c0 74 20 63 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e  t char *zXdgOpen
254d0 43 6d 64 20 3d 0a 23 69 66 20 64 65 66 69 6e 65  Cmd =.#if define
254e0 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 20 20  d(_WIN32).      
254f0 22 73 74 61 72 74 22 3b 0a 23 65 6c 69 66 20 64  "start";.#elif d
25500 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25510 29 0a 20 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a  ).      "open";.
25520 23 65 6c 73 65 0a 20 20 20 20 20 20 22 78 64 67  #else.      "xdg
25530 2d 6f 70 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20  -open";.#endif. 
25540 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b       char *zCmd;
25550 0a 20 20 20 20 20 20 7a 43 6d 64 20 3d 20 73 71  .      zCmd = sq
25560 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
25570 73 20 25 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43  s %s", zXdgOpenC
25580 6d 64 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  md, p->zTempFile
25590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 79 73  );.      if( sys
255a0 74 65 6d 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20  tem(zCmd) ){.   
255b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
255c0 28 73 74 64 65 72 72 2c 20 22 46 61 69 6c 65 64  (stderr, "Failed
255d0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29  : [%s]\n", zCmd)
255e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
255f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
25600 64 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  d);.      output
25610 4d 6f 64 65 50 6f 70 28 70 29 3b 0a 20 20 20 20  ModePop(p);.    
25620 20 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d    p->doXdgOpen =
25630 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
25640 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20  3_sleep(100);.  
25650 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
25660 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
25670 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a  HAVE_SYSTEM) */.
25680 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65    }.  p->outfile
25690 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75  [0] = 0;.  p->ou
256a0 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f  t = stdout;.}../
256b0 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20  *.** Run an SQL 
256c0 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75  command and retu
256d0 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e  rn the single in
256e0 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f  teger result..*/
256f0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69  .static int db_i
25700 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nt(ShellState *p
25710 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
25720 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ql){.  sqlite3_s
25730 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
25740 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c  t res = 0;.  sql
25750 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
25760 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
25770 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
25780 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69  f( pStmt && sqli
25790 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
257a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
257b0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
257c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
257d0 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  t,0);.  }.  sqli
257e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
257f0 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  mt);.  return re
25800 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  s;.}../*.** Conv
25810 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20  ert a 2-byte or 
25820 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
25830 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  n integer into a
25840 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
25850 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
25860 65 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49  ed int get2byteI
25870 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
25880 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
25890 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b  a[0]<<8) + a[1];
258a0 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  .}.static unsign
258b0 65 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49  ed int get4byteI
258c0 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  nt(unsigned char
258d0 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *a){.  return (
258e0 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31  a[0]<<24) + (a[1
258f0 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c  ]<<16) + (a[2]<<
25900 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + a[3];.}../*
25910 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
25920 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f  on of the ".info
25930 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
25940 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72   Return 1 on err
25950 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61  or, 2 to exit, a
25960 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 0 otherwise..
25970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
25980 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
25990 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  nd(ShellState *p
259a0 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
259b0 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61   **azArg){.  sta
259c0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
259d0 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
259e0 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20  Name; int ofst; 
259f0 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20  } aField[] = {. 
25a00 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e      { "file chan
25a10 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32  ge counter:",  2
25a20 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  4  },.     { "da
25a30 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
25a40 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20  t:",  28  },.   
25a50 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61    { "freelist pa
25a60 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20  ge count:",  36 
25a70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
25a80 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20  ma cookie:",    
25a90 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20      40  },.     
25aa0 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74  { "schema format
25ab0 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d  :",        44  }
25ac0 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c  ,.     { "defaul
25ad0 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20  t cache size:", 
25ae0 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20    48  },.     { 
25af0 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20  "autovacuum top 
25b00 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a  root:",  52  },.
25b10 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e       { "incremen
25b20 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20  tal vacuum:",   
25b30 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74  64  },.     { "t
25b40 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20  ext encoding:", 
25b50 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20         56  },.  
25b60 20 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69     { "user versi
25b70 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30  on:",         60
25b80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70    },.     { "app
25b90 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20  lication id:",  
25ba0 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20       68  },.    
25bb0 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72   { "software ver
25bc0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20  sion:",     96  
25bd0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
25be0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
25bf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
25c00 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e; const char *z
25c10 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20  Sql; } aQuery[] 
25c20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62  = {.     { "numb
25c30 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a  er of tables:",.
25c40 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
25c50 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
25c60 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
25c70 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e  e'" },.     { "n
25c80 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73  umber of indexes
25c90 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
25ca0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
25cb0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
25cc0 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20  index'" },.     
25cd0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69  { "number of tri
25ce0 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20  ggers:",.       
25cf0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
25d00 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
25d10 79 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d  ype='trigger'" }
25d20 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
25d30 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20   of views:",.   
25d40 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
25d50 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
25d60 52 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20  RE type='view'" 
25d70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
25d80 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20  a size:",.      
25d90 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c   "SELECT total(l
25da0 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d  ength(sql)) FROM
25db0 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69   %s" },.  };.  i
25dc0 6e 74 20 69 2c 20 72 63 3b 0a 20 20 75 6e 73 69  nt i, rc;.  unsi
25dd0 67 6e 65 64 20 69 44 61 74 61 56 65 72 73 69 6f  gned iDataVersio
25de0 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65  n;.  char *zSche
25df0 6d 61 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a  maTab;.  char *z
25e00 44 62 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  Db = nArg>=2 ? a
25e10 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
25e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
25e30 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75   *pStmt = 0;.  u
25e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 48 64  nsigned char aHd
25e50 72 5b 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64  r[100];.  open_d
25e60 62 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  b(p, 0);.  if( p
25e70 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
25e80 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
25e90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
25ea0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
25eb0 20 20 22 53 45 4c 45 43 54 20 64 61 74 61 20 46    "SELECT data F
25ec0 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61 67  ROM sqlite_dbpag
25ed0 65 28 3f 31 29 20 57 48 45 52 45 20 70 67 6e 6f  e(?1) WHERE pgno
25ee0 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  =1",.           
25ef0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
25f00 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
25f10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 63    if( !sqlite3_c
25f20 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
25f30 64 28 22 45 4e 41 42 4c 45 5f 44 42 50 41 47 45  d("ENABLE_DBPAGE
25f40 5f 56 54 41 42 22 29 20 29 7b 0a 20 20 20 20 20  _VTAB") ){.     
25f50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25f60 65 72 72 2c 20 22 74 68 65 20 5c 22 2e 64 62 69  err, "the \".dbi
25f70 6e 66 6f 5c 22 20 63 6f 6d 6d 61 6e 64 20 72 65  nfo\" command re
25f80 71 75 69 72 65 73 20 74 68 65 20 22 0a 20 20 20  quires the ".   
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 20 20 22 2d 44 53 51 4c 49 54 45         "-DSQLITE
25fb0 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
25fc0 54 41 42 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  TAB compile-time
25fd0 20 6f 70 74 69 6f 6e 73 5c 6e 22 29 3b 0a 20 20   options\n");.  
25fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
25ff0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
26000 72 2c 20 22 65 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "error: %s\n"
26010 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
26020 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a  (p->db));.    }.
26030 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
26040 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
26050 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
26060 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
26070 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62  xt(pStmt, 1, zDb
26080 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
26090 54 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  TIC);.  if( sqli
260a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
260b0 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26  =SQLITE_ROW.   &
260c0 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  & sqlite3_column
260d0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e  _bytes(pStmt,0)>
260e0 31 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  100.  ){.    mem
260f0 63 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65  cpy(aHdr, sqlite
26100 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
26110 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20  tmt,0), 100);.  
26120 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
26130 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c  ze(pStmt);.  }el
26140 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  se{.    raw_prin
26150 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62  tf(stderr, "unab
26160 6c 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  le to read datab
26170 61 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a  ase header\n");.
26180 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
26190 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
261a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
261b0 20 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74   i = get2byteInt
261c0 28 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28  (aHdr+16);.  if(
261d0 20 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33   i==1 ) i = 6553
261e0 36 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66  6;.  utf8_printf
261f0 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
26200 25 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65  %d\n", "database
26210 20 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29   page size:", i)
26220 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26230 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26240 64 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72  d\n", "write for
26250 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29  mat:", aHdr[18])
26260 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26270 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26280 64 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d  d\n", "read form
26290 61 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b  at:", aHdr[19]);
262a0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
262b0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
262c0 5c 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62  \n", "reserved b
262d0 79 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d  ytes:", aHdr[20]
262e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
262f0 41 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64  ArraySize(aField
26300 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ); i++){.    int
26310 20 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69   ofst = aField[i
26320 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69  ].ofst;.    unsi
26330 67 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67  gned int val = g
26340 65 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20  et4byteInt(aHdr 
26350 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66  + ofst);.    utf
26360 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
26370 20 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69   "%-20s %u", aFi
26380 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61  eld[i].zName, va
26390 6c 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  l);.    switch( 
263a0 6f 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  ofst ){.      ca
263b0 73 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20  se 56: {.       
263c0 20 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61   if( val==1 ) ra
263d0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
263e0 20 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20   " (utf8)");.   
263f0 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20       if( val==2 
26400 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
26410 6f 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29  out, " (utf16le)
26420 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
26430 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69  val==3 ) raw_pri
26440 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75  ntf(p->out, " (u
26450 74 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20  tf16be)");.     
26460 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77   }.    }.    raw
26470 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26480 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
26490 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a   zDb==0 ){.    z
264a0 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
264b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69  te3_mprintf("mai
264c0 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  n.sqlite_master"
264d0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
264e0 74 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22  trcmp(zDb,"temp"
264f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  )==0 ){.    zSch
26500 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
26510 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22  _mprintf("%s", "
26520 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
26530 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  er");.  }else{. 
26540 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
26550 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26560 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d  "\"%w\".sqlite_m
26570 61 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20  aster", zDb);.  
26580 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  }.  for(i=0; i<A
26590 72 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29  rraySize(aQuery)
265a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
265b0 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
265c0 5f 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b  _mprintf(aQuery[
265d0 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61  i].zSql, zSchema
265e0 54 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61  Tab);.    int va
265f0 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53  l = db_int(p, zS
26600 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
26610 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
26620 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
26630 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
26640 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61  ", aQuery[i].zNa
26650 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20  me, val);.  }.  
26660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63  sqlite3_free(zSc
26670 68 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c 69  hemaTab);.  sqli
26680 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26690 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c  (p->db, zDb, SQL
266a0 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56  ITE_FCNTL_DATA_V
266b0 45 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56 65  ERSION, &iDataVe
266c0 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70  rsion);.  utf8_p
266d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
266e0 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61 74  -20s %u\n", "dat
266f0 61 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61 74  a version", iDat
26700 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74  aVersion);.  ret
26710 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
26720 50 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e  Print the curren
26730 74 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  t sqlite3_errmsg
26740 28 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65  () value to stde
26750 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  rr and return 1.
26760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
26770 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f  hellDatabaseErro
26780 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
26790 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
267a0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rr = sqlite3_err
267b0 6d 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f  msg(db);.  utf8_
267c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
267d0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
267e0 72 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  rr);.  return 1;
267f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
26800 65 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e  e the pattern in
26810 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74   zGlob[] against
26820 20 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d   the text in z[]
26830 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a  .  Return TRUE.*
26840 2a 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20  * if they match 
26850 61 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66  and FALSE (0) if
26860 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
26870 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69  ch..**.** Globbi
26880 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
26890 20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d       '*'       M
268a0 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
268b0 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
268c0 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ore characters..
268d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20  **.**      '?'  
268e0 20 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61       Matches exa
268f0 63 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74  ctly one charact
26900 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e  er..**.**     [.
26910 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73  ..]      Matches
26920 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66   one character f
26930 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64  rom the enclosed
26940 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20   list of.**     
26950 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61             chara
26960 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  cters..**.**    
26970 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63   [^...]     Matc
26980 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
26990 72 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63  r not in the enc
269a0 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  losed list..**.*
269b0 2a 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20  *      '#'      
269c0 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71   Matches any seq
269d0 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20  uence of one or 
269e0 6d 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68  more digits with
269f0 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   an.**          
26a00 20 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b        optional +
26a10 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72   or - sign in fr
26a20 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  ont.**.**      '
26a30 20 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61   '       Any spa
26a40 6e 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20  n of whitespace 
26a50 6d 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65  matches any othe
26a60 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20  r span of.**    
26a70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74              whit
26a80 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  espace..**.** Ex
26a90 74 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61  tra whitespace a
26aa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d  t the end of z[]
26ab0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
26ac0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63  static int testc
26ad0 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63  ase_glob(const c
26ae0 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73  har *zGlob, cons
26af0 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
26b00 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69  t c, c2;.  int i
26b10 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
26b20 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  n;..  while( (c 
26b30 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21  = (*(zGlob++)))!
26b40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73  =0 ){.    if( Is
26b50 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
26b60 20 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a    if( !IsSpace(*
26b70 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
26b80 20 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70       while( IsSp
26b90 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47  ace(*zGlob) ) zG
26ba0 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  lob++;.      whi
26bb0 6c 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20  le( IsSpace(*z) 
26bc0 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ) z++;.    }else
26bd0 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20   if( c=='*' ){. 
26be0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28       while( (c=(
26bf0 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20  *(zGlob++))) == 
26c00 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b  '*' || c=='?' ){
26c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
26c20 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d  '?' && (*(z++))=
26c30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26c50 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
26c60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
26c70 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
26c80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  ' ){.        whi
26c90 6c 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61  le( *z && testca
26ca0 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c  se_glob(zGlob-1,
26cb0 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  z)==0 ){.       
26cc0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
26cd0 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
26ce0 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20   (*z)!=0;.      
26cf0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
26d00 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d  c2 = (*(z++)))!=
26d10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
26d20 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20  le( c2!=c ){.   
26d30 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b         c2 = *(z+
26d40 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
26d50 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
26d60 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
26d70 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61        if( testca
26d80 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29  se_glob(zGlob,z)
26d90 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
26da0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
26db0 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
26dc0 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  f( c=='?' ){.   
26dd0 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d     if( (*(z++))=
26de0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26df0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
26e00 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '[' ){.      int
26e10 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20   prior_c = 0;.  
26e20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
26e30 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a      invert = 0;.
26e40 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29        c = *(z++)
26e50 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  ;.      if( c==0
26e60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
26e70 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
26e80 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32  +);.      if( c2
26e90 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='^' ){.       
26ea0 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20   invert = 1;.   
26eb0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
26ec0 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
26ed0 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20      if( c2==']' 
26ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
26ef0 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31  ==']' ) seen = 1
26f00 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
26f10 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
26f20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
26f30 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b  c2 && c2!=']' ){
26f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d  .        if( c2=
26f50 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  ='-' && zGlob[0]
26f60 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30  !=']' && zGlob[0
26f70 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e  ]!=0 && prior_c>
26f80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
26f90 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
26fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e            if( c>
26fb0 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63  =prior_c && c<=c
26fc0 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  2 ) seen = 1;.  
26fd0 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20          prior_c 
26fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
26ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
27000 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20  ( c==c2 ){.     
27010 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b         seen = 1;
27020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27030 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
27040 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   c2;.        }. 
27050 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
27060 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
27070 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20        if( c2==0 
27080 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72  || (seen ^ inver
27090 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  t)==0 ) return 0
270a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
270b0 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c=='#' ){.      
270c0 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c  if( (z[0]=='-' |
270d0 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20  | z[0]=='+') && 
270e0 49 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20  IsDigit(z[1]) ) 
270f0 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  z++;.      if( !
27100 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20  IsDigit(z[0]) ) 
27110 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
27120 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  z++;.      while
27130 28 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20  ( IsDigit(z[0]) 
27140 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65  ){ z++; }.    }e
27150 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63  lse{.      if( c
27160 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74  !=(*(z++)) ) ret
27170 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
27180 0a 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63  .  while( IsSpac
27190 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  e(*z) ){ z++; }.
271a0 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
271b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
271c0 65 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20  e the string as 
271d0 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  a command-line o
271e0 70 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65  ption with eithe
271f0 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20  r one or two.** 
27200 69 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72  initial "-" char
27210 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
27220 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63  c int optionMatc
27230 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  h(const char *zS
27240 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
27250 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74  zOpt){.  if( zSt
27260 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75  r[0]!='-' ) retu
27270 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a  rn 0;.  zStr++;.
27280 20 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27    if( zStr[0]=='
27290 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72  -' ) zStr++;.  r
272a0 65 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74  eturn strcmp(zSt
272b0 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a  r, zOpt)==0;.}..
272c0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66  /*.** Delete a f
272d0 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c  ile..*/.int shel
272e0 6c 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73  lDeleteFile(cons
272f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
27300 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  e){.  int rc;.#i
27310 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63  fdef _WIN32.  wc
27320 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
27330 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
27340 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  _unicode(zFilena
27350 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e  me);.  rc = _wun
27360 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74  link(z);.  sqlit
27370 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73  e3_free(z);.#els
27380 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28  e.  rc = unlink(
27390 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  zFilename);.#end
273a0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
273b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
273c0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
273d0 72 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68  rary file (if th
273e0 65 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20  ere is one) and 
273f0 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f  free the.** memo
27400 72 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  ry used to hold 
27410 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
27420 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  temp file..*/.st
27430 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54  atic void clearT
27440 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61  empFile(ShellSta
27450 74 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  te *p){.  if( p-
27460 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20  >zTempFile==0 ) 
27470 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
27480 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74  >doXdgOpen ) ret
27490 75 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c  urn;.  if( shell
274a0 44 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54  DeleteFile(p->zT
274b0 65 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72  empFile) ) retur
274c0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  n;.  sqlite3_fre
274d0 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b  e(p->zTempFile);
274e0 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20  .  p->zTempFile 
274f0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 0;.}../*.** Cr
27500 65 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20  eate a new temp 
27510 66 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74  file name with t
27520 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
27530 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27540 6e 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c  newTempFile(Shel
27550 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
27560 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b   char *zSuffix){
27570 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65  .  clearTempFile
27580 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
27590 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ree(p->zTempFile
275a0 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  );.  p->zTempFil
275b0 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  e = 0;.  if( p->
275c0 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  db ){.    sqlite
275d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
275e0 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f  ->db, 0, SQLITE_
275f0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
27600 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c  ME, &p->zTempFil
27610 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
27620 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  >zTempFile==0 ){
27630 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  .    sqlite3_uin
27640 74 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74  t64 r;.    sqlit
27650 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
27660 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
27670 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
27680 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27690 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20  ("temp%llx.%s", 
276a0 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  r, zSuffix);.  }
276b0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65  else{.    p->zTe
276c0 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  mpFile = sqlite3
276d0 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22  _mprintf("%z.%s"
276e0 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20  , p->zTempFile, 
276f0 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20  zSuffix);.  }.  
27700 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  if( p->zTempFile
27710 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70  ==0 ){.    raw_p
27720 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f  rintf(stderr, "o
27730 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
27740 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
27750 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   }.}.../*.** The
27760 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27770 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75  of SQL scalar fu
27780 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c  nction fkey_coll
27790 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73  ate_clause(), us
277a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c  ed.** by the ".l
277b0 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73  int fkey-indexes
277c0 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20  " command. This 
277d0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
277e0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c  is always.** cal
277f0 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72  led with four ar
27800 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61  guments - the pa
27810 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c  rent table name,
27820 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
27830 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20  mn name,.** the 
27840 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65  child table name
27850 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63   and the child c
27860 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  olumn name..**.*
27870 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  *   fkey_collate
27880 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d  _clause('parent-
27890 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f  tab', 'parent-co
278a0 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c  l', 'child-tab',
278b0 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a   'child-col').**
278c0 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66  .** If either of
278d0 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
278e0 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20  s or columns do 
278f0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
27900 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  function.** retu
27910 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72  rns an empty str
27920 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74  ing. An empty st
27930 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74  ring is also ret
27940 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61  urned if both ta
27950 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75  bles.** and colu
27960 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61  mns exist but ha
27970 76 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61  ve the same defa
27980 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
27990 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69  quence. Or,.** i
279a0 66 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74  f both exist but
279b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
279c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
279d0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20   are different, 
279e0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
279f0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72   returns the str
27a00 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70  ing " COLLATE <p
27a10 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
27a20 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72  ", where.** <par
27a30 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69  ent-collation> i
27a40 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
27a50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
27a60 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
27a70 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
27a80 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43   void shellFkeyC
27a90 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20  ollateClause(.  
27aa0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
27ab0 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61  *pCtx,.  int nVa
27ac0 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l,.  sqlite3_val
27ad0 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20  ue **apVal.){.  
27ae0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
27af0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
27b00 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20  _handle(pCtx);. 
27b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27b20 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rent;.  const ch
27b30 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a  ar *zParentCol;.
27b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
27b50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73  arentSeq;.  cons
27b60 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a  t char *zChild;.
27b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
27b80 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74  hildCol;.  const
27b90 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71   char *zChildSeq
27ba0 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61   = 0;  /* Initia
27bb0 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61  lize to avoid fa
27bc0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72  lse-positive war
27bd0 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ning */.  int rc
27be0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
27bf0 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e  l==4 );.  zParen
27c00 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
27c10 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27c20 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
27c30 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63   zParentCol = (c
27c40 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27c50 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
27c60 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c  Val[1]);.  zChil
27c70 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
27c80 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27c90 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  ext(apVal[2]);. 
27ca0 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f   zChildCol = (co
27cb0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
27cc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
27cd0 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  al[3]);..  sqlit
27ce0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
27cf0 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c  Ctx, "", -1, SQL
27d00 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  ITE_STATIC);.  r
27d10 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
27d20 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
27d30 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61  a(.      db, "ma
27d40 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50  in", zParent, zP
27d50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50  arentCol, 0, &zP
27d60 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20  arentSeq, 0, 0, 
27d70 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
27d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27d90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
27da0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
27db0 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62  data(.        db
27dc0 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64  , "main", zChild
27dd0 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20  , zChildCol, 0, 
27de0 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30  &zChildSeq, 0, 0
27df0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  , 0.    );.  }..
27e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27e10 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73  _OK && sqlite3_s
27e20 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65  tricmp(zParentSe
27e30 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b  q, zChildSeq) ){
27e40 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73  .    char *z = s
27e50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27e60 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50   COLLATE %s", zP
27e70 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73  arentSeq);.    s
27e80 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
27e90 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20  xt(pCtx, z, -1, 
27ea0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
27eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27ec0 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(z);.  }.}...
27ed0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
27ee0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d  entation of dot-
27ef0 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66  command ".lint f
27f00 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f  key-indexes"..*/
27f10 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
27f20 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53  FkeyIndexes(.  S
27f30 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
27f40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
27f50 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
27f60 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
27f70 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
27fa0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
27fb0 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
27fc0 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
27ff0 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
28000 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28010 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64   *db = pState->d
28020 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
28030 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71  base handle to q
28040 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f  uery "main" db o
28050 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  f */.  FILE *out
28060 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20   = pState->out; 
28070 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d         /* Stream
28080 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72   to write non-er
28090 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f  ror output to */
280a0 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20  .  int bVerbose 
280b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
280c0 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73     /* If -verbos
280d0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
280e0 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61    int bGroupByPa
280f0 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
28100 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79    /* If -groupby
28110 70 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e  parent is presen
28120 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
28150 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41  rate through azA
28160 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rg[] */.  const 
28170 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20  char *zIndent = 
28180 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  "";       /* How
28190 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20   much to indent 
281a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20  CREATE INDEX by 
281b0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
281e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
281f0 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
28200 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
28210 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  iled version of 
28220 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
28230 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  low */..  /*.  *
28240 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74  * This SELECT st
28250 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
28260 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68  one row for each
28270 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
28280 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20  straint.  ** in 
28290 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  the schema of th
282a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e  e main database.
282b0 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   The column valu
282c0 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  es are:.  **.  *
282d0 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66  * 0. The text of
282e0 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
282f0 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20  t similar to:.  
28300 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58  **.  **      "EX
28310 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28320 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63   SELECT 1 FROM c
28330 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45  hild_table WHERE
28340 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20   child_key=?".  
28350 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20  **.  **    This 
28360 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61  SELECT is simila
28370 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61  r to the one tha
28380 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
28390 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ys implementatio
283a0 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20  n.  **    needs 
283b0 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c  to run internall
283c0 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65  y on child table
283d0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
283e0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  n index that can
283f0 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64  .  **    be used
28400 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69   to optimize thi
28410 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74  s query, then it
28420 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65   can also be use
28430 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a  d by the FK.  **
28440 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69      implementati
28450 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44  on to optimize D
28460 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
28470 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
28480 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20  e parent.  **   
28490 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a   table..  **.  *
284a0 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74  * 1. A GLOB patt
284b0 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ern suitable for
284c0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
284d0 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20  (). If the plan 
284e0 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20  output by.  **  
284f0 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55    the EXPLAIN QU
28500 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
28510 20 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61   matches this pa
28520 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20  ttern, then the 
28530 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63  schema.  **    c
28540 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78  ontains an index
28550 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
28560 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  d to optimize th
28570 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  e query..  **.  
28580 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64  ** 2. Human read
28590 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64  able text that d
285a0 65 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69  escribes the chi
285b0 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ld table and col
285c0 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a  umns. e.g..  **.
285d0 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c    **       "chil
285e0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
285f0 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22  y1, child_key2)"
28600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75  .  **.  ** 3. Hu
28610 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78  man readable tex
28620 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  t that describes
28630 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c   the parent tabl
28640 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65  e and columns. e
28650 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
28660 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c      "parent_tabl
28670 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70  e(parent_key1, p
28680 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a  arent_key2)".  *
28690 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c  *.  ** 4. A full
286a0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
286b0 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69  atement for an i
286c0 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20  ndex that could 
286d0 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  be used to.  ** 
286e0 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45     optimize DELE
286f0 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
28700 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
28710 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67  arent table. e.g
28720 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
28730 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
28740 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c  child_table_chil
28750 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74  d_key ON child_t
28760 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22  able(child_key)"
28770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68  .  **.  ** 5. Th
28780 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61  e name of the pa
28790 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  rent table..  **
287a0 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20  .  ** These six 
287b0 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20  values are used 
287c0 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62  by the C logic b
287d0 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65  elow to generate
287e0 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a   the report..  *
287f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28800 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54  zSql =.  "SELECT
28810 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58   ".    "     'EX
28820 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28830 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27   SELECT 1 FROM '
28840 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
28850 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a  ) || ' WHERE '".
28860 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
28870 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e  concat(quote(s.n
28880 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71  ame) || '.' || q
28890 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
288a0 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20  | '=?' ".    "  
288b0 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  || fkey_collate_
288c0 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
288d0 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
288e0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
288f0 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
28900 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20  me, f.[from]),' 
28910 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22  AND ')".    ", "
28920 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52  .    "     'SEAR
28930 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e  CH TABLE ' || s.
28940 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20  name || ' USING 
28950 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28  COVERING INDEX*(
28960 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
28970 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c  up_concat('*=?',
28980 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27   ' AND ') || ')'
28990 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
289a0 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20       s.name  || 
289b0 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
289c0 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27  cat(f.[from],  '
289d0 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20  , ') || ')'".   
289e0 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20   ", ".    "     
289f0 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27  f.[table] || '('
28a00 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
28a10 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d  (COALESCE(f.[to]
28a20 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20  , p.[name])) || 
28a30 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
28a40 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20    "     'CREATE 
28a50 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65  INDEX ' || quote
28a60 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20  (s.name ||'_'|| 
28a70 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b  group_concat(f.[
28a80 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20  from], '_'))".  
28a90 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c    "  || ' ON ' |
28aa0 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  | quote(s.name) 
28ab0 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c  || '('".    "  |
28ac0 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71  | group_concat(q
28ad0 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c  uote(f.[from]) |
28ae0 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
28af0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
28b00 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
28b10 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20       f.[table], 
28b20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
28b30 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61   p.[name]), s.na
28b40 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27  me, f.[from]), '
28b50 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20  , ')".    "  || 
28b60 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20  ');'".    ", ". 
28b70 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c     "     f.[tabl
28b80 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73  e] ".    "FROM s
28b90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20  qlite_master AS 
28ba0 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67  s, pragma_foreig
28bb0 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d  n_key_list(s.nam
28bc0 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c  e) AS f ".    "L
28bd0 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f  EFT JOIN pragma_
28be0 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20  table_info AS p 
28bf0 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44  ON (pk-1=seq AND
28c00 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d   p.arg=f.[table]
28c10 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42  ) ".    "GROUP B
28c20 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22  Y s.name, f.id "
28c30 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28  .    "ORDER BY (
28c40 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e  CASE WHEN ? THEN
28c50 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20   f.[table] ELSE 
28c60 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b  s.name END)".  ;
28c70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28c80 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43  GlobIPK = "SEARC
28c90 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20  H TABLE * USING 
28ca0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
28cb0 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a  KEY (rowid=?)";.
28cc0 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41  .  for(i=2; i<nA
28cd0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  rg; i++){.    in
28ce0 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  t n = strlen30(a
28cf0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66  zArg[i]);.    if
28d00 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ( n>1 && sqlite3
28d10 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62  _strnicmp("-verb
28d20 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  ose", azArg[i], 
28d30 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  n)==0 ){.      b
28d40 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
28d50 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
28d60 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73  n>1 && sqlite3_s
28d70 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62  trnicmp("-groupb
28d80 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b  yparent", azArg[
28d90 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  i], n)==0 ){.   
28da0 20 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e     bGroupByParen
28db0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e  t = 1;.      zIn
28dc0 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20  dent = "    ";. 
28dd0 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20     }.    else{. 
28de0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28df0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
28e00 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f  %s %s ?-verbose?
28e10 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74   ?-groupbyparent
28e20 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?\n",.          
28e30 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b  azArg[0], azArg[
28e40 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  1].      );.    
28e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28e60 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
28e70 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
28e80 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  the fkey_collate
28e90 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75  _clause() SQL fu
28ea0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d  nction */.  rc =
28eb0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
28ec0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b  function(db, "fk
28ed0 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
28ee0 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54  e", 4, SQLITE_UT
28ef0 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65  F8,.      0, she
28f00 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61  llFkeyCollateCla
28f10 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a  use, 0, 0.  );..
28f20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28f30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
28f40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
28f50 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
28f60 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d  , &pSql, 0);.  }
28f70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
28f90 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71  te3_bind_int(pSq
28fa0 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61  l, 1, bGroupByPa
28fb0 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  rent);.  }..  if
28fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28fd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
28fe0 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20      char *zPrev 
28ff0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
29000 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
29010 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
29020 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  {.      int res 
29030 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
29040 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
29050 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  in = 0;.      co
29060 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
29070 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
29080 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
29090 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
290a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
290b0 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lob = (const cha
290c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
290d0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
290e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
290f0 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73  r *zFrom = (cons
29100 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
29110 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
29120 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 2);.      cons
29130 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20  t char *zTarget 
29140 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
29150 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
29160 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  xt(pSql, 3);.   
29170 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29180 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  CI = (const char
29190 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
291a0 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a  _text(pSql, 4);.
291b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
291c0 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e   *zParent = (con
291d0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
291e0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
291f0 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63  l, 5);..      rc
29200 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
29210 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
29220 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
29230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
29250 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  ak;.      if( SQ
29260 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
29270 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29  3_step(pExplain)
29280 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
29290 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20  t char *zPlan = 
292a0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
292b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
292c0 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20  (pExplain, 3);. 
292d0 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20         res = (. 
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d               0==
292f0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
29300 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20  zGlob, zPlan).  
29310 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73           || 0==s
29320 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
29330 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a  GlobIPK, zPlan).
29340 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29350 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
29360 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
29370 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
29380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29390 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  K ) break;..    
293a0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
293b0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
293c0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
293d0 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  : internal error
293e0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
293f0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
29400 20 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f          if( bGro
29410 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20  upByParent.     
29420 20 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20     && (bVerbose 
29430 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20  || res==0).     
29440 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20     && (zPrev==0 
29450 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
29460 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65  mp(zParent, zPre
29470 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  v)).        ){. 
29480 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
29490 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72  ntf(out, "-- Par
294a0 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c  ent table %s\n",
294b0 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
294c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
294d0 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20  e(zPrev);.      
294e0 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69      zPrev = sqli
294f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
29500 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , zParent);.    
29510 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
29520 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
29530 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
29540 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e  f(out, "%s%s -->
29550 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c   %s\n", zIndent,
29560 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a   zCI, zTarget);.
29570 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29580 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
29590 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
295a0 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f  tf(out, "%s/* no
295b0 20 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72   extra indexes r
295c0 65 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d  equired for %s -
295d0 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  > %s */\n",.    
295e0 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e            zInden
295f0 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65  t, zFrom, zTarge
29600 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
29610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29620 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29630 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
29640 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29660 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29670 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
29680 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
29690 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d      }..    rc2 =
296a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
296b0 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(pSql);.    if(
296c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
296d0 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2!=SQLITE_OK
296e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
296f0 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  c2;.      raw_pr
29700 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
29710 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
29720 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a  msg(db));.    }.
29730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
29740 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29750 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
29760 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
29770 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
29780 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
29790 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74  tation of ".lint
297a0 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
297b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
297c0 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
297d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
297e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
297f0 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
29800 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
29810 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29830 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
29840 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
29850 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
29860 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
29870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29880 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
29890 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
298a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   */.){.  int n;.
298b0 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f    n = (nArg>=2 ?
298c0 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
298d0 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  1]) : 0);.  if( 
298e0 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  n<1 || sqlite3_s
298f0 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d  trnicmp(azArg[1]
29900 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  , "fkey-indexes"
29910 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67  , n) ) goto usag
29920 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74  e;.  return lint
29930 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61  FkeyIndexes(pSta
29940 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29  te, azArg, nArg)
29950 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77  ;.. usage:.  raw
29960 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29970 22 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f  "Usage %s sub-co
29980 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e  mmand ?switches.
29990 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  ..?\n", azArg[0]
299a0 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  );.  raw_printf(
299b0 73 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73  stderr, "Where s
299c0 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a  ub-commands are:
299d0 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  \n");.  raw_prin
299e0 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20  tf(stderr, "    
299f0 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29  fkey-indexes\n")
29a00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29a10 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20  E_ERROR;.}..#if 
29a20 21 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f  !defined SQLITE_
29a30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
29a40 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  E.static void sh
29a50 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71  ellPrepare(.  sq
29a60 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
29a70 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74  t *pRc, .  const
29a80 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
29a90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
29aa0 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74  pStmt.){.  *ppSt
29ab0 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
29ac0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
29ad0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
29ae0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
29af0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
29b00 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
29b10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29b20 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
29b30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71  intf(stderr, "sq
29b40 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29  l error: %s (%d)
29b50 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
29b60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
29b70 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63  b), sqlite3_errc
29b80 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b  ode(db).      );
29b90 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63  .      *pRc = rc
29ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
29bb0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 70 72  *.** Create a pr
29bc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
29bd0 20 75 73 69 6e 67 20 70 72 69 6e 74 66 2d 73 74   using printf-st
29be0 79 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 6f  yle arguments fo
29bf0 72 20 74 68 65 20 53 51 4c 2e 0a 2a 2a 0a 2a 2a  r the SQL..**.**
29c00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29c10 20 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64   could be marked
29c20 20 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20   "static".  But 
29c30 69 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73  it is not always
29c40 20 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64   used,.** depend
29c50 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74  ing on compile-t
29c60 69 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79  ime options.  By
29c70 20 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73   omitting the "s
29c80 74 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64  tatic", we avoid
29c90 0a 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d  .** nuisance com
29ca0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
29cb0 62 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75  bout "defined bu
29cc0 74 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a  t not used"..*/.
29cd0 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
29ce0 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
29cf0 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
29d00 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
29d10 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
29d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
29d30 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
29d40 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
29d50 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
29d60 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
29d70 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
29d80 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
29d90 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
29da0 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
29db0 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
29dc0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
29dd0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
29de0 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
29df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
29e00 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
29e10 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
29e20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
29e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29e40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29e50 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
29e60 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
29e70 6e 74 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  nt created using
29e80 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
29e90 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntf()..**.** Thi
29ea0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 6f 75  s routine is cou
29eb0 6c 64 20 62 65 20 6d 61 72 6b 65 64 20 22 73 74  ld be marked "st
29ec0 61 74 69 63 22 2e 20 20 42 75 74 20 69 74 20 69  atic".  But it i
29ed0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 75 73 65  s not always use
29ee0 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20  d,.** depending 
29ef0 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  on compile-time 
29f00 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20 6f 6d 69  options.  By omi
29f10 74 74 69 6e 67 20 74 68 65 20 22 73 74 61 74 69  tting the "stati
29f20 63 22 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a 20  c", we avoid.** 
29f30 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
29f40 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
29f50 20 22 64 65 66 69 6e 65 64 20 62 75 74 20 6e 6f   "defined but no
29f60 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76 6f 69 64  t used"..*/.void
29f70 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a   shellFinalize(.
29f80 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
29f90 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
29fa0 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d  mt.){.  if( pStm
29fb0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
29fc0 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
29fd0 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
29fe0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
29ff0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2a000 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a  Stmt);.    if( *
2a010 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2a020 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
2a030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a040 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a050 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
2a060 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2a070 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
2a080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
2a090 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20  Rc = rc;.    }. 
2a0a0 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 74   }.}../* Reset t
2a0b0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
2a0c0 65 6d 65 6e 74 20 63 72 65 61 74 65 64 20 75 73  ement created us
2a0d0 69 6e 67 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ing shellPrepare
2a0e0 50 72 69 6e 74 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  Printf()..**.** 
2a0f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a100 63 6f 75 6c 64 20 62 65 20 6d 61 72 6b 65 64 20  could be marked 
2a110 22 73 74 61 74 69 63 22 2e 20 20 42 75 74 20 69  "static".  But i
2a120 74 20 69 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  t is not always 
2a130 75 73 65 64 2c 0a 2a 2a 20 64 65 70 65 6e 64 69  used,.** dependi
2a140 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65 2d 74 69  ng on compile-ti
2a150 6d 65 20 6f 70 74 69 6f 6e 73 2e 20 20 42 79 20  me options.  By 
2a160 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 22 73 74  omitting the "st
2a170 61 74 69 63 22 2c 20 77 65 20 61 76 6f 69 64 0a  atic", we avoid.
2a180 2a 2a 20 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70  ** nuisance comp
2a190 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 62  iler warnings ab
2a1a0 6f 75 74 20 22 64 65 66 69 6e 65 64 20 62 75 74  out "defined but
2a1b0 20 6e 6f 74 20 75 73 65 64 22 2e 0a 2a 2f 0a 76   not used"..*/.v
2a1c0 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28 0a  oid shellReset(.
2a1d0 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73    int *pRc, .  s
2a1e0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2a1f0 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mt.){.  int rc =
2a200 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2a210 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70 52  Stmt);.  if( *pR
2a220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a230 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2a250 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
2a260 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
2a270 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61 77  Stmt);.      raw
2a280 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a290 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
2a2a0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2a2b0 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g(db));.    }.  
2a2c0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d    *pRc = rc;.  }
2a2d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
2a2e0 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
2a2f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
2a300 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
2a310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2a320 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
2a330 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
2a340 5f 5a 4c 49 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _ZLIB)./********
2a350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a390 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
2a3a0 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22   ".archive" or "
2a3b0 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  .ar" command..*/
2a3c0 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65  ./*.** Structure
2a3d0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 20   representing a 
2a3e0 73 69 6e 67 6c 65 20 22 2e 61 72 22 20 63 6f 6d  single ".ar" com
2a3f0 6d 61 6e 64 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  mand..*/.typedef
2a400 20 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61 6e   struct ArComman
2a410 64 20 41 72 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72  d ArCommand;.str
2a420 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a  uct ArCommand {.
2a430 20 20 75 38 20 65 43 6d 64 3b 20 20 20 20 20 20    u8 eCmd;      
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 2f 2a 20 41 6e 20 41 52 5f 43 4d 44 5f 2a    /* An AR_CMD_*
2a460 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 62   value */.  u8 b
2a470 56 65 72 62 6f 73 65 3b 20 20 20 20 20 20 20 20  Verbose;        
2a480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a490 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65  rue if --verbose
2a4a0 20 2a 2f 0a 20 20 75 38 20 62 5a 69 70 3b 20 20   */.  u8 bZip;  
2a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a4d0 20 74 68 65 20 61 72 63 68 69 76 65 20 69 73 20   the archive is 
2a4e0 61 20 5a 49 50 20 2a 2f 0a 20 20 75 38 20 62 44  a ZIP */.  u8 bD
2a4f0 72 79 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20  ryRun;          
2a500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a510 75 65 20 69 66 20 2d 2d 64 72 79 2d 72 75 6e 20  ue if --dry-run 
2a520 2a 2f 0a 20 20 75 38 20 62 41 70 70 65 6e 64 3b  */.  u8 bAppend;
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a550 2d 2d 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38  --append */.  u8
2a560 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 3b 20 20 20   fromCmdLine;   
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a580 20 52 75 6e 20 66 72 6f 6d 20 2d 41 20 69 6e 73   Run from -A ins
2a590 74 65 61 64 20 6f 66 20 2e 61 72 63 68 69 76 65  tead of .archive
2a5a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20   */.  int nArg; 
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a5d0 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  of command argum
2a5e0 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2a5f0 7a 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20  zSrcTable;      
2a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71            /* "sq
2a610 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24  lar", "zipfile($
2a620 66 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20  file)" or "zip" 
2a630 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2a640 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  *zFile;         
2a650 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61       /* --file a
2a660 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  rgument, or NULL
2a670 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a680 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20   *zDir;         
2a690 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63        /* --direc
2a6a0 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f  tory argument, o
2a6b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
2a6c0 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a6e0 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
2a6f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53  arguments */.  S
2a700 68 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20  hellState *p;   
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a720 2a 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f  * Shell state */
2a730 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a750 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
2a760 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72  ontaining the ar
2a770 63 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  chive */.};../*.
2a780 2a 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65  ** Print a usage
2a790 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
2a7a0 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
2a7b0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
2a7c0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
2a7d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2a7e0 55 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a  Usage(FILE *f){.
2a7f0 20 20 73 68 6f 77 48 65 6c 70 28 66 2c 22 61 72    showHelp(f,"ar
2a800 63 68 69 76 65 22 29 3b 0a 20 20 72 65 74 75 72  chive");.  retur
2a810 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2a820 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  }../*.** Print a
2a830 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2a840 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d  for the .ar comm
2a850 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e  and to stderr an
2a860 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  d return .** SQL
2a870 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74  ITE_ERROR..*/.st
2a880 61 74 69 63 20 69 6e 74 20 61 72 45 72 72 6f 72  atic int arError
2a890 4d 73 67 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  Msg(ArCommand *p
2a8a0 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ar, const char *
2a8b0 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zFmt, ...){.  va
2a8c0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
2a8d0 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   *z;.  va_start(
2a8e0 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d  ap, zFmt);.  z =
2a8f0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
2a900 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 76  f(zFmt, ap);.  v
2a910 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
2a920 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a930 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2a940 7a 29 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 66  z);.  if( pAr->f
2a950 72 6f 6d 43 6d 64 4c 69 6e 65 20 29 7b 0a 20 20  romCmdLine ){.  
2a960 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a970 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2d 41 5c  derr, "Use \"-A\
2a980 22 20 66 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c  " for more help\
2a990 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
2a9a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a9b0 64 65 72 72 2c 20 22 55 73 65 20 5c 22 2e 61 72  derr, "Use \".ar
2a9c0 63 68 69 76 65 20 2d 2d 68 65 6c 70 5c 22 20 66  chive --help\" f
2a9d0 6f 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29  or more help\n")
2a9e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2a9f0 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
2aa00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2aa10 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20  }../*.** Values 
2aa20 66 6f 72 20 41 72 43 6f 6d 6d 61 6e 64 2e 65 43  for ArCommand.eC
2aa30 6d 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  md..*/.#define A
2aa40 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 20 20 20  R_CMD_CREATE    
2aa50 20 20 20 31 0a 23 64 65 66 69 6e 65 20 41 52 5f     1.#define AR_
2aa60 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20 20  CMD_UPDATE      
2aa70 20 32 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d   2.#define AR_CM
2aa80 44 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 33  D_INSERT       3
2aa90 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
2aaa0 45 58 54 52 41 43 54 20 20 20 20 20 20 34 0a 23  EXTRACT      4.#
2aab0 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
2aac0 53 54 20 20 20 20 20 20 20 20 20 35 0a 23 64 65  ST         5.#de
2aad0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50  fine AR_CMD_HELP
2aae0 20 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a           6../*.*
2aaf0 2a 20 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d  * Other (non-com
2ab00 6d 61 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a  mand) switches..
2ab10 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  */.#define AR_SW
2ab20 49 54 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20  ITCH_VERBOSE    
2ab30 20 37 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   7.#define AR_SW
2ab40 49 54 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20  ITCH_FILE       
2ab50 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   8.#define AR_SW
2ab60 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20  ITCH_DIRECTORY  
2ab70 20 39 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57   9.#define AR_SW
2ab80 49 54 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20  ITCH_APPEND     
2ab90 31 30 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57  10.#define AR_SW
2aba0 49 54 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20  ITCH_DRYRUN     
2abb0 31 31 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  11..static int a
2abc0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
2abd0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
2abe0 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
2abf0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
2ac00 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
2ac10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
2ac20 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
2ac30 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
2ac40 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
2ac50 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
2ac60 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
2ac70 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
2ac80 4d 44 5f 49 4e 53 45 52 54 3a 0a 20 20 20 20 63  MD_INSERT:.    c
2ac90 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a  ase AR_CMD_HELP:
2aca0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
2acb0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eCmd ){.        
2acc0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2acd0 67 28 70 41 72 2c 20 22 6d 75 6c 74 69 70 6c 65  g(pAr, "multiple
2ace0 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e 73   command options
2acf0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
2ad00 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d 20 65 53    pAr->eCmd = eS
2ad10 77 69 74 63 68 3b 0a 20 20 20 20 20 20 62 72 65  witch;.      bre
2ad20 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52  ak;..    case AR
2ad30 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 3a 0a  _SWITCH_DRYRUN:.
2ad40 20 20 20 20 20 20 70 41 72 2d 3e 62 44 72 79 52        pAr->bDryR
2ad50 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  un = 1;.      br
2ad60 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
2ad70 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 3a  _SWITCH_VERBOSE:
2ad80 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 56 65 72  .      pAr->bVer
2ad90 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  bose = 1;.      
2ada0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
2adb0 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44  AR_SWITCH_APPEND
2adc0 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 41 70  :.      pAr->bAp
2add0 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  pend = 1;.      
2ade0 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74  /* Fall thru int
2adf0 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20 20 20 20  o --file */.    
2ae00 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46  case AR_SWITCH_F
2ae10 49 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  ILE:.      pAr->
2ae20 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  zFile = zArg;.  
2ae30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
2ae40 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ase AR_SWITCH_DI
2ae50 52 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70  RECTORY:.      p
2ae60 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b  Ar->zDir = zArg;
2ae70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ae80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2ae90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2aea0 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
2aeb0 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e  d line for an ".
2aec0 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  ar" command. The
2aed0 20 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69   results are wri
2aee0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72  tten into.** str
2aef0 75 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53  ucture (*pAr). S
2af00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2af10 72 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d  rned if the comm
2af20 61 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73  and line is pars
2af30 65 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  ed.** successful
2af40 6c 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ly, otherwise an
2af50 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2af60 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64  s written to std
2af70 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  err and .** SQLI
2af80 54 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65  TE_ERROR returne
2af90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2afa0 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28   arParseCommand(
2afb0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afd0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
2afe0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
2aff0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
2b000 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b030 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
2b040 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61  g[] */.  ArComma
2b050 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
2b060 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
2b070 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
2b080 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2b090 41 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63  ArSwitch {.    c
2b0a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67  onst char *zLong
2b0b0 3b 0a 20 20 20 20 63 68 61 72 20 63 53 68 6f 72  ;.    char cShor
2b0c0 74 3b 0a 20 20 20 20 75 38 20 65 53 77 69 74 63  t;.    u8 eSwitc
2b0d0 68 3b 0a 20 20 20 20 75 38 20 62 41 72 67 3b 0a  h;.    u8 bArg;.
2b0e0 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20    } aSwitch[] = 
2b0f0 7b 0a 20 20 20 20 7b 20 22 63 72 65 61 74 65 22  {.    { "create"
2b100 2c 20 20 20 20 27 63 27 2c 20 41 52 5f 43 4d 44  ,    'c', AR_CMD
2b110 5f 43 52 45 41 54 45 2c 20 20 20 20 20 20 20 30  _CREATE,       0
2b120 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 74 72 61   },.    { "extra
2b130 63 74 22 2c 20 20 20 27 78 27 2c 20 41 52 5f 43  ct",   'x', AR_C
2b140 4d 44 5f 45 58 54 52 41 43 54 2c 20 20 20 20 20  MD_EXTRACT,     
2b150 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 69 6e 73   0 },.    { "ins
2b160 65 72 74 22 2c 20 20 20 20 27 69 27 2c 20 41 52  ert",    'i', AR
2b170 5f 43 4d 44 5f 49 4e 53 45 52 54 2c 20 20 20 20  _CMD_INSERT,    
2b180 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 6c     0 },.    { "l
2b190 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c 20  ist",      't', 
2b1a0 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20 20  AR_CMD_LIST,    
2b1b0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
2b1c0 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75 27  "update",    'u'
2b1d0 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 2c  , AR_CMD_UPDATE,
2b1e0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
2b1f0 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20 27  { "help",      '
2b200 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c  h', AR_CMD_HELP,
2b210 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
2b220 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20 20    { "verbose",  
2b230 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'v', AR_SWITCH_
2b240 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c 0a  VERBOSE,   0 },.
2b250 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20 20      { "file",   
2b260 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54 43     'f', AR_SWITC
2b270 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20 7d  H_FILE,      1 }
2b280 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64 22  ,.    { "append"
2b290 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57 49  ,    'a', AR_SWI
2b2a0 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20 31  TCH_APPEND,    1
2b2b0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65 63   },.    { "direc
2b2c0 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f 53  tory", 'C', AR_S
2b2d0 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c  WITCH_DIRECTORY,
2b2e0 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72 79   1 },.    { "dry
2b2f0 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41 52  run",    'n', AR
2b300 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c 20  _SWITCH_DRYRUN, 
2b310 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69     0 },.  };.  i
2b320 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a  nt nSwitch = siz
2b330 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20 73  eof(aSwitch) / s
2b340 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72 53  izeof(struct ArS
2b350 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74  witch);.  struct
2b360 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20   ArSwitch *pEnd 
2b370 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74  = &aSwitch[nSwit
2b380 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67  ch];..  if( nArg
2b390 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  <=1 ){.    utf8_
2b3a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b3b0 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  Wrong number of 
2b3c0 61 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61 67  arguments.  Usag
2b3d0 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  e:\n");.    retu
2b3e0 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65 72  rn arUsage(stder
2b3f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2b400 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67   char *z = azArg
2b410 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [1];.    if( z[0
2b420 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
2b430 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73  /* Traditional s
2b440 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63  tyle [tar] invoc
2b450 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2b460 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
2b470 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  iArg = 2;.      
2b480 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
2b490 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
2b4a0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
2b4b0 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  0;.        struc
2b4c0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
2b4d0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f  ;.        for(pO
2b4e0 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
2b4f0 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
2b500 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b510 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
2b520 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
2b530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b540 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29  if( pOpt==pEnd )
2b550 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2b560 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2b570 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
2b580 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
2b590 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
2b5a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
2b5b0 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
2b5c0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
2b5d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
2b5e0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
2b5f0 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20  sg(pAr, "option 
2b600 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
2b610 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29 3b  ment: %c",z[i]);
2b620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b630 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
2b640 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20 20  Arg[iArg++];.   
2b650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b660 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69 74  f( arProcessSwit
2b670 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65 53  ch(pAr, pOpt->eS
2b680 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20 72  witch, zArg) ) r
2b690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2b6a0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2b6b0 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
2b6c0 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 69  rg-iArg;.      i
2b6d0 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20 29  f( pAr->nArg>0 )
2b6e0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61  {.        pAr->a
2b6f0 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41  zArg = &azArg[iA
2b700 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg];.      }.   
2b710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2b720 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61 6c   Non-traditional
2b730 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
2b740 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a 20       int iArg;. 
2b750 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31 3b       for(iArg=1;
2b760 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72 67   iArg<nArg; iArg
2b770 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2b780 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   n;.        z = 
2b790 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
2b7a0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27       if( z[0]!='
2b7b0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
2b7c0 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e 67  /* All remaining
2b7d0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f   command line wo
2b7e0 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20  rds are command 
2b7f0 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
2b800 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
2b810 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
2b820 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  ];.          pAr
2b830 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
2b840 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  rg;.          br
2b850 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
2b860 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65         n = strle
2b870 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20 20  n30(z);..       
2b880 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20 29   if( z[1]!='-' )
2b890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2b8a0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  i;.          /* 
2b8b0 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f 72  One or more shor
2b8c0 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  t options */.   
2b8d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2b8e0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
2b8f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2b900 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20  r *zArg = 0;.   
2b910 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2b920 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 0a  ArSwitch *pOpt;.
2b930 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2b940 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
2b950 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
2b960 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
2b970 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f      if( z[i]==pO
2b980 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65  pt->cShort ) bre
2b990 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2b9a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
2b9b0 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b 0a  ( pOpt==pEnd ){.
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2b9d0 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
2b9e0 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a  pAr, "unrecogniz
2b9f0 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20  ed option: %c", 
2ba00 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
2ba10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2ba20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
2ba30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ba40 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
2ba90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bab0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
2bac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bad0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2bae0 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69  orMsg(pAr, "opti
2baf0 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
2bb00 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69  rgument: %c",z[i
2bb10 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2bb20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bb30 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
2bb40 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
2bb50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bb60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb70 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
2bb80 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
2bb90 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
2bba0 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
2bbb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2bbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bbd0 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27  else if( z[2]=='
2bbe0 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \0' ){.         
2bbf0 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c   /* A -- option,
2bc00 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
2bc10 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   all remaining c
2bc20 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
2bc30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2bc40 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
2bc50 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
2bc60 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
2bc70 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b   &azArg[iArg+1];
2bc80 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
2bc90 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
2bca0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
2bcb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
2bcc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2bcd0 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a   A long option *
2bce0 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
2bcf0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
2bd00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2bd10 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70   Argument for op
2bd20 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  tion, if any */.
2bd30 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2bd40 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63   ArSwitch *pMatc
2bd50 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  h = 0;      /* M
2bd60 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a  atching option *
2bd70 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  /.          stru
2bd80 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
2bd90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2bda0 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   Iterator */.   
2bdb0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
2bdc0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
2bdd0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
2bde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2bdf0 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d  st char *zLong =
2be00 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20   pOpt->zLong;.  
2be10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
2be20 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c  -2)<=strlen30(zL
2be30 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
2be40 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
2be50 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
2be60 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2be70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2be80 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
2be90 6f 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62 69  orMsg(pAr, "ambi
2bea0 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
2beb0 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
2bec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bed0 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
2bee0 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
2bef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bf10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
2bf20 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2bf40 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2bf50 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  r, "unrecognized
2bf60 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a 29   option: %s", z)
2bf70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bf80 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74          if( pMat
2bf90 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20  ch->bArg ){.    
2bfa0 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67          if( iArg
2bfb0 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  >=(nArg-1) ){.  
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2bfd0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70 41  rn arErrorMsg(pA
2bfe0 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  r, "option requi
2bff0 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
2c000 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
2c010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c020 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
2c030 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
2c040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c050 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2c060 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
2c070 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
2c080 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c090 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2c0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c0b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2c0c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2c0e0 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
2c0f0 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
2c100 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
2c110 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
2c120 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
2c130 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
2c140 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
2c150 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
2c160 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
2c170 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
2c180 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
2c190 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
2c1a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
2c1b0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
2c1c0 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
2c1d0 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
2c1e0 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
2c1f0 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
2c200 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2c210 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
2c220 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
2c230 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2c240 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
2c250 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2c260 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2c270 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
2c280 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
2c290 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
2c2a0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
2c2b0 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
2c2c0 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
2c2d0 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
2c2e0 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
2c2f0 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
2c300 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
2c310 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
2c320 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
2c330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c340 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
2c350 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
2c360 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
2c370 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
2c380 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
2c390 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
2c3a0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
2c3b0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2c3c0 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
2c3d0 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
2c3e0 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
2c3f0 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
2c400 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
2c410 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
2c420 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
2c430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2c440 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
2c450 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
2c460 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
2c470 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
2c480 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
2c490 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
2c4a0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
2c4b0 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
2c4c0 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
2c4d0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
2c4e0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
2c4f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2c500 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
2c510 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2c520 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
2c530 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2c540 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
2c550 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
2c560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
2c570 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
2c580 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
2c590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c5a0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
2c5b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2c5c0 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
2c5d0 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
2c5e0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
2c5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2c600 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2c610 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
2c620 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
2c630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
2c650 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
2c660 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
2c670 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
2c680 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
2c690 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
2c6a0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
2c6b0 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
2c6c0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2c6d0 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
2c6e0 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
2c6f0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
2c700 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
2c710 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
2c720 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
2c730 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
2c740 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
2c750 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
2c760 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
2c770 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
2c780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2c790 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
2c7a0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
2c7b0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
2c7c0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
2c7d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2c7e0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
2c7f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
2c800 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
2c810 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
2c820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c830 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
2c840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
2c850 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
2c860 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
2c870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2c880 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
2c890 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
2c8a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2c8b0 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
2c8c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2c8d0 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
2c8e0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
2c8f0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
2c900 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2c910 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
2c920 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
2c930 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
2c940 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
2c950 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
2c960 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
2c970 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
2c980 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
2c990 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c9a0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2c9b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2c9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c9d0 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
2c9e0 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
2c9f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
2ca00 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
2ca10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2ca20 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
2ca30 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
2ca40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2ca50 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
2ca60 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
2ca70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
2ca80 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
2ca90 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
2caa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
2cab0 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
2cac0 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
2cad0 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
2cae0 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
2caf0 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
2cb00 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
2cb10 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
2cb20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
2cb30 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
2cb40 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
2cb50 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
2cb60 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
2cb70 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
2cb80 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
2cb90 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
2cba0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
2cbb0 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
2cbc0 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2cbe0 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2cbf0 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
2cc00 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
2cc10 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2cc20 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
2cc30 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
2cc40 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
2cc50 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
2cc60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
2cc70 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2cc80 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
2cc90 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
2cca0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
2ccb0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
2ccc0 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
2ccd0 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
2cce0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ccf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2cd00 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
2cd10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
2cd20 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
2cd30 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
2cd40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2cd50 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
2cd60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cd70 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2cd80 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
2cd90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cda0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2cdb0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2cdc0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2cdd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2cde0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
2cdf0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
2ce00 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2ce10 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ql);.  sqlite3_f
2ce20 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72  ree(zWhere);.  r
2ce30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2ce40 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2ce50 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
2ce60 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
2ce70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
2ce80 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72 43  tractCommand(ArC
2ce90 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
2cea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2ceb0 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43 54  1 = .    "SELECT
2cec0 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20 7c   ".    " ($dir |
2ced0 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22 20  | name),".    " 
2cee0 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72 20  writefile(($dir 
2cef0 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d 6f  || name), %s, mo
2cf00 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20 20  de, mtime) ".   
2cf10 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20   "FROM %s WHERE 
2cf20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20 49  (%s) AND (data I
2cf30 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f 6e  S NULL OR $dirOn
2cf40 6c 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20 41  ly = 0)".    " A
2cf50 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42  ND name NOT GLOB
2cf60 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a 0a   '*..[/\\]*'";..
2cf70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
2cf80 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a  ExtraArg[] = { .
2cf90 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d      "sqlar_uncom
2cfa0 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29 22  press(data, sz)"
2cfb0 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20 7d  ,.    "data".  }
2cfc0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ;..  sqlite3_stm
2cfd0 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69  t *pSql = 0;.  i
2cfe0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cff0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 20  K;.  char *zDir 
2d000 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57 68  = 0;.  char *zWh
2d010 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ere = 0;.  int i
2d020 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  , j;..  /* If ar
2d030 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
2d040 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68 61  ified, check tha
2d050 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79 20  t they actually 
2d060 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20 2a  exist within.  *
2d070 2a 20 74 68 65 20 61 72 63 68 69 76 65 20 62 65  * the archive be
2d080 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e  fore proceeding.
2d090 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20 61   And formulate a
2d0a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
2d0b0 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 6d  .  ** match them
2d0c0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72 43  .  */.  rc = arC
2d0d0 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29  heckEntries(pAr)
2d0e0 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73  ;.  arWhereClaus
2d0f0 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68  e(&rc, pAr, &zWh
2d100 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ere);..  if( rc=
2d110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d120 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72 20    if( pAr->zDir 
2d130 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  ){.      zDir = 
2d140 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2d150 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69 72  "%s/", pAr->zDir
2d160 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d170 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
2d180 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a  e3_mprintf("");.
2d190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2d1a0 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  ir==0 ) rc = SQL
2d1b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2d1c0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
2d1d0 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26 72  intf(pAr->db, &r
2d1e0 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31 2c  c, &pSql, zSql1,
2d1f0 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61 41   .      azExtraA
2d200 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 70  rg[pAr->bZip], p
2d210 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
2d220 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69 66  Where.  );..  if
2d230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d240 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74  ){.    j = sqlit
2d250 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
2d260 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24  r_index(pSql, "$
2d270 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  dir");.    sqlit
2d280 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71  e3_bind_text(pSq
2d290 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c 20  l, j, zDir, -1, 
2d2a0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
2d2b0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
2d2c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2d2d0 20 74 77 69 63 65 2e 20 54 68 65 20 66 69 72 73   twice. The firs
2d2e0 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c  t time, writefil
2d2f0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20  e() is called.  
2d300 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63    ** for all arc
2d310 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61  hive members tha
2d320 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72  t should be extr
2d330 61 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e  acted. The secon
2d340 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f  d time,.    ** o
2d350 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72 65  nly for the dire
2d360 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73  ctories. This is
2d370 20 62 65 63 61 75 73 65 20 74 68 65 20 74 69 6d   because the tim
2d380 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20  estamps for.    
2d390 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64 69 72  ** extracted dir
2d3a0 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65  ectories must be
2d3b0 20 72 65 73 65 74 20 61 66 74 65 72 20 74 68 65   reset after the
2d3c0 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  y are populated 
2d3d0 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  (as.    ** popul
2d3e0 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67  ating them chang
2d3f0 65 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  es the timestamp
2d400 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ).  */.    for(i
2d410 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
2d420 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33       j = sqlite3
2d430 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2d440 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64 69  index(pSql, "$di
2d450 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 73  rOnly");.      s
2d460 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
2d470 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20 20  pSql, j, i);.   
2d480 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79     if( pAr->bDry
2d490 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Run ){.        u
2d4a0 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e  tf8_printf(pAr->
2d4b0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
2d4c0 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
2d4d0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2d4e0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2d4f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d500 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2d510 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
2d520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d530 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62 56   i==0 && pAr->bV
2d540 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
2d550 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d560 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2d570 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
2d580 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
2d590 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
2d5a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d5b0 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52    }.      shellR
2d5c0 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b  eset(&rc, pSql);
2d5d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
2d5e0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
2d5f0 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ql);.  }..  sqli
2d600 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a  te3_free(zDir);.
2d610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d620 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e  Where);.  return
2d630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
2d640 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
2d650 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f 72  ent in zSql.  Or
2d660 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64 72   if doing a --dr
2d670 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72 69  yrun, merely pri
2d680 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73 74  nt it out..*/.st
2d690 61 74 69 63 20 69 6e 74 20 61 72 45 78 65 63 53  atic int arExecS
2d6a0 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  ql(ArCommand *pA
2d6b0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
2d6c0 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Sql){.  int rc;.
2d6d0 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79 52    if( pAr->bDryR
2d6e0 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  un ){.    utf8_p
2d6f0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2d700 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
2d710 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2d720 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d730 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20     char *zErr = 
2d740 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
2d750 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64 62  te3_exec(pAr->db
2d760 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  , zSql, 0, 0, &z
2d770 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  Err);.    if( zE
2d780 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rr ){.      utf8
2d790 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  _printf(stdout, 
2d7a0 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20 7a  "ERROR: %s\n", z
2d7b0 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
2d7c0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
2d7d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d7e0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d7f0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2d800 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65 22 2c  of .ar "create",
2d810 20 22 69 6e 73 65 72 74 22 2c 20 61 6e 64 20 22   "insert", and "
2d820 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
2d830 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 72 65 61  ..**.**     crea
2d840 74 65 20 20 20 20 2d 3e 20 20 20 20 20 43 72 65  te    ->     Cre
2d850 61 74 65 20 61 20 6e 65 77 20 53 51 4c 20 61 72  ate a new SQL ar
2d860 63 68 69 76 65 0a 2a 2a 20 20 20 20 20 69 6e 73  chive.**     ins
2d870 65 72 74 20 20 20 20 2d 3e 20 20 20 20 20 49 6e  ert    ->     In
2d880 73 65 72 74 20 6f 72 20 72 65 69 6e 73 65 72 74  sert or reinsert
2d890 20 61 6c 6c 20 66 69 6c 65 73 20 6c 69 73 74 65   all files liste
2d8a0 64 0a 2a 2a 20 20 20 20 20 75 70 64 61 74 65 20  d.**     update 
2d8b0 20 20 20 2d 3e 20 20 20 20 20 49 6e 73 65 72 74     ->     Insert
2d8c0 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
2d8d0 20 63 68 61 6e 67 65 64 20 6f 72 20 74 68 61 74   changed or that
2d8e0 20 77 65 72 65 20 6e 6f 74 0a 2a 2a 20 20 20 20   were not.**    
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 20    previously in 
2d910 74 68 65 20 61 72 63 68 69 76 65 0a 2a 2a 0a 2a  the archive.**.*
2d920 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71  * Create the "sq
2d930 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68  lar" table in th
2d940 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74  e database if it
2d950 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
2d960 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e  y exist..** Then
2d970 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69   add each file i
2d980 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61  n the azFile[] a
2d990 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68  rray to the arch
2d9a0 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73  ive. Directories
2d9b0 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65  .** are added re
2d9c0 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72  cursively. If ar
2d9d0 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20  gument bVerbose 
2d9e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d  is non-zero, a m
2d9f0 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69  essage is.** pri
2da00 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66  nted on stdout f
2da10 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63  or each file arc
2da20 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  hived..**.** The
2da30 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   create command 
2da40 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75  is the same as u
2da50 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68  pdate, except th
2da60 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61  at it drops.** a
2da70 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c  ny existing "sql
2da80 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65  ar" table before
2da90 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 54 68 65   beginning.  The
2daa0 20 22 69 6e 73 65 72 74 22 20 63 6f 6d 6d 61 6e   "insert" comman
2dab0 64 0a 2a 2a 20 61 6c 77 61 79 73 20 6f 76 65 72  d.** always over
2dac0 77 72 69 74 65 73 20 65 76 65 72 79 20 66 69 6c  writes every fil
2dad0 65 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63  e named on the c
2dae0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2c 20 77 68 65  ommand-line, whe
2daf0 72 65 20 61 73 0a 2a 2a 20 22 75 70 64 61 74 65  re as.** "update
2db00 22 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  " only overwrite
2db10 73 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 72  s if the size or
2db20 20 6d 74 69 6d 65 20 6f 72 20 6d 6f 64 65 20 68   mtime or mode h
2db30 61 73 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73  as changed..*/.s
2db40 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61  tatic int arCrea
2db50 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2db60 64 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  d(.  ArCommand *
2db70 70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  pAr,            
2db80 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
2db90 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70  arguments and op
2dba0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  tions */.  int b
2dbb0 55 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20  Update,         
2dbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2dbd0 75 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74  ue for a --creat
2dbe0 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6e 6c  e. */.  int bOnl
2dbf0 79 49 66 43 68 61 6e 67 65 64 20 20 20 20 20 20  yIfChanged      
2dc00 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2dc10 75 70 64 61 74 65 20 69 66 20 66 69 6c 65 20 68  update if file h
2dc20 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 29 7b  as changed */.){
2dc30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2dc40 43 72 65 61 74 65 20 3d 20 0a 20 20 20 20 20 20  Create = .      
2dc50 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2dc60 20 4e 4f 54 20 45 58 49 53 54 53 20 73 71 6c 61   NOT EXISTS sqla
2dc70 72 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e  r(\n".      "  n
2dc80 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59  ame TEXT PRIMARY
2dc90 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f   KEY,  -- name o
2dca0 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20  f the file\n".  
2dcb0 20 20 20 20 22 20 20 6d 6f 64 65 20 49 4e 54 2c      "  mode INT,
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2dcd0 2d 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  - access permiss
2dce0 69 6f 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 20  ions\n".      " 
2dcf0 20 6d 74 69 6d 65 20 49 4e 54 2c 20 20 20 20 20   mtime INT,     
2dd00 20 20 20 20 20 20 20 20 20 2d 2d 20 6c 61 73 74           -- last
2dd10 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 74 69   modification ti
2dd20 6d 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73  me\n".      "  s
2dd30 7a 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  z INT,          
2dd40 20 20 20 20 20 20 20 2d 2d 20 6f 72 69 67 69 6e         -- origin
2dd50 61 6c 20 66 69 6c 65 20 73 69 7a 65 5c 6e 22 0a  al file size\n".
2dd60 20 20 20 20 20 20 22 20 20 64 61 74 61 20 42 4c        "  data BL
2dd70 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OB              
2dd80 20 2d 2d 20 63 6f 6d 70 72 65 73 73 65 64 20 63   -- compressed c
2dd90 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 20 20 20 20  ontent\n".      
2dda0 22 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ")";.  const cha
2ddb0 72 20 2a 7a 44 72 6f 70 20 3d 20 22 44 52 4f 50  r *zDrop = "DROP
2ddc0 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2ddd0 20 73 71 6c 61 72 22 3b 0a 20 20 63 6f 6e 73 74   sqlar";.  const
2dde0 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 46 6d   char *zInsertFm
2ddf0 74 5b 32 5d 20 3d 20 7b 0a 20 20 20 20 20 22 52  t[2] = {.     "R
2de00 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e  EPLACE INTO %s(n
2de10 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 73  ame,mode,mtime,s
2de20 7a 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  z,data)\n".     
2de30 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
2de40 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
2de50 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
2de60 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
2de70 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 43  ,\n".     "    C
2de80 41 53 45 20 73 75 62 73 74 72 28 6c 73 6d 6f 64  ASE substr(lsmod
2de90 65 28 6d 6f 64 65 29 2c 31 2c 31 29 5c 6e 22 0a  e(mode),1,1)\n".
2dea0 20 20 20 20 20 22 20 20 20 20 20 20 57 48 45 4e       "      WHEN
2deb0 20 27 2d 27 20 54 48 45 4e 20 6c 65 6e 67 74 68   '-' THEN length
2dec0 28 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  (data)\n".     "
2ded0 20 20 20 20 20 20 57 48 45 4e 20 27 64 27 20 54        WHEN 'd' T
2dee0 48 45 4e 20 30 5c 6e 22 0a 20 20 20 20 20 22 20  HEN 0\n".     " 
2def0 20 20 20 20 20 45 4c 53 45 20 2d 31 20 45 4e 44       ELSE -1 END
2df00 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 73  ,\n".     "    s
2df10 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 64 61  qlar_compress(da
2df20 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ta)\n".     "  F
2df30 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
2df40 20 41 53 20 64 69 73 6b 5c 6e 22 0a 20 20 20 20   AS disk\n".    
2df50 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2df60 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2df70 27 3f 25 25 27 25 73 3b 22 0a 20 20 20 20 20 2c  '?%%'%s;".     ,
2df80 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
2df90 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65  NTO %s(name,mode
2dfa0 2c 6d 74 69 6d 65 2c 64 61 74 61 29 5c 6e 22 0a  ,mtime,data)\n".
2dfb0 20 20 20 20 20 22 20 20 53 45 4c 45 43 54 5c 6e       "  SELECT\n
2dfc0 22 0a 20 20 20 20 20 22 20 20 20 20 25 73 2c 5c  ".     "    %s,\
2dfd0 6e 22 0a 20 20 20 20 20 22 20 20 20 20 6d 6f 64  n".     "    mod
2dfe0 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  e,\n".     "    
2dff0 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20 20 20 22  mtime,\n".     "
2e000 20 20 20 20 64 61 74 61 5c 6e 22 0a 20 20 20 20      data\n".    
2e010 20 22 20 20 46 52 4f 4d 20 66 73 64 69 72 28 25   "  FROM fsdir(%
2e020 51 2c 25 51 29 20 41 53 20 64 69 73 6b 5c 6e 22  Q,%Q) AS disk\n"
2e030 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c  .     "  WHERE l
2e040 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20  smode(mode) NOT 
2e050 4c 49 4b 45 20 27 3f 25 25 27 25 73 3b 22 0a 20  LIKE '?%%'%s;". 
2e060 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   };.  int i;    
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
2e090 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
2e0a0 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
2e0b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
2e0f0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
2e100 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e   /* SQL table in
2e110 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
2e120 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  rt */.  char *zS
2e130 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  ql;.  char zTemp
2e140 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 45  [50];.  char *zE
2e150 78 69 73 74 73 20 3d 20 30 3b 0a 0a 20 20 61 72  xists = 0;..  ar
2e160 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 50 52  ExecSql(pAr, "PR
2e170 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 35  AGMA page_size=5
2e180 31 32 22 29 3b 0a 20 20 72 63 20 3d 20 61 72 45  12");.  rc = arE
2e190 78 65 63 53 71 6c 28 70 41 72 2c 20 22 53 41 56  xecSql(pAr, "SAV
2e1a0 45 50 4f 49 4e 54 20 61 72 3b 22 29 3b 0a 20 20  EPOINT ar;");.  
2e1b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e1c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2e1d0 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a   zTemp[0] = 0; .
2e1e0 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
2e1f0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
2e200 6c 69 7a 65 20 74 68 65 20 7a 69 70 66 69 6c 65  lize the zipfile
2e210 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
2e220 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
2e230 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 46 69      if( pAr->zFi
2e240 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
2e250 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20  te3_uint64 r;.  
2e260 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2e270 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29  omness(sizeof(r)
2e280 2c 26 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,&r);.      sqli
2e290 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2e2a0 65 6f 66 28 7a 54 65 6d 70 29 2c 7a 54 65 6d 70  eof(zTemp),zTemp
2e2b0 2c 22 7a 69 70 25 30 31 36 6c 6c 78 22 2c 72 29  ,"zip%016llx",r)
2e2c0 3b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 7a  ;.      zTab = z
2e2d0 54 65 6d 70 3b 0a 20 20 20 20 20 20 7a 53 71 6c  Temp;.      zSql
2e2e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e2f0 74 66 28 0a 20 20 20 20 20 20 20 20 20 22 43 52  tf(.         "CR
2e300 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2e310 4c 45 20 74 65 6d 70 2e 25 73 20 55 53 49 4e 47  LE temp.%s USING
2e320 20 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 0a 20   zipfile(%Q)",. 
2e330 20 20 20 20 20 20 20 20 7a 54 61 62 2c 20 70 41          zTab, pA
2e340 72 2d 3e 7a 46 69 6c 65 0a 20 20 20 20 20 20 29  r->zFile.      )
2e350 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45  ;.      rc = arE
2e360 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
2e370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e380 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2e390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
2e3a0 61 62 20 3d 20 22 7a 69 70 22 3b 0a 20 20 20 20  ab = "zip";.    
2e3b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2e3c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2e3d0 20 74 61 62 6c 65 20 66 6f 72 20 61 6e 20 53 51   table for an SQ
2e3e0 4c 41 52 20 2a 2f 0a 20 20 20 20 7a 54 61 62 20  LAR */.    zTab 
2e3f0 3d 20 22 73 71 6c 61 72 22 3b 0a 20 20 20 20 69  = "sqlar";.    i
2e400 66 28 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b  f( bUpdate==0 ){
2e410 0a 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78  .      rc = arEx
2e420 65 63 53 71 6c 28 70 41 72 2c 20 7a 44 72 6f 70  ecSql(pAr, zDrop
2e430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2e440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2e450 6f 20 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63  o end_ar_transac
2e460 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tion;.    }.    
2e470 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2e480 41 72 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20 20  Ar, zCreate);.  
2e490 7d 0a 20 20 69 66 28 20 62 4f 6e 6c 79 49 66 43  }.  if( bOnlyIfC
2e4a0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 7a 45  hanged ){.    zE
2e4b0 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  xists = sqlite3_
2e4c0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
2e4d0 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28   AND NOT EXISTS(
2e4e0 22 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c  ".          "SEL
2e4f0 45 43 54 20 31 20 46 52 4f 4d 20 25 73 20 41 53  ECT 1 FROM %s AS
2e500 20 6d 65 6d 22 0a 20 20 20 20 20 20 20 20 20 20   mem".          
2e510 22 20 57 48 45 52 45 20 6d 65 6d 2e 6e 61 6d 65  " WHERE mem.name
2e520 3d 64 69 73 6b 2e 6e 61 6d 65 22 0a 20 20 20 20  =disk.name".    
2e530 20 20 20 20 20 20 22 20 41 4e 44 20 6d 65 6d 2e        " AND mem.
2e540 6d 74 69 6d 65 3d 64 69 73 6b 2e 6d 74 69 6d 65  mtime=disk.mtime
2e550 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 41 4e  ".          " AN
2e560 44 20 6d 65 6d 2e 6d 6f 64 65 3d 64 69 73 6b 2e  D mem.mode=disk.
2e570 6d 6f 64 65 29 22 2c 20 7a 54 61 62 29 3b 0a 20  mode)", zTab);. 
2e580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 78 69   }else{.    zExi
2e590 73 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  sts = sqlite3_mp
2e5a0 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d 0a 20  rintf("");.  }. 
2e5b0 20 69 66 28 20 7a 45 78 69 73 74 73 3d 3d 30 20   if( zExists==0 
2e5c0 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
2e5d0 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  MEM;.  for(i=0; 
2e5e0 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72  i<pAr->nArg && r
2e5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
2e600 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  +){.    char *zS
2e610 71 6c 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ql2 = sqlite3_mp
2e620 72 69 6e 74 66 28 7a 49 6e 73 65 72 74 46 6d 74  rintf(zInsertFmt
2e630 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 54 61  [pAr->bZip], zTa
2e640 62 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  b,.        pAr->
2e650 62 56 65 72 62 6f 73 65 20 3f 20 22 73 68 65 6c  bVerbose ? "shel
2e660 6c 5f 70 75 74 73 6e 6c 28 6e 61 6d 65 29 22 20  l_putsnl(name)" 
2e670 3a 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20  : "name",.      
2e680 20 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 2c    pAr->azArg[i],
2e690 20 70 41 72 2d 3e 7a 44 69 72 2c 20 7a 45 78 69   pAr->zDir, zExi
2e6a0 73 74 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  sts);.    rc = a
2e6b0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2e6c0 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ql2);.    sqlite
2e6d0 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20  3_free(zSql2);. 
2e6e0 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61   }.end_ar_transa
2e6f0 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21  ction:.  if( rc!
2e700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e710 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2e720 41 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Ar->db, "ROLLBAC
2e730 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
2e740 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b   ar;", 0, 0, 0);
2e750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2e760 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2e770 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29  , "RELEASE ar;")
2e780 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
2e790 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c  Zip && pAr->zFil
2e7a0 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  e ){.      zSql 
2e7b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e7c0 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73  f("DROP TABLE %s
2e7d0 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ", zTemp);.     
2e7e0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2e7f0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
2e800 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2e810 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2e820 69 74 65 33 5f 66 72 65 65 28 7a 45 78 69 73 74  ite3_free(zExist
2e830 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  s);.  return rc;
2e840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2e850 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72  entation of ".ar
2e860 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " dot command..*
2e870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44  /.static int arD
2e880 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
2e890 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e8b0 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
2e8c0 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ol state */.  in
2e8d0 74 20 66 72 6f 6d 43 6d 64 4c 69 6e 65 2c 20 20  t fromCmdLine,  
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e8f0 20 54 72 75 65 20 69 66 20 2d 41 20 63 6f 6d 6d   True if -A comm
2e900 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2c  and-line option,
2e910 20 6e 6f 74 20 2e 61 72 20 63 6d 64 20 2a 2f 0a   not .ar cmd */.
2e920 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
2e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e940 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
2e950 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
2e960 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
2e970 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
2e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e9a0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
2e9b0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d  [] */.){.  ArCom
2e9c0 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20  mand cmd;.  int 
2e9d0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d  rc;.  memset(&cm
2e9e0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64  d, 0, sizeof(cmd
2e9f0 29 29 3b 0a 20 20 63 6d 64 2e 66 72 6f 6d 43 6d  ));.  cmd.fromCm
2ea00 64 4c 69 6e 65 20 3d 20 66 72 6f 6d 43 6d 64 4c  dLine = fromCmdL
2ea10 69 6e 65 3b 0a 20 20 72 63 20 3d 20 61 72 50 61  ine;.  rc = arPa
2ea20 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67  rseCommand(azArg
2ea30 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20  , nArg, &cmd);. 
2ea40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ea50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44  OK ){.    int eD
2ea60 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  bType = SHELL_OP
2ea70 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63  EN_UNSPEC;.    c
2ea80 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20  md.p = pState;. 
2ea90 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61     cmd.db = pSta
2eaa0 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  te->db;.    if( 
2eab0 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
2eac0 20 20 20 65 44 62 54 79 70 65 20 3d 20 64 65 64     eDbType = ded
2ead0 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65 28  uceDatabaseType(
2eae0 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20  cmd.zFile, 1);. 
2eaf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb00 65 44 62 54 79 70 65 20 3d 20 70 53 74 61 74 65  eDbType = pState
2eb10 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20  ->openMode;.    
2eb20 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54 79 70  }.    if( eDbTyp
2eb30 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  e==SHELL_OPEN_ZI
2eb40 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  PFILE ){.      i
2eb50 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  f( cmd.eCmd==AR_
2eb60 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63  CMD_EXTRACT || c
2eb70 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
2eb80 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LIST ){.        
2eb90 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30  if( cmd.zFile==0
2eba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d   ){.          cm
2ebb0 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71  d.zSrcTable = sq
2ebc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
2ebd0 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ip");.        }e
2ebe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2ebf0 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2ec00 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2ec10 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d  zipfile(%Q)", cm
2ec20 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  d.zFile);.      
2ec30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ec40 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a    cmd.bZip = 1;.
2ec50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d      }else if( cm
2ec60 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
2ec70 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20   int flags;.    
2ec80 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e    if( cmd.bAppen
2ec90 64 20 29 20 65 44 62 54 79 70 65 20 3d 20 53 48  d ) eDbType = SH
2eca0 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
2ecb0 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d  FS;.      if( cm
2ecc0 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43  d.eCmd==AR_CMD_C
2ecd0 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d  REATE || cmd.eCm
2ece0 64 3d 3d 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54  d==AR_CMD_INSERT
2ecf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
2ed00 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2ed10 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
2ed20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
2ed30 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2ed40 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2ed50 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
2ed60 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2ed70 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2ed80 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  ADONLY;.      }.
2ed90 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30        cmd.db = 0
2eda0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2edb0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
2edc0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2edd0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20  State->out, "-- 
2ede0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25  open database '%
2edf0 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69  s'%s\n", cmd.zFi
2ee00 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2ee10 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2ee20 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2ee30 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66   " using 'apndvf
2ee40 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  s'" : "");.     
2ee50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2ee60 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d  lite3_open_v2(cm
2ee70 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62  d.zFile, &cmd.db
2ee80 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20  , flags, .      
2ee90 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d         eDbType==
2eea0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2eeb0 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22  DVFS ? "apndvfs"
2eec0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28   : 0);.      if(
2eed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2eee0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2eef0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
2ef00 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2ef10 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %s (%s)\n", .  
2ef20 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46            cmd.zF
2ef30 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ile, sqlite3_err
2ef40 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20  msg(cmd.db).    
2ef50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67      );.        g
2ef60 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2ef70 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2ef80 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f    sqlite3_fileio
2ef90 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c  _init(cmd.db, 0,
2efa0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2efb0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d  e3_sqlar_init(cm
2efc0 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d.db, 0, 0);.   
2efd0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
2efe0 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64  e_function(cmd.d
2eff0 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
2f000 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
2f010 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20  8, cmd.p,.      
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f030 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
2f040 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  sFunc, 0, 0);.. 
2f050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64     }.    if( cmd
2f060 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26  .zSrcTable==0 &&
2f070 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20   cmd.bZip==0 && 
2f080 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2f090 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69  _HELP ){.      i
2f0a0 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  f( cmd.eCmd!=AR_
2f0b0 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20  CMD_CREATE.     
2f0c0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62    && sqlite3_tab
2f0d0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
2f0e0 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c  ta(cmd.db,0,"sql
2f0f0 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30  ar","name",0,0,0
2f100 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  ,0,0).      ){. 
2f110 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2f120 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61  tf(stderr, "data
2f130 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  base does not co
2f140 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27  ntain an 'sqlar'
2f150 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20   table\n");.    
2f160 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f170 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
2f180 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2f190 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2f1a0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2f1b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f1c0 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20  f("sqlar");.    
2f1d0 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
2f1e0 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
2f1f0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
2f200 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
2f210 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2f220 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2f230 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62  0, 0);.        b
2f240 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f250 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
2f260 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2f270 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28  rExtractCommand(
2f280 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
2f290 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f2a0 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20  e AR_CMD_LIST:. 
2f2b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69         rc = arLi
2f2c0 73 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  stCommand(&cmd);
2f2d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2f2e0 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2f2f0 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20  MD_HELP:.       
2f300 20 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d   arUsage(pState-
2f310 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62  >out);.        b
2f320 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
2f330 65 20 41 52 5f 43 4d 44 5f 49 4e 53 45 52 54 3a  e AR_CMD_INSERT:
2f340 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
2f350 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f  CreateOrUpdateCo
2f360 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 31 2c 20 30  mmand(&cmd, 1, 0
2f370 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
2f380 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  ;..      default
2f390 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
2f3a0 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2f3b0 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20  MD_UPDATE );.   
2f3c0 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61       rc = arCrea
2f3d0 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e  teOrUpdateComman
2f3e0 64 28 26 63 6d 64 2c 20 31 2c 20 31 29 3b 0a 20  d(&cmd, 1, 1);. 
2f3f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f400 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63    }.  }.end_ar_c
2f410 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d  ommand:.  if( cm
2f420 64 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62  d.db!=pState->db
2f430 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62   ){.    close_db
2f440 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20  (cmd.db);.  }.  
2f450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64  sqlite3_free(cmd
2f460 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20  .zSrcTable);..  
2f470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
2f480 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63  End of the ".arc
2f490 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
2f4a0 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a  ommand logic.***
2f4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2f500 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
2f510 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f520 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
2f530 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f540 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 23  HAVE_ZLIB) */..#
2f550 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2f560 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f570 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
2f580 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44  (SQLITE_ENABLE_D
2f590 42 50 41 47 45 5f 56 54 41 42 29 0a 2f 2a 0a 2a  BPAGE_VTAB)./*.*
2f5a0 2a 20 49 66 20 28 2a 70 52 63 29 20 69 73 20 6e  * If (*pRc) is n
2f5b0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
2f5c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2f5d0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2f5e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
2f5f0 65 72 77 69 73 65 2c 20 74 68 65 20 53 51 4c 20  erwise, the SQL 
2f600 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 74 61  statement or sta
2f610 74 65 6d 65 6e 74 73 20 69 6e 20 7a 53 71 6c 20  tements in zSql 
2f620 61 72 65 20 65 78 65 63 75 74 65 64 20 75 73 69  are executed usi
2f630 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  ng.** database c
2f640 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 61 6e 64  onnection db and
2f650 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
2f660 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 63 20  written to *pRc 
2f670 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 66  before.** this f
2f680 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2f690 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f6a0 73 68 65 6c 6c 45 78 65 63 28 73 71 6c 69 74 65  shellExec(sqlite
2f6b0 33 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 2c  3 *db, int *pRc,
2f6c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2f6d0 6c 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a  l){.  int rc = *
2f6e0 70 52 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pRc;.  if( rc==S
2f6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f700 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2f710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f720 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2f730 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20  0, 0, &zErr);.  
2f740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
2f760 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f770 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
2f780 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a  ", zErr);.    }.
2f790 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
2f7a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65   }.}../*.** Like
2f7b0 20 73 68 65 6c 6c 45 78 65 63 28 29 2c 20 65 78   shellExec(), ex
2f7c0 63 65 70 74 20 74 68 61 74 20 7a 46 6d 74 20 69  cept that zFmt i
2f7d0 73 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79  s a printf() sty
2f7e0 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  le format string
2f7f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f800 20 73 68 65 6c 6c 45 78 65 63 50 72 69 6e 74 66   shellExecPrintf
2f810 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
2f820 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68  t *pRc, const ch
2f830 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
2f840 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
2f850 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
2f860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c  E_OK ){.    va_l
2f870 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73  ist ap;.    va_s
2f880 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
2f890 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
2f8a0 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
2f8b0 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
2f8c0 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  p);.    if( z==0
2f8d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
2f8e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f8f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f900 73 68 65 6c 6c 45 78 65 63 28 64 62 2c 20 70 52  shellExec(db, pR
2f910 63 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  c, z);.    }.   
2f920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2f930 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
2f940 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2f950 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2f960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f970 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2f980 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
2f990 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
2f9a0 20 6d 61 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   made to allocat
2f9b0 65 2c 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  e, zero and retu
2f9c0 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
2f9d0 74 6f 20 61 20 62 75 66 66 65 72 20 6e 42 79 74  to a buffer nByt
2f9e0 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  e bytes in size.
2f9f0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
2fa00 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73   occurs, *pRc is
2fa10 20 73 65 74 0a 2a 2a 20 74 6f 20 53 51 4c 49 54   set.** to SQLIT
2fa20 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 4e 55 4c 4c  E_NOMEM and NULL
2fa30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2fa40 61 74 69 63 20 76 6f 69 64 20 2a 73 68 65 6c 6c  atic void *shell
2fa50 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70 52 63 2c  Malloc(int *pRc,
2fa60 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
2fa70 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Byte){.  void *p
2fa80 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a  Ret = 0;.  if( *
2fa90 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2faa0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
2fab0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
2fac0 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
2fad0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  et==0 ){.      *
2fae0 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
2faf0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2fb00 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74       memset(pRet
2fb10 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
2fb20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2fb30 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pRet;.}../*.** I
2fb40 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2fb50 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2fb60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2fb70 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2fb80 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
2fb90 65 2c 20 7a 46 6d 74 20 69 73 20 74 72 65 61 74  e, zFmt is treat
2fba0 65 64 20 61 73 20 61 20 70 72 69 6e 74 66 28 29  ed as a printf()
2fbb0 20 73 74 79 6c 65 20 73 74 72 69 6e 67 2e 20 54   style string. T
2fbc0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2fbd0 66 6f 72 6d 61 74 74 69 6e 67 20 69 74 20 61 6c  formatting it al
2fbe0 6f 6e 67 20 77 69 74 68 20 61 6e 79 20 74 72 61  ong with any tra
2fbf0 69 6c 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  iling arguments 
2fc00 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2fc10 61 20 0a 2a 2a 20 62 75 66 66 65 72 20 6f 62 74  a .** buffer obt
2fc20 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2fc30 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64  e3_malloc(), and
2fc40 20 70 6f 69 6e 74 65 72 20 74 6f 20 77 68 69 63   pointer to whic
2fc50 68 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  h is returned..*
2fc60 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  * It is the resp
2fc70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2fc80 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
2fc90 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
2fca0 20 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67   buffer.** using
2fcb0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2fcc0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 20 0a 2a  e3_free()..** .*
2fcd0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
2fce0 72 20 6f 63 63 75 72 73 2c 20 28 2a 70 52 63 29  r occurs, (*pRc)
2fcf0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
2fd00 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 61 20 4e 55  E_NOMEM and a NU
2fd10 4c 4c 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 72  LL .** pointer r
2fd20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2fd30 69 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 4d 50  ic char *shellMP
2fd40 72 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20  rintf(int *pRc, 
2fd50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
2fd60 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
2fd70 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  z = 0;.  if( *pR
2fd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd90 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
2fda0 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
2fdb0 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20   zFmt);.    z = 
2fdc0 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
2fdd0 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20  (zFmt, ap);.    
2fde0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20  va_end(ap);.    
2fdf0 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2fe00 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
2fe10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
2fe20 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
2fe30 2f 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69  /*.** When runni
2fe40 6e 67 20 74 68 65 20 22 2e 72 65 63 6f 76 65 72  ng the ".recover
2fe50 22 20 63 6f 6d 6d 61 6e 64 2c 20 65 61 63 68 20  " command, each 
2fe60 6f 75 74 70 75 74 20 74 61 62 6c 65 2c 20 61 6e  output table, an
2fe70 64 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  d the special.**
2fe80 20 6f 72 70 68 61 6e 65 64 20 72 6f 77 20 74 61   orphaned row ta
2fe90 62 6c 65 20 69 66 20 69 74 20 69 73 20 72 65 71  ble if it is req
2fea0 75 69 72 65 64 2c 20 69 73 20 72 65 70 72 65 73  uired, is repres
2feb0 65 6e 74 65 64 20 62 79 20 61 6e 20 69 6e 73 74  ented by an inst
2fec0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ance.** of the f
2fed0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 2e  ollowing struct.
2fee0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2fef0 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c 65 20  ct RecoverTable 
2ff00 52 65 63 6f 76 65 72 54 61 62 6c 65 3b 0a 73 74  RecoverTable;.st
2ff10 72 75 63 74 20 52 65 63 6f 76 65 72 54 61 62 6c  ruct RecoverTabl
2ff20 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f  e {.  char *zQuo
2ff30 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ted;            
2ff40 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 64 20        /* Quoted 
2ff50 76 65 72 73 69 6f 6e 20 6f 66 20 74 61 62 6c 65  version of table
2ff60 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2ff70 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2ff80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ff90 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
2ffa0 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  in table */.  ch
2ffb0 61 72 20 2a 2a 61 7a 6c 43 6f 6c 3b 20 20 20 20  ar **azlCol;    
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ffd0 20 41 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   Array of column
2ffe0 20 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20   lists */.  int 
2fff0 69 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  iPk;            
30000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
30010 6e 64 65 78 20 6f 66 20 49 50 4b 20 63 6f 6c 75  ndex of IPK colu
30020 6d 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  mn */.};../*.** 
30030 46 72 65 65 20 61 20 52 65 63 6f 76 65 72 54 61  Free a RecoverTa
30040 62 6c 65 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  ble object alloc
30050 61 74 65 64 20 62 79 20 72 65 63 6f 76 65 72 46  ated by recoverF
30060 69 6e 64 54 61 62 6c 65 28 29 20 6f 72 0a 2a 2a  indTable() or.**
30070 20 72 65 63 6f 76 65 72 4f 72 70 68 61 6e 54 61   recoverOrphanTa
30080 62 6c 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ble()..*/.static
30090 20 76 6f 69 64 20 72 65 63 6f 76 65 72 46 72 65   void recoverFre
300a0 65 54 61 62 6c 65 28 52 65 63 6f 76 65 72 54 61  eTable(RecoverTa
300b0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 69 66  ble *pTab){.  if
300c0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71  ( pTab ){.    sq
300d0 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d  lite3_free(pTab-
300e0 3e 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 69  >zQuoted);.    i
300f0 66 28 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 20  f( pTab->azlCol 
30100 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
30110 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
30120 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  <=pTab->nCol; i+
30130 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
30140 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d 3e 61  te3_free(pTab->a
30150 7a 6c 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  zlCol[i]);.     
30160 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
30170 5f 66 72 65 65 28 70 54 61 62 2d 3e 61 7a 6c 43  _free(pTab->azlC
30180 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
30190 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62  qlite3_free(pTab
301a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
301b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
301c0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 28 2a 70 52   a no-op if (*pR
301d0 63 29 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  c) is not SQLITE
301e0 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63  _OK when it is c
301f0 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  alled..** Otherw
30200 69 73 65 2c 20 69 74 20 61 6c 6c 6f 63 61 74 65  ise, it allocate
30210 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
30220 52 65 63 6f 76 65 72 54 61 62 6c 65 20 6f 62 6a  RecoverTable obj
30230 65 63 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ect based on the
30240 0a 2a 2a 20 66 69 6e 61 6c 20 66 6f 75 72 20 61  .** final four a
30250 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
30260 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
30270 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
30280 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66  onsibility.** of
30290 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
302a0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
302b0 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
302c0 63 74 20 75 73 69 6e 67 0a 2a 2a 20 72 65 63 6f  ct using.** reco
302d0 76 65 72 46 72 65 65 54 61 62 6c 65 28 29 2e 0a  verFreeTable()..
302e0 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65  */.static Recove
302f0 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4e  rTable *recoverN
30300 65 77 54 61 62 6c 65 28 0a 20 20 69 6e 74 20 2a  ewTable(.  int *
30310 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
30320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
30330 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
30340 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
30350 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
30360 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
30370 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
30380 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
30390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
303a0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
303b0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62  ement */.  int b
303c0 49 6e 74 6b 65 79 2c 20 0a 20 20 69 6e 74 20 6e  Intkey, .  int n
303d0 43 6f 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Col.){.  sqlite3
303e0 20 2a 64 62 74 6d 70 20 3d 20 30 3b 20 20 20 20   *dbtmp = 0;    
303f0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
30400 74 65 33 20 68 61 6e 64 6c 65 20 66 6f 72 20 74  te3 handle for t
30410 65 73 74 69 6e 67 20 43 52 45 41 54 45 20 54 41  esting CREATE TA
30420 42 4c 45 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  BLE */.  int rc 
30430 3d 20 2a 70 52 63 3b 0a 20 20 52 65 63 6f 76 65  = *pRc;.  Recove
30440 72 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30  rTable *pTab = 0
30450 3b 0a 0a 20 20 70 54 61 62 20 3d 20 28 52 65 63  ;..  pTab = (Rec
30460 6f 76 65 72 54 61 62 6c 65 2a 29 73 68 65 6c 6c  overTable*)shell
30470 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69 7a 65  Malloc(&rc, size
30480 6f 66 28 52 65 63 6f 76 65 72 54 61 62 6c 65 29  of(RecoverTable)
30490 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
304a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
304b0 74 20 6e 53 71 6c 43 6f 6c 20 3d 20 30 3b 0a 20  t nSqlCol = 0;. 
304c0 20 20 20 69 6e 74 20 62 53 71 6c 49 6e 74 6b 65     int bSqlIntke
304d0 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
304e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
304f0 20 30 3b 0a 20 20 20 20 0a 20 20 20 20 72 63 20   0;.    .    rc 
30500 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22  = sqlite3_open("
30510 22 2c 20 26 64 62 74 6d 70 29 3b 0a 20 20 20 20  ", &dbtmp);.    
30520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30530 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
30540 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
30550 6f 6e 28 64 62 74 6d 70 2c 20 22 73 68 65 6c 6c  on(dbtmp, "shell
30560 5f 69 64 71 75 6f 74 65 22 2c 20 31 2c 20 53 51  _idquote", 1, SQ
30570 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30590 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65 6c              shel
305a0 6c 49 64 51 75 6f 74 65 2c 20 30 2c 20 30 29 3b  lIdQuote, 0, 0);
305b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
305c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
305d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
305e0 65 33 5f 65 78 65 63 28 64 62 74 6d 70 2c 20 22  e3_exec(dbtmp, "
305f0 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
30600 73 63 68 65 6d 61 20 3d 20 6f 6e 22 2c 20 30 2c  schema = on", 0,
30610 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
30620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
30640 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
30650 62 74 6d 70 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  btmp, zSql, 0, 0
30660 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
30670 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
30680 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
306a0 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 65      goto finishe
306b0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
306c0 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
306d0 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c 20 26  ePrintf(dbtmp, &
306e0 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20  rc, &pStmt, .   
306f0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
30700 6e 74 28 2a 29 20 46 52 4f 4d 20 70 72 61 67 6d  nt(*) FROM pragm
30710 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28 25 51 29  a_table_info(%Q)
30720 22 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  ", zName.    );.
30730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30740 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f  TE_OK && SQLITE_
30750 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
30760 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20  p(pStmt) ){.    
30770 20 20 6e 53 71 6c 43 6f 6c 20 3d 20 73 71 6c 69    nSqlCol = sqli
30780 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
30790 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
307a0 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
307b0 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a  e(&rc, pStmt);..
307c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
307d0 54 45 5f 4f 4b 20 7c 7c 20 6e 53 71 6c 43 6f 6c  TE_OK || nSqlCol
307e0 3c 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 67  <nCol ){.      g
307f0 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 20  oto finished;.  
30800 20 20 7d 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72    }..    shellPr
30810 65 70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d  eparePrintf(dbtm
30820 70 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20  p, &rc, &pStmt, 
30830 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28  .      "SELECT (
30840 22 0a 20 20 20 20 20 20 22 20 20 53 45 4c 45 43  ".      "  SELEC
30850 54 20 73 75 62 73 74 72 28 64 61 74 61 2c 31 2c  T substr(data,1,
30860 31 29 3d 3d 58 27 30 44 27 20 46 52 4f 4d 20 73  1)==X'0D' FROM s
30870 71 6c 69 74 65 5f 64 62 70 61 67 65 20 57 48 45  qlite_dbpage WHE
30880 52 45 20 70 67 6e 6f 3d 72 6f 6f 74 70 61 67 65  RE pgno=rootpage
30890 22 0a 20 20 20 20 20 20 22 29 20 46 52 4f 4d 20  ".      ") FROM 
308a0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
308b0 45 52 45 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20  ERE name = %Q", 
308c0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
308d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
308e0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
308f0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
30900 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 62  Stmt) ){.      b
30910 53 71 6c 49 6e 74 6b 65 79 20 3d 20 73 71 6c 69  SqlIntkey = sqli
30920 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
30930 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
30940 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
30950 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a  e(&rc, pStmt);..
30960 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 3d      if( bIntkey=
30970 3d 62 53 71 6c 49 6e 74 6b 65 79 20 29 7b 0a 20  =bSqlIntkey ){. 
30980 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
30990 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
309a0 6b 20 3d 20 22 5f 72 6f 77 69 64 5f 22 3b 0a 20  k = "_rowid_";. 
309b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
309c0 74 20 2a 70 50 6b 46 69 6e 64 65 72 20 3d 20 30  t *pPkFinder = 0
309d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
309e0 68 69 73 20 69 73 20 61 6e 20 69 6e 74 6b 65 79  his is an intkey
309f0 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 72 65   table and there
30a00 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50   is an INTEGER P
30a10 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
30a20 20 20 2a 2a 20 73 65 74 20 7a 50 6b 20 74 6f 20    ** set zPk to 
30a30 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
30a40 50 4b 20 63 6f 6c 75 6d 6e 2c 20 61 6e 64 20 70  PK column, and p
30a50 54 61 62 2d 3e 69 50 6b 20 74 6f 20 74 68 65 20  Tab->iPk to the 
30a60 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2a 20 6f  index.      ** o
30a70 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2c 20 77 68  f the column, wh
30a80 65 72 65 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ere columns are 
30a90 30 2d 6e 75 6d 62 65 72 65 64 20 66 72 6f 6d 20  0-numbered from 
30aa0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 20  left to right.. 
30ab0 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74       ** Or, if t
30ac0 68 69 73 20 69 73 20 61 20 57 49 54 48 4f 55 54  his is a WITHOUT
30ad0 20 52 4f 57 49 44 20 74 61 62 6c 65 20 6f 72 20   ROWID table or 
30ae0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 49  if there is no I
30af0 50 4b 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  PK column,.     
30b00 20 2a 2a 20 6c 65 61 76 65 20 7a 50 6b 20 61 73   ** leave zPk as
30b10 20 22 5f 72 6f 77 69 64 5f 22 20 61 6e 64 20 70   "_rowid_" and p
30b20 54 61 62 2d 3e 69 50 6b 20 61 74 20 2d 32 2e 20  Tab->iPk at -2. 
30b30 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
30b40 69 50 6b 20 3d 20 2d 32 3b 0a 20 20 20 20 20 20  iPk = -2;.      
30b50 69 66 28 20 62 49 6e 74 6b 65 79 20 29 7b 0a 20  if( bIntkey ){. 
30b60 20 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70         shellPrep
30b70 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c  arePrintf(dbtmp,
30b80 20 26 72 63 2c 20 26 70 50 6b 46 69 6e 64 65 72   &rc, &pPkFinder
30b90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  , .          "SE
30ba0 4c 45 43 54 20 63 69 64 2c 20 6e 61 6d 65 20 46  LECT cid, name F
30bb0 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65  ROM pragma_table
30bc0 5f 69 6e 66 6f 28 25 51 29 20 22 0a 20 20 20 20  _info(%Q) ".    
30bd0 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20 70        "  WHERE p
30be0 6b 3d 31 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  k=1 AND type='in
30bf0 74 65 67 65 72 27 20 43 4f 4c 4c 41 54 45 20 6e  teger' COLLATE n
30c00 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20  ocase".         
30c10 20 22 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53   "  AND NOT EXIS
30c20 54 53 20 28 53 45 4c 45 43 54 20 63 69 64 20 46  TS (SELECT cid F
30c30 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62 6c 65  ROM pragma_table
30c40 5f 69 6e 66 6f 28 25 51 29 20 57 48 45 52 45 20  _info(%Q) WHERE 
30c50 70 6b 3d 32 29 22 0a 20 20 20 20 20 20 20 20 20  pk=2)".         
30c60 20 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a   , zName, zName.
30c70 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
30c80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30c90 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
30ca0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
30cb0 28 70 50 6b 46 69 6e 64 65 72 29 20 29 7b 0a 20  (pPkFinder) ){. 
30cc0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 69           pTab->i
30cd0 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Pk = sqlite3_col
30ce0 75 6d 6e 5f 69 6e 74 28 70 50 6b 46 69 6e 64 65  umn_int(pPkFinde
30cf0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
30d00 20 7a 50 6b 20 3d 20 28 63 6f 6e 73 74 20 63 68   zPk = (const ch
30d10 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
30d20 6d 6e 5f 74 65 78 74 28 70 50 6b 46 69 6e 64 65  mn_text(pPkFinde
30d30 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 1);.        }
30d40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30d50 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 20 3d 20  pTab->zQuoted = 
30d60 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63  shellMPrintf(&rc
30d70 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 4e 61 6d  , "\"%w\"", zNam
30d80 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  e);.      pTab->
30d90 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a  azlCol = (char**
30da0 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 26 72 63  )shellMalloc(&rc
30db0 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
30dc0 2a 20 28 6e 53 71 6c 43 6f 6c 2b 31 29 29 3b 0a  * (nSqlCol+1));.
30dd0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
30de0 20 3d 20 6e 53 71 6c 43 6f 6c 3b 0a 0a 20 20 20   = nSqlCol;..   
30df0 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79 20 29     if( bIntkey )
30e00 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
30e10 61 7a 6c 43 6f 6c 5b 30 5d 20 3d 20 73 68 65 6c  azlCol[0] = shel
30e20 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 22 5c  lMPrintf(&rc, "\
30e30 22 25 77 5c 22 22 2c 20 7a 50 6b 29 3b 0a 20 20  "%w\"", zPk);.  
30e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e50 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b     pTab->azlCol[
30e60 30 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74  0] = shellMPrint
30e70 66 28 26 72 63 2c 20 22 22 29 3b 0a 20 20 20 20  f(&rc, "");.    
30e80 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 31 3b    }.      i = 1;
30e90 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70  .      shellPrep
30ea0 61 72 65 50 72 69 6e 74 66 28 64 62 74 6d 70 2c  arePrintf(dbtmp,
30eb0 20 26 72 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20   &rc, &pStmt, . 
30ec0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
30ed0 20 25 51 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   %Q || group_con
30ee0 63 61 74 28 73 68 65 6c 6c 5f 69 64 71 75 6f 74  cat(shell_idquot
30ef0 65 28 6e 61 6d 65 29 2c 20 27 2c 20 27 29 20 22  e(name), ', ') "
30f00 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46 49  .          "  FI
30f10 4c 54 45 52 20 28 57 48 45 52 45 20 63 69 64 21  LTER (WHERE cid!
30f20 3d 25 64 29 20 4f 56 45 52 20 28 4f 52 44 45 52  =%d) OVER (ORDER
30f30 20 42 59 20 25 73 20 63 69 64 29 20 22 0a 20 20   BY %s cid) ".  
30f40 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 70 72          "FROM pr
30f50 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 28  agma_table_info(
30f60 25 51 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  %Q)", .         
30f70 20 62 49 6e 74 6b 65 79 20 3f 20 22 2c 20 22 20   bIntkey ? ", " 
30f80 3a 20 22 22 2c 20 70 54 61 62 2d 3e 69 50 6b 2c  : "", pTab->iPk,
30f90 20 0a 20 20 20 20 20 20 20 20 20 20 62 49 6e 74   .          bInt
30fa0 6b 65 79 20 3f 20 22 22 20 3a 20 22 28 43 41 53  key ? "" : "(CAS
30fb0 45 20 57 48 45 4e 20 70 6b 3d 30 20 54 48 45 4e  E WHEN pk=0 THEN
30fc0 20 31 30 30 30 30 30 30 20 45 4c 53 45 20 70 6b   1000000 ELSE pk
30fd0 20 45 4e 44 29 2c 20 22 2c 0a 20 20 20 20 20 20   END), ",.      
30fe0 20 20 20 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20      zName.      
30ff0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
31000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31010 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
31020 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
31030 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
31040 74 20 63 68 61 72 20 2a 7a 54 65 78 74 20 3d 20  t char *zText = 
31050 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31060 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
31070 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
31080 20 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c      pTab->azlCol
31090 5b 69 5d 20 3d 20 73 68 65 6c 6c 4d 50 72 69 6e  [i] = shellMPrin
310a0 74 66 28 26 72 63 2c 20 22 25 73 25 73 22 2c 20  tf(&rc, "%s%s", 
310b0 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 30 5d 2c  pTab->azlCol[0],
310c0 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 20 20 20   zText);.       
310d0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
310e0 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
310f0 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 0a  e(&rc, pStmt);..
31100 20 20 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c        shellFinal
31110 69 7a 65 28 26 72 63 2c 20 70 50 6b 46 69 6e 64  ize(&rc, pPkFind
31120 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
31130 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 73 71 6c   finished:.  sql
31140 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 74 6d 70  ite3_close(dbtmp
31150 29 3b 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  );.  *pRc = rc;.
31160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31170 5f 4f 4b 20 7c 7c 20 28 70 54 61 62 20 26 26 20  _OK || (pTab && 
31180 70 54 61 62 2d 3e 7a 51 75 6f 74 65 64 3d 3d 30  pTab->zQuoted==0
31190 29 20 29 7b 0a 20 20 20 20 72 65 63 6f 76 65 72  ) ){.    recover
311a0 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b  FreeTable(pTab);
311b0 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
311c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
311d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
311e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
311f0 65 64 20 74 6f 20 73 65 61 72 63 68 20 74 68 65  ed to search the
31200 20 73 63 68 65 6d 61 20 72 65 63 6f 76 65 72 65   schema recovere
31210 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 71  d from the.** sq
31220 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
31230 65 20 6f 66 20 74 68 65 20 28 70 6f 73 73 69 62  e of the (possib
31240 6c 79 29 20 63 6f 72 72 75 70 74 20 64 61 74 61  ly) corrupt data
31250 62 61 73 65 20 61 73 20 70 61 72 74 0a 2a 2a 20  base as part.** 
31260 6f 66 20 61 20 22 2e 72 65 63 6f 76 65 72 22 20  of a ".recover" 
31270 63 6f 6d 6d 61 6e 64 2e 20 53 70 65 63 69 66 69  command. Specifi
31280 63 61 6c 6c 79 2c 20 66 6f 72 20 61 20 74 61 62  cally, for a tab
31290 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
312a0 65 0a 2a 2a 20 69 52 6f 6f 74 20 61 6e 64 20 61  e.** iRoot and a
312b0 74 20 6c 65 61 73 74 20 6e 43 6f 6c 20 63 6f 6c  t least nCol col
312c0 75 6d 6e 73 2e 20 41 64 64 69 74 69 6f 6e 61 6c  umns. Additional
312d0 6c 79 2c 20 69 66 20 62 49 6e 74 6b 65 79 20 69  ly, if bIntkey i
312e0 73 20 30 2c 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s 0, the.** tabl
312f0 65 20 6d 75 73 74 20 62 65 20 61 20 57 49 54 48  e must be a WITH
31300 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
31310 20 6f 72 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   or if non-zero,
31320 20 6e 6f 74 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74   not one of.** t
31330 68 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  hose..**.** If a
31340 20 74 61 62 6c 65 20 69 73 20 66 6f 75 6e 64 2c   table is found,
31350 20 61 20 28 52 65 63 6f 76 65 72 54 61 62 6c 65   a (RecoverTable
31360 2a 29 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74  *) object is ret
31370 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 0a 2a 2a  urned. Or, if.**
31380 20 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 69   no such table i
31390 73 20 66 6f 75 6e 64 2c 20 62 75 74 20 62 49 6e  s found, but bIn
313a0 74 6b 65 79 20 69 73 20 66 61 6c 73 65 20 61 6e  tkey is false an
313b0 64 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 0a  d iRoot is the .
313c0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
313d0 61 6e 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  an index in the 
313e0 72 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61  recovered schema
313f0 2c 20 74 68 65 6e 20 28 2a 70 62 4e 6f 6f 70 29  , then (*pbNoop)
31400 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74 72   is.** set to tr
31410 75 65 20 61 6e 64 20 4e 55 4c 4c 20 72 65 74 75  ue and NULL retu
31420 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
31430 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 61  re is no such ta
31440 62 6c 65 20 6f 72 0a 2a 2a 20 69 6e 64 65 78 2c  ble or.** index,
31450 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
31460 64 20 61 6e 64 20 28 2a 70 62 4e 6f 6f 70 29 20  d and (*pbNoop) 
31470 73 65 74 20 74 6f 20 30 2c 20 69 6e 64 69 63 61  set to 0, indica
31480 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 74 68 65  ting that.** the
31490 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 77   caller should w
314a0 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
314b0 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a   orphans table..
314c0 2a 2f 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65  */.static Recove
314d0 72 54 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 46  rTable *recoverF
314e0 69 6e 64 54 61 62 6c 65 28 0a 20 20 53 68 65 6c  indTable(.  Shel
314f0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
31500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31510 68 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63  hell state objec
31520 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c  t */.  int *pRc,
31530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31540 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
31550 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
31560 20 20 69 6e 74 20 69 52 6f 6f 74 2c 20 20 20 20    int iRoot,    
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
31590 66 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  f table */.  int
315a0 20 62 49 6e 74 6b 65 79 2c 20 20 20 20 20 20 20   bIntkey,       
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
315c0 54 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 74 6b  True for an intk
315d0 65 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ey table */.  in
315e0 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31600 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
31610 6e 73 20 69 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ns in table */. 
31620 20 69 6e 74 20 2a 70 62 4e 6f 6f 70 20 20 20 20   int *pbNoop    
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31640 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66   /* OUT: True if
31650 20 69 52 6f 6f 74 20 69 73 20 72 6f 6f 74 20 6f   iRoot is root o
31660 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
31670 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
31680 74 6d 74 20 3d 20 30 3b 0a 20 20 52 65 63 6f 76  tmt = 0;.  Recov
31690 65 72 54 61 62 6c 65 20 2a 70 52 65 74 20 3d 20  erTable *pRet = 
316a0 30 3b 0a 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d  0;.  int bNoop =
316b0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
316c0 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 63 6f   *zSql = 0;.  co
316d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
316e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63  = 0;..  /* Searc
316f0 68 20 74 68 65 20 72 65 63 6f 76 65 72 65 64 20  h the recovered 
31700 73 63 68 65 6d 61 20 66 6f 72 20 61 6e 20 6f 62  schema for an ob
31710 6a 65 63 74 20 77 69 74 68 20 72 6f 6f 74 20 70  ject with root p
31720 61 67 65 20 69 52 6f 6f 74 2e 20 2a 2f 0a 20 20  age iRoot. */.  
31730 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
31740 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 70  tf(pState->db, p
31750 52 63 2c 20 26 70 53 74 6d 74 2c 0a 20 20 20 20  Rc, &pStmt,.    
31760 20 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20    "SELECT type, 
31770 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 72  name, sql FROM r
31780 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 57  ecovery.schema W
31790 48 45 52 45 20 72 6f 6f 74 70 61 67 65 3d 25 64  HERE rootpage=%d
317a0 22 2c 20 69 52 6f 6f 74 0a 20 20 29 3b 0a 20 20  ", iRoot.  );.  
317b0 77 68 69 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c  while( *pRc==SQL
317c0 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
317d0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
317e0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
317f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
31800 70 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  pe = (const char
31810 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
31820 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
31830 0a 20 20 20 20 69 66 28 20 62 49 6e 74 6b 65 79  .    if( bIntkey
31840 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f 73  ==0 && sqlite3_s
31850 74 72 69 63 6d 70 28 7a 54 79 70 65 2c 20 22 69  tricmp(zType, "i
31860 6e 64 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ndex")==0 ){.   
31870 20 20 20 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20     bNoop = 1;.  
31880 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31890 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
318a0 5f 73 74 72 69 63 6d 70 28 7a 54 79 70 65 2c 20  _stricmp(zType, 
318b0 22 74 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  "table")==0 ){. 
318c0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 28 63 6f       zName = (co
318d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
318e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
318f0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a  tmt, 1);.      z
31900 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Sql = (const cha
31910 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
31920 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29  n_text(pStmt, 2)
31930 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 72  ;.      pRet = r
31940 65 63 6f 76 65 72 4e 65 77 54 61 62 6c 65 28 70  ecoverNewTable(p
31950 52 63 2c 20 7a 4e 61 6d 65 2c 20 7a 53 71 6c 2c  Rc, zName, zSql,
31960 20 62 49 6e 74 6b 65 79 2c 20 6e 43 6f 6c 29 3b   bIntkey, nCol);
31970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31980 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c    }.  }..  shell
31990 46 69 6e 61 6c 69 7a 65 28 70 52 63 2c 20 70 53  Finalize(pRc, pS
319a0 74 6d 74 29 3b 0a 20 20 2a 70 62 4e 6f 6f 70 20  tmt);.  *pbNoop 
319b0 3d 20 62 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72  = bNoop;.  retur
319c0 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
319d0 20 52 65 74 75 72 6e 20 61 20 52 65 63 6f 76 65   Return a Recove
319e0 72 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65  rTable object re
319f0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6f  presenting the o
31a00 72 70 68 61 6e 73 20 74 61 62 6c 65 2e 0a 2a 2f  rphans table..*/
31a10 0a 73 74 61 74 69 63 20 52 65 63 6f 76 65 72 54  .static RecoverT
31a20 61 62 6c 65 20 2a 72 65 63 6f 76 65 72 4f 72 70  able *recoverOrp
31a30 68 61 6e 54 61 62 6c 65 28 0a 20 20 53 68 65 6c  hanTable(.  Shel
31a40 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
31a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31a60 68 65 6c 6c 20 73 74 61 74 65 20 6f 62 6a 65 63  hell state objec
31a70 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 2c  t */.  int *pRc,
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
31aa0 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
31ab0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
31ac0 6f 73 74 41 6e 64 46 6f 75 6e 64 2c 20 20 20 20  ostAndFound,    
31ad0 20 20 2f 2a 20 42 61 73 65 20 6e 61 6d 65 20 66    /* Base name f
31ae0 6f 72 20 6f 72 70 68 61 6e 73 20 74 61 62 6c 65  or orphans table
31af0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 20   */.  int nCol  
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
31b20 6f 66 20 75 73 65 72 20 64 61 74 61 20 63 6f 6c  of user data col
31b30 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 52 65 63  umns */.){.  Rec
31b40 6f 76 65 72 54 61 62 6c 65 20 2a 70 54 61 62 20  overTable *pTab 
31b50 3d 20 30 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 3e  = 0;.  if( nCol>
31b60 3d 30 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49  =0 && *pRc==SQLI
31b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
31b80 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   i;..    /* This
31b90 20 62 6c 6f 63 6b 20 64 65 74 65 72 6d 69 6e 65   block determine
31ba0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
31bb0 65 20 6f 72 70 68 61 6e 20 74 61 62 6c 65 2e 20  e orphan table. 
31bc0 54 68 65 20 70 72 65 66 65 72 65 64 0a 20 20 20  The prefered.   
31bd0 20 2a 2a 20 6e 61 6d 65 20 69 73 20 7a 4c 6f 73   ** name is zLos
31be0 74 41 6e 64 46 6f 75 6e 64 2e 20 42 75 74 20 69  tAndFound. But i
31bf0 66 20 74 68 61 74 20 63 6c 61 73 68 65 73 20 77  f that clashes w
31c00 69 74 68 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65  ith another name
31c10 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
31c20 65 63 6f 76 65 72 65 64 20 73 63 68 65 6d 61 2c  ecovered schema,
31c30 20 74 72 79 20 7a 4c 6f 73 74 41 6e 64 46 6f 75   try zLostAndFou
31c40 6e 64 5f 30 2c 20 7a 4c 6f 73 74 41 6e 64 46 6f  nd_0, zLostAndFo
31c50 75 6e 64 5f 31 0a 20 20 20 20 2a 2a 20 61 6e 64  und_1.    ** and
31c60 20 73 6f 20 6f 6e 20 75 6e 74 69 6c 20 61 20 6e   so on until a n
31c70 6f 6e 2d 63 6c 61 73 68 69 6e 67 20 6e 61 6d 65  on-clashing name
31c80 20 69 73 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20   is found.  */. 
31c90 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 30 3b     int iTab = 0;
31ca0 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 20  .    char *zTab 
31cb0 3d 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70  = shellMPrintf(p
31cc0 52 63 2c 20 22 25 73 22 2c 20 7a 4c 6f 73 74 41  Rc, "%s", zLostA
31cd0 6e 64 46 6f 75 6e 64 29 3b 0a 20 20 20 20 73 71  ndFound);.    sq
31ce0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54 65 73  lite3_stmt *pTes
31cf0 74 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 6c 6c  t = 0;.    shell
31d00 50 72 65 70 61 72 65 28 70 53 74 61 74 65 2d 3e  Prepare(pState->
31d10 64 62 2c 20 70 52 63 2c 0a 20 20 20 20 20 20 20  db, pRc,.       
31d20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
31d30 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 20  recovery.schema 
31d40 57 48 45 52 45 20 6e 61 6d 65 3d 3f 22 2c 20 26  WHERE name=?", &
31d50 70 54 65 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  pTest.    );.   
31d60 20 69 66 28 20 70 54 65 73 74 20 29 20 73 71 6c   if( pTest ) sql
31d70 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
31d80 54 65 73 74 2c 20 31 2c 20 7a 54 61 62 2c 20 2d  Test, 1, zTab, -
31d90 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
31da0 45 4e 54 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ENT);.    while(
31db0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
31dc0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
31dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54 65  sqlite3_step(pTe
31de0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 68 65  st) ){.      she
31df0 6c 6c 52 65 73 65 74 28 70 52 63 2c 20 70 54 65  llReset(pRc, pTe
31e00 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
31e10 65 33 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a 20  e3_free(zTab);. 
31e20 20 20 20 20 20 7a 54 61 62 20 3d 20 73 68 65 6c       zTab = shel
31e30 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 25  lMPrintf(pRc, "%
31e40 73 5f 25 64 22 2c 20 7a 4c 6f 73 74 41 6e 64 46  s_%d", zLostAndF
31e50 6f 75 6e 64 2c 20 69 54 61 62 2b 2b 29 3b 0a 20  ound, iTab++);. 
31e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
31e70 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20 31 2c  d_text(pTest, 1,
31e80 20 7a 54 61 62 2c 20 2d 31 2c 20 53 51 4c 49 54   zTab, -1, SQLIT
31e90 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
31ea0 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
31eb0 61 6c 69 7a 65 28 70 52 63 2c 20 70 54 65 73 74  alize(pRc, pTest
31ec0 29 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 28  );..    pTab = (
31ed0 52 65 63 6f 76 65 72 54 61 62 6c 65 2a 29 73 68  RecoverTable*)sh
31ee0 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73  ellMalloc(pRc, s
31ef0 69 7a 65 6f 66 28 52 65 63 6f 76 65 72 54 61 62  izeof(RecoverTab
31f00 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
31f10 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
31f20 2d 3e 7a 51 75 6f 74 65 64 20 3d 20 73 68 65 6c  ->zQuoted = shel
31f30 6c 4d 50 72 69 6e 74 66 28 70 52 63 2c 20 22 5c  lMPrintf(pRc, "\
31f40 22 25 77 5c 22 22 2c 20 7a 54 61 62 29 3b 0a 20  "%w\"", zTab);. 
31f50 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
31f60 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54  = nCol;.      pT
31f70 61 62 2d 3e 69 50 6b 20 3d 20 2d 32 3b 0a 20 20  ab->iPk = -2;.  
31f80 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 30 20 29      if( nCol>0 )
31f90 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
31fa0 61 7a 6c 43 6f 6c 20 3d 20 28 63 68 61 72 2a 2a  azlCol = (char**
31fb0 29 73 68 65 6c 6c 4d 61 6c 6c 6f 63 28 70 52 63  )shellMalloc(pRc
31fc0 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
31fd0 2a 20 28 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 20  * (nCol+1));.   
31fe0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61       if( pTab->a
31ff0 7a 6c 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  zlCol ){.       
32000 20 20 20 70 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b     pTab->azlCol[
32010 6e 43 6f 6c 5d 20 3d 20 73 68 65 6c 6c 4d 50 72  nCol] = shellMPr
32020 69 6e 74 66 28 70 52 63 2c 20 22 22 29 3b 0a 20  intf(pRc, "");. 
32030 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6e           for(i=n
32040 43 6f 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Col-1; i>=0; i--
32050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
32060 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 5d 20 3d  Tab->azlCol[i] =
32070 20 73 68 65 6c 6c 4d 50 72 69 6e 74 66 28 70 52   shellMPrintf(pR
32080 63 2c 20 22 25 73 2c 20 4e 55 4c 4c 22 2c 20 70  c, "%s, NULL", p
32090 54 61 62 2d 3e 61 7a 6c 43 6f 6c 5b 69 2b 31 5d  Tab->azlCol[i+1]
320a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
320b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
320c0 0a 0a 20 20 20 20 20 20 69 66 28 20 2a 70 52 63  ..      if( *pRc
320d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
320e0 20 20 20 20 20 20 20 72 65 63 6f 76 65 72 46 72         recoverFr
320f0 65 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  eeTable(pTab);. 
32100 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b         pTab = 0;
32110 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32120 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32130 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20  (pState->out, . 
32140 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
32150 54 45 20 54 41 42 4c 45 20 25 73 28 72 6f 6f 74  TE TABLE %s(root
32160 70 67 6e 6f 20 49 4e 54 45 47 45 52 2c 20 22 0a  pgno INTEGER, ".
32170 20 20 20 20 20 20 20 20 20 20 20 20 22 70 67 6e              "pgn
32180 6f 20 49 4e 54 45 47 45 52 2c 20 6e 66 69 65 6c  o INTEGER, nfiel
32190 64 20 49 4e 54 45 47 45 52 2c 20 69 64 20 49 4e  d INTEGER, id IN
321a0 54 45 47 45 52 22 2c 20 70 54 61 62 2d 3e 7a 51  TEGER", pTab->zQ
321b0 75 6f 74 65 64 0a 20 20 20 20 20 20 20 20 29 3b  uoted.        );
321c0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
321d0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
321e0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
321f0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
32200 2c 20 22 2c 20 63 25 64 22 2c 20 69 29 3b 0a 20  , ", c%d", i);. 
32210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32220 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61   raw_printf(pSta
32230 74 65 2d 3e 6f 75 74 2c 20 22 29 3b 5c 6e 22 29  te->out, ");\n")
32240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32250 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32260 28 7a 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65  (zTab);.  }.  re
32270 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
32280 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32290 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
322a0 65 63 6f 76 65 72 20 64 61 74 61 20 66 72 6f 6d  ecover data from
322b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
322c0 20 73 63 72 69 70 74 0a 2a 2a 20 74 6f 20 63 6f   script.** to co
322d0 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 64 61  nstruct a new da
322e0 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
322f0 67 20 61 6c 6c 20 72 65 63 6f 76 65 72 65 64 20  g all recovered 
32300 64 61 74 61 20 69 73 20 6f 75 74 70 75 74 0a 2a  data is output.*
32310 2a 20 6f 6e 20 73 74 72 65 61 6d 20 70 53 74 61  * on stream pSta
32320 74 65 2d 3e 6f 75 74 2e 0a 2a 2f 0a 73 74 61 74  te->out..*/.stat
32330 69 63 20 69 6e 74 20 72 65 63 6f 76 65 72 44 61  ic int recoverDa
32340 74 61 62 61 73 65 43 6d 64 28 53 68 65 6c 6c 53  tabaseCmd(ShellS
32350 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 69 6e  tate *pState, in
32360 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
32370 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  zArg){.  int rc 
32380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
32390 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 6f  qlite3_stmt *pLo
323a0 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  op = 0;        /
323b0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
323c0 6c 6c 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f  ll root pages */
323d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
323e0 2a 70 50 61 67 65 73 20 3d 20 30 3b 20 20 20 20  *pPages = 0;    
323f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
32400 67 68 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  gh all pages in 
32410 61 20 67 72 6f 75 70 20 2a 2f 0a 20 20 73 71 6c  a group */.  sql
32420 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 65 6c 6c  ite3_stmt *pCell
32430 73 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  s = 0;       /* 
32440 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
32450 20 63 65 6c 6c 73 20 69 6e 20 61 20 70 61 67 65   cells in a page
32460 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
32470 20 2a 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20   *zRecoveryDb = 
32480 22 22 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  "";   /* Name of
32490 20 22 72 65 63 6f 76 65 72 79 22 20 64 61 74 61   "recovery" data
324a0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
324b0 63 68 61 72 20 2a 7a 4c 6f 73 74 41 6e 64 46 6f  char *zLostAndFo
324c0 75 6e 64 20 3d 20 22 6c 6f 73 74 5f 61 6e 64 5f  und = "lost_and_
324d0 66 6f 75 6e 64 22 3b 0a 20 20 69 6e 74 20 69 3b  found";.  int i;
324e0 0a 20 20 69 6e 74 20 6e 4f 72 70 68 61 6e 20 3d  .  int nOrphan =
324f0 20 2d 31 3b 0a 20 20 52 65 63 6f 76 65 72 54 61   -1;.  RecoverTa
32500 62 6c 65 20 2a 70 4f 72 70 68 61 6e 20 3d 20 30  ble *pOrphan = 0
32510 3b 0a 0a 20 20 69 6e 74 20 62 46 72 65 65 6c 69  ;..  int bFreeli
32520 73 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  st = 1;         
32530 20 20 20 20 20 2f 2a 20 30 20 69 66 20 2d 2d 66       /* 0 if --f
32540 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74 20  reelist-corrupt 
32550 69 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  is specified */.
32560 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
32570 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  g; i++){.    cha
32580 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
32590 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
325a0 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
325b0 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
325c0 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
325d0 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
325e0 3c 3d 31 37 20 26 26 20 6d 65 6d 63 6d 70 28 22  <=17 && memcmp("
325f0 2d 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70  -freelist-corrup
32600 74 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a  t", z, n)==0 ){.
32610 20 20 20 20 20 20 62 46 72 65 65 6c 69 73 74 20        bFreelist 
32620 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20  = 0;.    }else. 
32630 20 20 20 69 66 28 20 6e 3c 3d 31 32 20 26 26 20     if( n<=12 && 
32640 6d 65 6d 63 6d 70 28 22 2d 72 65 63 6f 76 65 72  memcmp("-recover
32650 79 2d 64 62 22 2c 20 7a 2c 20 6e 29 3d 3d 30 20  y-db", z, n)==0 
32660 26 26 20 69 3c 28 6e 41 72 67 2d 31 29 20 29 7b  && i<(nArg-1) ){
32670 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
32680 20 20 7a 52 65 63 6f 76 65 72 79 44 62 20 3d 20    zRecoveryDb = 
32690 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 7d 65  azArg[i];.    }e
326a0 6c 73 65 0a 20 20 20 20 69 66 28 20 6e 3c 3d 31  lse.    if( n<=1
326b0 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 2d 6c 6f  5 && memcmp("-lo
326c0 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 22 2c 20 7a  st-and-found", z
326d0 2c 20 6e 29 3d 3d 30 20 26 26 20 69 3c 28 6e 41  , n)==0 && i<(nA
326e0 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 69  rg-1) ){.      i
326f0 2b 2b 3b 0a 20 20 20 20 20 20 7a 4c 6f 73 74 41  ++;.      zLostA
32700 6e 64 46 6f 75 6e 64 20 3d 20 61 7a 41 72 67 5b  ndFound = azArg[
32710 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  i];.    }.    el
32720 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
32730 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
32740 65 78 70 65 63 74 65 64 20 6f 70 74 69 6f 6e 3a  expected option:
32750 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d   %s\n", azArg[i]
32760 29 3b 20 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ); .      raw_pr
32770 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
32780 74 69 6f 6e 73 20 61 72 65 3a 5c 6e 22 29 3b 0a  tions are:\n");.
32790 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
327a0 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d  (stderr, "    --
327b0 66 72 65 65 6c 69 73 74 2d 63 6f 72 72 75 70 74  freelist-corrupt
327c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  \n");.      raw_
327d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
327e0 20 20 20 20 2d 2d 72 65 63 6f 76 65 72 79 2d 64      --recovery-d
327f0 62 20 44 41 54 41 42 41 53 45 5c 6e 22 29 3b 0a  b DATABASE\n");.
32800 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32810 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 2d 2d  (stderr, "    --
32820 6c 6f 73 74 2d 61 6e 64 2d 66 6f 75 6e 64 20 54  lost-and-found T
32830 41 42 4c 45 2d 4e 41 4d 45 5c 6e 22 29 3b 0a 20  ABLE-NAME\n");. 
32840 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
32850 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65 6c     }.  }..  shel
32860 6c 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61  lExecPrintf(pSta
32870 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20  te->db, &rc,.   
32880 20 2f 2a 20 41 74 74 61 63 68 20 61 6e 20 69 6e   /* Attach an in
32890 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
328a0 20 6e 61 6d 65 64 20 27 72 65 63 6f 76 65 72 79   named 'recovery
328b0 27 2e 20 43 72 65 61 74 65 20 61 6e 20 69 6e 64  '. Create an ind
328c0 65 78 65 64 20 0a 20 20 20 20 2a 2a 20 63 61 63  exed .    ** cac
328d0 68 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  he of the sqlite
328e0 5f 64 62 70 74 72 20 76 69 72 74 75 61 6c 20 74  _dbptr virtual t
328f0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 22 50 52  able. */.    "PR
32900 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
32910 68 65 6d 61 20 3d 20 6f 6e 3b 22 0a 20 20 20 20  hema = on;".    
32920 22 41 54 54 41 43 48 20 25 51 20 41 53 20 72 65  "ATTACH %Q AS re
32930 63 6f 76 65 72 79 3b 22 0a 20 20 20 20 22 44 52  covery;".    "DR
32940 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
32950 54 53 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74  TS recovery.dbpt
32960 72 3b 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41  r;".    "DROP TA
32970 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 72 65  BLE IF EXISTS re
32980 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 3b  covery.freelist;
32990 22 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  ".    "DROP TABL
329a0 45 20 49 46 20 45 58 49 53 54 53 20 72 65 63 6f  E IF EXISTS reco
329b0 76 65 72 79 2e 6d 61 70 3b 22 0a 20 20 20 20 22  very.map;".    "
329c0 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
329d0 49 53 54 53 20 72 65 63 6f 76 65 72 79 2e 73 63  ISTS recovery.sc
329e0 68 65 6d 61 3b 22 0a 20 20 20 20 22 43 52 45 41  hema;".    "CREA
329f0 54 45 20 54 41 42 4c 45 20 72 65 63 6f 76 65 72  TE TABLE recover
32a00 79 2e 66 72 65 65 6c 69 73 74 28 70 67 6e 6f 20  y.freelist(pgno 
32a10 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
32a20 4b 45 59 29 3b 22 2c 20 7a 52 65 63 6f 76 65 72  KEY);", zRecover
32a30 79 44 62 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  yDb.  );..  if( 
32a40 62 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  bFreelist ){.   
32a50 20 73 68 65 6c 6c 45 78 65 63 28 70 53 74 61 74   shellExec(pStat
32a60 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20 20  e->db, &rc,.    
32a70 20 20 22 57 49 54 48 20 74 72 75 6e 6b 28 70 67    "WITH trunk(pg
32a80 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20 20 20  no) AS (".      
32a90 22 20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  "  SELECT shell_
32aa0 69 6e 74 33 32 28 22 0a 20 20 20 20 20 20 22 20  int32(".      " 
32ab0 20 20 20 20 20 28 53 45 4c 45 43 54 20 64 61 74       (SELECT dat
32ac0 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
32ad0 70 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d  page WHERE pgno=
32ae0 31 29 2c 20 38 29 20 41 53 20 78 20 22 0a 20 20  1), 8) AS x ".  
32af0 20 20 20 20 22 20 20 20 20 20 20 57 48 45 52 45      "      WHERE
32b00 20 78 3e 30 22 0a 20 20 20 20 20 20 22 20 20 20   x>0".      "   
32b10 20 55 4e 49 4f 4e 22 0a 20 20 20 20 20 20 22 20   UNION".      " 
32b20 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 69 6e   SELECT shell_in
32b30 74 33 32 28 22 0a 20 20 20 20 20 20 22 20 20 20  t32(".      "   
32b40 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61 20     (SELECT data 
32b50 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70 61  FROM sqlite_dbpa
32b60 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 74 72  ge WHERE pgno=tr
32b70 75 6e 6b 2e 70 67 6e 6f 29 2c 20 30 29 20 41 53  unk.pgno), 0) AS
32b80 20 78 20 22 0a 20 20 20 20 20 20 22 20 20 20 20   x ".      "    
32b90 20 20 46 52 4f 4d 20 74 72 75 6e 6b 20 57 48 45    FROM trunk WHE
32ba0 52 45 20 78 3e 30 22 0a 20 20 20 20 20 20 22 29  RE x>0".      ")
32bb0 2c 22 0a 20 20 20 20 20 20 22 66 72 65 65 6c 69  ,".      "freeli
32bc0 73 74 28 64 61 74 61 2c 20 6e 2c 20 66 72 65 65  st(data, n, free
32bd0 70 67 6e 6f 29 20 41 53 20 28 22 0a 20 20 20 20  pgno) AS (".    
32be0 20 20 22 20 20 53 45 4c 45 43 54 20 64 61 74 61    "  SELECT data
32bf0 2c 20 6d 69 6e 28 31 36 33 38 34 2c 20 73 68 65  , min(16384, she
32c00 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61 2c 20 31  ll_int32(data, 1
32c10 29 2d 31 29 2c 20 74 2e 70 67 6e 6f 20 22 0a 20  )-1), t.pgno ". 
32c20 20 20 20 20 20 22 20 20 20 20 20 20 46 52 4f 4d       "      FROM
32c30 20 74 72 75 6e 6b 20 74 2c 20 73 71 6c 69 74 65   trunk t, sqlite
32c40 5f 64 62 70 61 67 65 20 73 20 57 48 45 52 45 20  _dbpage s WHERE 
32c50 73 2e 70 67 6e 6f 3d 74 2e 70 67 6e 6f 22 0a 20  s.pgno=t.pgno". 
32c60 20 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20       "    UNION 
32c70 41 4c 4c 22 0a 20 20 20 20 20 20 22 20 20 53 45  ALL".      "  SE
32c80 4c 45 43 54 20 64 61 74 61 2c 20 6e 2d 31 2c 20  LECT data, n-1, 
32c90 73 68 65 6c 6c 5f 69 6e 74 33 32 28 64 61 74 61  shell_int32(data
32ca0 2c 20 32 2b 6e 29 20 22 0a 20 20 20 20 20 20 22  , 2+n) ".      "
32cb0 20 20 20 20 20 20 46 52 4f 4d 20 66 72 65 65 6c        FROM freel
32cc0 69 73 74 20 57 48 45 52 45 20 6e 3e 3d 30 22 0a  ist WHERE n>=0".
32cd0 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 20 20        ")".      
32ce0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 72 65  "REPLACE INTO re
32cf0 63 6f 76 65 72 79 2e 66 72 65 65 6c 69 73 74 20  covery.freelist 
32d00 53 45 4c 45 43 54 20 66 72 65 65 70 67 6e 6f 20  SELECT freepgno 
32d10 46 52 4f 4d 20 66 72 65 65 6c 69 73 74 3b 22 0a  FROM freelist;".
32d20 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a      );.  }..  /*
32d30 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
32d40 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
32d50 61 73 65 2c 20 61 64 64 20 61 6c 6c 20 70 6f 69  ase, add all poi
32d60 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 20 74  nter-map pages t
32d70 6f 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c  o.  ** the freel
32d80 69 73 74 20 74 61 62 6c 65 2e 20 44 6f 20 74 68  ist table. Do th
32d90 69 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  is regardless of
32da0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
32db0 0a 20 20 2a 2a 20 2d 2d 66 72 65 65 6c 69 73 74  .  ** --freelist
32dc0 2d 63 6f 72 72 75 70 74 20 77 61 73 20 73 70 65  -corrupt was spe
32dd0 63 69 66 69 65 64 2e 20 20 2a 2f 0a 20 20 73 68  cified.  */.  sh
32de0 65 6c 6c 45 78 65 63 28 70 53 74 61 74 65 2d 3e  ellExec(pState->
32df0 64 62 2c 20 26 72 63 2c 20 0a 20 20 20 20 22 57  db, &rc, .    "W
32e00 49 54 48 20 70 74 72 6d 61 70 28 70 67 6e 6f 29  ITH ptrmap(pgno)
32e10 20 41 53 20 28 22 0a 20 20 20 20 22 20 20 53 45   AS (".    "  SE
32e20 4c 45 43 54 20 32 20 57 48 45 52 45 20 73 68 65  LECT 2 WHERE she
32e30 6c 6c 5f 69 6e 74 33 32 28 22 0a 20 20 20 20 22  ll_int32(".    "
32e40 20 20 20 20 28 53 45 4c 45 43 54 20 64 61 74 61      (SELECT data
32e50 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
32e60 61 67 65 20 57 48 45 52 45 20 70 67 6e 6f 3d 31  age WHERE pgno=1
32e70 29 2c 20 31 33 22 0a 20 20 20 20 22 20 20 29 22  ), 13".    "  )"
32e80 0a 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20  .    "    UNION 
32e90 41 4c 4c 20 22 0a 20 20 20 20 22 20 20 53 45 4c  ALL ".    "  SEL
32ea0 45 43 54 20 70 67 6e 6f 2b 31 2b 28 53 45 4c 45  ECT pgno+1+(SELE
32eb0 43 54 20 70 61 67 65 5f 73 69 7a 65 20 46 52 4f  CT page_size FRO
32ec0 4d 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 73 69  M pragma_page_si
32ed0 7a 65 29 2f 35 20 41 53 20 70 70 20 22 0a 20 20  ze)/5 AS pp ".  
32ee0 20 20 22 20 20 46 52 4f 4d 20 70 74 72 6d 61 70    "  FROM ptrmap
32ef0 20 57 48 45 52 45 20 70 70 3c 3d 28 53 45 4c 45   WHERE pp<=(SELE
32f00 43 54 20 70 61 67 65 5f 63 6f 75 6e 74 20 46 52  CT page_count FR
32f10 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67 65 5f 63  OM pragma_page_c
32f20 6f 75 6e 74 29 22 0a 20 20 20 20 22 29 22 0a 20  ount)".    ")". 
32f30 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
32f40 20 72 65 63 6f 76 65 72 79 2e 66 72 65 65 6c 69   recovery.freeli
32f50 73 74 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46  st SELECT pgno F
32f60 52 4f 4d 20 70 74 72 6d 61 70 22 0a 20 20 29 3b  ROM ptrmap".  );
32f70 0a 0a 20 20 73 68 65 6c 6c 45 78 65 63 28 70 53  ..  shellExec(pS
32f80 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a  tate->db, &rc, .
32f90 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
32fa0 45 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74 72  E recovery.dbptr
32fb0 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 70 67  (".    "      pg
32fc0 6e 6f 2c 20 63 68 69 6c 64 2c 20 50 52 49 4d 41  no, child, PRIMA
32fd0 52 59 20 4b 45 59 28 63 68 69 6c 64 2c 20 70 67  RY KEY(child, pg
32fe0 6e 6f 29 22 0a 20 20 20 20 22 29 20 57 49 54 48  no)".    ") WITH
32ff0 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20 20 20 20  OUT ROWID;".    
33000 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
33010 45 20 49 4e 54 4f 20 72 65 63 6f 76 65 72 79 2e  E INTO recovery.
33020 64 62 70 74 72 28 70 67 6e 6f 2c 20 63 68 69 6c  dbptr(pgno, chil
33030 64 29 20 22 0a 20 20 20 20 22 20 20 20 20 53 45  d) ".    "    SE
33040 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
33050 74 65 5f 64 62 70 74 72 22 0a 20 20 20 20 22 20  te_dbptr".    " 
33060 20 20 20 20 20 57 48 45 52 45 20 70 67 6e 6f 20       WHERE pgno 
33070 4e 4f 54 20 49 4e 20 66 72 65 65 6c 69 73 74 20  NOT IN freelist 
33080 41 4e 44 20 63 68 69 6c 64 20 4e 4f 54 20 49 4e  AND child NOT IN
33090 20 66 72 65 65 6c 69 73 74 3b 22 0a 0a 20 20 20   freelist;"..   
330a0 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 70   /* Delete any p
330b0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 31  ointer to page 1
330c0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
330d0 68 61 74 20 70 61 67 65 20 31 20 69 73 20 63 6f  hat page 1 is co
330e0 6e 73 69 64 65 72 65 64 0a 20 20 20 20 2a 2a 20  nsidered.    ** 
330f0 61 20 72 6f 6f 74 20 70 61 67 65 2c 20 72 65 67  a root page, reg
33100 61 72 64 6c 65 73 73 20 6f 66 20 68 6f 77 20 63  ardless of how c
33110 6f 72 72 75 70 74 20 74 68 65 20 64 62 20 69 73  orrupt the db is
33120 2e 20 2a 2f 0a 20 20 20 20 22 44 45 4c 45 54 45  . */.    "DELETE
33130 20 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64   FROM recovery.d
33140 62 70 74 72 20 57 48 45 52 45 20 63 68 69 6c 64  bptr WHERE child
33150 20 3d 20 31 3b 22 0a 0a 20 20 20 20 2f 2a 20 44   = 1;"..    /* D
33160 65 6c 65 74 65 20 61 6c 6c 20 70 6f 69 6e 74 65  elete all pointe
33170 72 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 20  rs to any pages 
33180 74 68 61 74 20 68 61 76 65 20 6d 6f 72 65 20 74  that have more t
33190 68 61 6e 20 6f 6e 65 20 70 6f 69 6e 74 65 72 0a  han one pointer.
331a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 6d 2e 20      ** to them. 
331b0 53 75 63 68 20 70 61 67 65 73 20 77 69 6c 6c 20  Such pages will 
331c0 62 65 20 74 72 65 61 74 65 64 20 61 73 20 72 6f  be treated as ro
331d0 6f 74 20 70 61 67 65 73 20 77 68 65 6e 20 72 65  ot pages when re
331e0 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20  covering.    ** 
331f0 64 61 74 61 2e 20 20 2a 2f 0a 20 20 20 20 22 44  data.  */.    "D
33200 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 63 6f 76  ELETE FROM recov
33210 65 72 79 2e 64 62 70 74 72 20 57 48 45 52 45 20  ery.dbptr WHERE 
33220 63 68 69 6c 64 20 49 4e 20 28 22 0a 20 20 20 20  child IN (".    
33230 22 20 20 53 45 4c 45 43 54 20 63 68 69 6c 64 20  "  SELECT child 
33240 46 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62  FROM recovery.db
33250 70 74 72 20 47 52 4f 55 50 20 42 59 20 63 68 69  ptr GROUP BY chi
33260 6c 64 20 48 41 56 49 4e 47 20 63 6f 75 6e 74 28  ld HAVING count(
33270 2a 29 3e 31 22 0a 20 20 20 20 22 29 3b 22 0a 0a  *)>1".    ");"..
33280 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
33290 65 20 22 6d 61 70 22 20 74 61 62 6c 65 20 74 68  e "map" table th
332a0 61 74 20 77 69 6c 6c 20 28 65 76 65 6e 74 75 61  at will (eventua
332b0 6c 6c 79 29 20 63 6f 6e 74 61 69 6e 20 69 6e 73  lly) contain ins
332c0 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  tructions.    **
332d0 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
332e0 68 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  h each page in t
332f0 68 65 20 64 62 20 74 68 61 74 20 63 6f 6e 74 61  he db that conta
33300 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
33310 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73 2e  .    ** records.
33320 20 2a 2f 0a 20 20 20 20 22 43 52 45 41 54 45 20   */.    "CREATE 
33330 54 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 6d  TABLE recovery.m
33340 61 70 28 22 0a 20 20 20 20 20 20 22 70 67 6e 6f  ap(".      "pgno
33350 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
33360 20 4b 45 59 2c 20 6d 61 78 6c 65 6e 20 49 4e 54   KEY, maxlen INT
33370 2c 20 69 6e 74 6b 65 79 2c 20 72 6f 6f 74 20 49  , intkey, root I
33380 4e 54 22 0a 20 20 20 20 22 29 3b 22 0a 0a 20 20  NT".    ");"..  
33390 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 61    /* Populate ta
333a0 62 6c 65 20 5b 6d 61 70 5d 2e 20 49 66 20 74 68  ble [map]. If th
333b0 65 72 65 20 61 72 65 20 63 69 72 63 75 6c 61 72  ere are circular
333c0 20 6c 6f 6f 70 73 20 6f 66 20 70 61 67 65 73 20   loops of pages 
333d0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  in the.    ** da
333e0 74 61 62 61 73 65 2c 20 74 68 65 20 66 6f 6c 6c  tabase, the foll
333f0 6f 77 69 6e 67 20 61 64 64 73 20 61 6c 6c 20 70  owing adds all p
33400 61 67 65 73 20 69 6e 20 73 75 63 68 20 61 20 6c  ages in such a l
33410 6f 6f 70 20 74 6f 20 74 68 65 20 6d 61 70 0a 20  oop to the map. 
33420 20 20 20 2a 2a 20 61 73 20 69 6e 64 69 76 69 64     ** as individ
33430 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 73 2e 20  ual root pages. 
33440 54 68 69 73 20 63 6f 75 6c 64 20 62 65 20 68 61  This could be ha
33450 6e 64 6c 65 64 20 62 65 74 74 65 72 2e 20 20 2a  ndled better.  *
33460 2f 0a 20 20 20 20 22 57 49 54 48 20 70 61 67 65  /.    "WITH page
33470 73 28 69 2c 20 6d 61 78 6c 65 6e 29 20 41 53 20  s(i, maxlen) AS 
33480 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  (".    "  SELECT
33490 20 70 61 67 65 5f 63 6f 75 6e 74 2c 20 28 22 0a   page_count, (".
334a0 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20      "    SELECT 
334b0 6d 61 78 28 66 69 65 6c 64 2b 31 29 20 46 52 4f  max(field+1) FRO
334c0 4d 20 73 71 6c 69 74 65 5f 64 62 64 61 74 61 20  M sqlite_dbdata 
334d0 57 48 45 52 45 20 70 67 6e 6f 3d 70 61 67 65 5f  WHERE pgno=page_
334e0 63 6f 75 6e 74 22 0a 20 20 20 20 22 20 20 29 20  count".    "  ) 
334f0 46 52 4f 4d 20 70 72 61 67 6d 61 5f 70 61 67 65  FROM pragma_page
33500 5f 63 6f 75 6e 74 20 57 48 45 52 45 20 70 61 67  _count WHERE pag
33510 65 5f 63 6f 75 6e 74 3e 30 22 0a 20 20 20 20 22  e_count>0".    "
33520 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20      UNION ALL". 
33530 20 20 20 22 20 20 53 45 4c 45 43 54 20 69 2d 31     "  SELECT i-1
33540 2c 20 28 22 0a 20 20 20 20 22 20 20 20 20 53 45  , (".    "    SE
33550 4c 45 43 54 20 6d 61 78 28 66 69 65 6c 64 2b 31  LECT max(field+1
33560 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  ) FROM sqlite_db
33570 64 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 3d  data WHERE pgno=
33580 69 2d 31 22 0a 20 20 20 20 22 20 20 29 20 46 52  i-1".    "  ) FR
33590 4f 4d 20 70 61 67 65 73 20 57 48 45 52 45 20 69  OM pages WHERE i
335a0 3e 3d 32 22 0a 20 20 20 20 22 29 22 0a 20 20 20  >=2".    ")".   
335b0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65   "INSERT INTO re
335c0 63 6f 76 65 72 79 2e 6d 61 70 28 70 67 6e 6f 2c  covery.map(pgno,
335d0 20 6d 61 78 6c 65 6e 2c 20 69 6e 74 6b 65 79 2c   maxlen, intkey,
335e0 20 72 6f 6f 74 29 20 22 0a 20 20 20 20 22 20 20   root) ".    "  
335f0 53 45 4c 45 43 54 20 69 2c 20 6d 61 78 6c 65 6e  SELECT i, maxlen
33600 2c 20 4e 55 4c 4c 2c 20 28 22 0a 20 20 20 20 22  , NULL, (".    "
33610 20 20 20 20 57 49 54 48 20 70 28 6f 72 69 67 2c      WITH p(orig,
33620 20 70 67 6e 6f 2c 20 70 61 72 65 6e 74 29 20 41   pgno, parent) A
33630 53 20 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  S (".    "      
33640 53 45 4c 45 43 54 20 30 2c 20 69 2c 20 28 53 45  SELECT 0, i, (SE
33650 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72  LECT pgno FROM r
33660 65 63 6f 76 65 72 79 2e 64 62 70 74 72 20 57 48  ecovery.dbptr WH
33670 45 52 45 20 63 68 69 6c 64 3d 69 29 22 0a 20 20  ERE child=i)".  
33680 20 20 22 20 20 20 20 20 20 20 20 55 4e 49 4f 4e    "        UNION
33690 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 53 45   ".    "      SE
336a0 4c 45 43 54 20 69 2c 20 70 2e 70 61 72 65 6e 74  LECT i, p.parent
336b0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  , ".    "       
336c0 20 28 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52   (SELECT pgno FR
336d0 4f 4d 20 72 65 63 6f 76 65 72 79 2e 64 62 70 74  OM recovery.dbpt
336e0 72 20 57 48 45 52 45 20 63 68 69 6c 64 3d 70 2e  r WHERE child=p.
336f0 70 61 72 65 6e 74 29 20 46 52 4f 4d 20 70 22 0a  parent) FROM p".
33700 20 20 20 20 22 20 20 20 20 29 22 0a 20 20 20 20      "    )".    
33710 22 20 20 20 20 53 45 4c 45 43 54 20 70 67 6e 6f  "    SELECT pgno
33720 20 46 52 4f 4d 20 70 20 57 48 45 52 45 20 28 70   FROM p WHERE (p
33730 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 4f 52  arent IS NULL OR
33740 20 70 67 6e 6f 20 3d 20 6f 72 69 67 29 22 0a 20   pgno = orig)". 
33750 20 20 20 22 29 20 22 0a 20 20 20 20 22 46 52 4f     ") ".    "FRO
33760 4d 20 70 61 67 65 73 20 57 48 45 52 45 20 6d 61  M pages WHERE ma
33770 78 6c 65 6e 20 3e 20 30 20 41 4e 44 20 69 20 4e  xlen > 0 AND i N
33780 4f 54 20 49 4e 20 66 72 65 65 6c 69 73 74 3b 22  OT IN freelist;"
33790 0a 20 20 20 20 22 55 50 44 41 54 45 20 72 65 63  .    "UPDATE rec
337a0 6f 76 65 72 79 2e 6d 61 70 20 41 53 20 6f 20 53  overy.map AS o S
337b0 45 54 20 69 6e 74 6b 65 79 20 3d 20 28 22 0a 20  ET intkey = (". 
337c0 20 20 20 22 20 20 53 45 4c 45 43 54 20 73 75 62     "  SELECT sub
337d0 73 74 72 28 64 61 74 61 2c 20 31 2c 20 31 29 3d  str(data, 1, 1)=
337e0 3d 58 27 30 44 27 20 46 52 4f 4d 20 73 71 6c 69  =X'0D' FROM sqli
337f0 74 65 5f 64 62 70 61 67 65 20 57 48 45 52 45 20  te_dbpage WHERE 
33800 70 67 6e 6f 3d 6f 2e 70 67 6e 6f 22 0a 20 20 20  pgno=o.pgno".   
33810 20 22 29 3b 22 0a 0a 20 20 20 20 2f 2a 20 45 78   ");"..    /* Ex
33820 74 72 61 63 74 20 64 61 74 61 20 66 72 6f 6d 20  tract data from 
33830 70 61 67 65 20 31 20 61 6e 64 20 61 6e 79 20 6c  page 1 and any l
33840 69 6e 6b 65 64 20 70 61 67 65 73 20 69 6e 74 6f  inked pages into
33850 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 72 65   table.    ** re
33860 63 6f 76 65 72 79 2e 73 63 68 65 6d 61 2e 20 57  covery.schema. W
33870 69 74 68 20 74 68 65 20 73 61 6d 65 20 73 63 68  ith the same sch
33880 65 6d 61 20 61 73 20 61 6e 20 73 71 6c 69 74 65  ema as an sqlite
33890 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
338a0 2a 2f 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  */.    "CREATE T
338b0 41 42 4c 45 20 72 65 63 6f 76 65 72 79 2e 73 63  ABLE recovery.sc
338c0 68 65 6d 61 28 74 79 70 65 2c 20 6e 61 6d 65 2c  hema(type, name,
338d0 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70   tbl_name, rootp
338e0 61 67 65 2c 20 73 71 6c 29 3b 22 0a 20 20 20 20  age, sql);".    
338f0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 63  "INSERT INTO rec
33900 6f 76 65 72 79 2e 73 63 68 65 6d 61 20 53 45 4c  overy.schema SEL
33910 45 43 54 20 22 0a 20 20 20 20 22 20 20 6d 61 78  ECT ".    "  max
33920 28 43 41 53 45 20 57 48 45 4e 20 66 69 65 6c 64  (CASE WHEN field
33930 3d 30 20 54 48 45 4e 20 76 61 6c 75 65 20 45 4c  =0 THEN value EL
33940 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22 0a 20  SE NULL END),". 
33950 20 20 20 22 20 20 6d 61 78 28 43 41 53 45 20 57     "  max(CASE W
33960 48 45 4e 20 66 69 65 6c 64 3d 31 20 54 48 45 4e  HEN field=1 THEN
33970 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55 4c 4c   value ELSE NULL
33980 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20 20 6d   END),".    "  m
33990 61 78 28 43 41 53 45 20 57 48 45 4e 20 66 69 65  ax(CASE WHEN fie
339a0 6c 64 3d 32 20 54 48 45 4e 20 76 61 6c 75 65 20  ld=2 THEN value 
339b0 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29 2c 22  ELSE NULL END),"
339c0 0a 20 20 20 20 22 20 20 6d 61 78 28 43 41 53 45  .    "  max(CASE
339d0 20 57 48 45 4e 20 66 69 65 6c 64 3d 33 20 54 48   WHEN field=3 TH
339e0 45 4e 20 76 61 6c 75 65 20 45 4c 53 45 20 4e 55  EN value ELSE NU
339f0 4c 4c 20 45 4e 44 29 2c 22 0a 20 20 20 20 22 20  LL END),".    " 
33a00 20 6d 61 78 28 43 41 53 45 20 57 48 45 4e 20 66   max(CASE WHEN f
33a10 69 65 6c 64 3d 34 20 54 48 45 4e 20 76 61 6c 75  ield=4 THEN valu
33a20 65 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 29  e ELSE NULL END)
33a30 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69  ".    "FROM sqli
33a40 74 65 5f 64 62 64 61 74 61 20 57 48 45 52 45 20  te_dbdata WHERE 
33a50 70 67 6e 6f 20 49 4e 20 28 22 0a 20 20 20 20 22  pgno IN (".    "
33a60 20 20 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52    SELECT pgno FR
33a70 4f 4d 20 72 65 63 6f 76 65 72 79 2e 6d 61 70 20  OM recovery.map 
33a80 57 48 45 52 45 20 72 6f 6f 74 3d 31 22 0a 20 20  WHERE root=1".  
33a90 20 20 22 29 22 0a 20 20 20 20 22 47 52 4f 55 50    ")".    "GROUP
33aa0 20 42 59 20 70 67 6e 6f 2c 20 63 65 6c 6c 3b 22   BY pgno, cell;"
33ab0 0a 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44  .    "CREATE IND
33ac0 45 58 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65  EX recovery.sche
33ad0 6d 61 5f 72 6f 6f 74 70 61 67 65 20 4f 4e 20 73  ma_rootpage ON s
33ae0 63 68 65 6d 61 28 72 6f 6f 74 70 61 67 65 29 3b  chema(rootpage);
33af0 22 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ".  );..  /* Ope
33b00 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
33b10 20 74 68 65 6e 20 70 72 69 6e 74 20 6f 75 74 20   then print out 
33b20 61 6c 6c 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 2c  all non-virtual,
33b30 20 6e 6f 6e 2d 22 73 71 6c 69 74 65 5f 25 22 20   non-"sqlite_%" 
33b40 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
33b50 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  LE statements th
33b60 61 74 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  at extracted fro
33b70 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 73  m the existing s
33b80 63 68 65 6d 61 2e 20 20 2a 2f 0a 20 20 69 66 28  chema.  */.  if(
33b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
33bb0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
33bc0 20 20 20 2f 2a 20 22 2e 72 65 63 6f 76 65 72 22     /* ".recover"
33bd0 20 6d 69 67 68 74 20 6f 75 74 70 75 74 20 63 6f   might output co
33be0 6e 74 65 6e 74 20 69 6e 20 61 6e 20 6f 72 64 65  ntent in an orde
33bf0 72 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69  r which causes i
33c00 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20  mmediate.    ** 
33c10 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
33c20 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69  traints to be vi
33c30 6f 6c 61 74 65 64 2e 20 53 6f 20 64 69 73 61 62  olated. So disab
33c40 6c 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 0a 20  le foreign-key. 
33c50 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
33c60 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20   enforcement to 
33c70 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73  prevent problems
33c80 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 74 68   when running th
33c90 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
33ca0 73 63 72 69 70 74 2e 20 2a 2f 0a 20 20 20 20 72  script. */.    r
33cb0 61 77 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  aw_printf(pState
33cc0 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 66  ->out, "PRAGMA f
33cd0 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b  oreign_keys=OFF;
33ce0 5c 6e 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  \n");.    raw_pr
33cf0 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
33d00 2c 20 22 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20  , "BEGIN;\n");. 
33d10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
33d20 74 61 74 65 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tate->out, "PRAG
33d30 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
33d40 6d 61 20 3d 20 6f 6e 3b 5c 6e 22 29 3b 0a 20 20  ma = on;\n");.  
33d50 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 70    shellPrepare(p
33d60 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a  State->db, &rc,.
33d70 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
33d80 73 71 6c 20 46 52 4f 4d 20 72 65 63 6f 76 65 72  sql FROM recover
33d90 79 2e 73 63 68 65 6d 61 20 22 0a 20 20 20 20 20  y.schema ".     
33da0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
33db0 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c  table' AND sql L
33dc0 49 4b 45 20 27 63 72 65 61 74 65 20 74 61 62 6c  IKE 'create tabl
33dd0 65 25 27 22 2c 20 26 70 53 74 6d 74 0a 20 20 20  e%'", &pStmt.   
33de0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72   );.    while( r
33df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33e00 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
33e10 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
33e20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
33e30 68 61 72 20 2a 7a 43 72 65 61 74 65 54 61 62 6c  har *zCreateTabl
33e40 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
33e50 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33e60 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  text(pStmt, 0);.
33e70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33e80 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 43  (pState->out, "C
33e90 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
33ea0 4f 54 20 45 58 49 53 54 53 20 25 73 3b 5c 6e 22  OT EXISTS %s;\n"
33eb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 26 7a 43  , .          &zC
33ec0 72 65 61 74 65 54 61 62 6c 65 5b 31 32 5d 0a 20  reateTable[12]. 
33ed0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
33ee0 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28    shellFinalize(
33ef0 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
33f00 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
33f10 74 20 69 66 20 61 6e 20 6f 72 70 68 61 6e 20 74  t if an orphan t
33f20 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 72 65 71  able will be req
33f30 75 69 72 65 64 2e 20 41 6e 64 20 69 66 20 73 6f  uired. And if so
33f40 2c 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20  , how many.  ** 
33f50 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20 69 74 20  user columns it 
33f60 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 2a  should contain *
33f70 2f 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  /.  shellPrepare
33f80 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
33f90 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
33fa0 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 6d 61   coalesce(max(ma
33fb0 78 6c 65 6e 29 2c 20 2d 32 29 20 46 52 4f 4d 20  xlen), -2) FROM 
33fc0 72 65 63 6f 76 65 72 79 2e 6d 61 70 20 57 48 45  recovery.map WHE
33fd0 52 45 20 72 6f 6f 74 3e 31 22 0a 20 20 20 20 20  RE root>1".     
33fe0 20 2c 20 26 70 4c 6f 6f 70 0a 20 20 29 3b 0a 20   , &pLoop.  );. 
33ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34000 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
34010 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
34020 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 6e 4f 72  Loop) ){.    nOr
34030 70 68 61 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  phan = sqlite3_c
34040 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c  olumn_int(pLoop,
34050 20 30 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c   0);.  }.  shell
34060 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c  Finalize(&rc, pL
34070 6f 6f 70 29 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20  oop);.  pLoop = 
34080 30 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  0;..  shellPrepa
34090 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  re(pState->db, &
340a0 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  rc,.      "SELEC
340b0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 72 65 63 6f  T pgno FROM reco
340c0 76 65 72 79 2e 6d 61 70 20 57 48 45 52 45 20 72  very.map WHERE r
340d0 6f 6f 74 3d 3f 22 2c 20 26 70 50 61 67 65 73 0a  oot=?", &pPages.
340e0 20 20 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70    );.  shellPrep
340f0 61 72 65 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  are(pState->db, 
34100 26 72 63 2c 0a 20 20 20 20 20 20 22 53 45 4c 45  &rc,.      "SELE
34110 43 54 20 6d 61 78 28 66 69 65 6c 64 29 2c 20 67  CT max(field), g
34120 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 68 65 6c  roup_concat(shel
34130 6c 5f 65 73 63 61 70 65 5f 63 72 6e 6c 28 71 75  l_escape_crnl(qu
34140 6f 74 65 28 76 61 6c 75 65 29 29 2c 20 27 2c 20  ote(value)), ', 
34150 27 29 22 0a 20 20 20 20 20 20 22 2c 20 6d 69 6e  ')".      ", min
34160 28 66 69 65 6c 64 29 20 22 0a 20 20 20 20 20 20  (field) ".      
34170 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 64  "FROM sqlite_dbd
34180 61 74 61 20 57 48 45 52 45 20 70 67 6e 6f 20 3d  ata WHERE pgno =
34190 20 3f 20 41 4e 44 20 66 69 65 6c 64 20 21 3d 20   ? AND field != 
341a0 3f 22 0a 20 20 20 20 20 20 22 47 52 4f 55 50 20  ?".      "GROUP 
341b0 42 59 20 63 65 6c 6c 22 2c 20 26 70 43 65 6c 6c  BY cell", &pCell
341c0 73 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  s.  );..  /* Loo
341d0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 72  p through each r
341e0 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 73  oot page. */.  s
341f0 68 65 6c 6c 50 72 65 70 61 72 65 28 70 53 74 61  hellPrepare(pSta
34200 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 0a 20 20  te->db, &rc, .  
34210 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 6f 74      "SELECT root
34220 2c 20 69 6e 74 6b 65 79 2c 20 6d 61 78 28 6d 61  , intkey, max(ma
34230 78 6c 65 6e 29 20 46 52 4f 4d 20 72 65 63 6f 76  xlen) FROM recov
34240 65 72 79 2e 6d 61 70 22 20 0a 20 20 20 20 20 20  ery.map" .      
34250 22 20 57 48 45 52 45 20 72 6f 6f 74 3e 31 20 47  " WHERE root>1 G
34260 52 4f 55 50 20 42 59 20 72 6f 6f 74 2c 20 69 6e  ROUP BY root, in
34270 74 6b 65 79 20 4f 52 44 45 52 20 42 59 20 72 6f  tkey ORDER BY ro
34280 6f 74 3d 28 22 0a 20 20 20 20 20 20 22 20 20 53  ot=(".      "  S
34290 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46  ELECT rootpage F
342a0 52 4f 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68  ROM recovery.sch
342b0 65 6d 61 20 57 48 45 52 45 20 6e 61 6d 65 3d 27  ema WHERE name='
342c0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27  sqlite_sequence'
342d0 22 0a 20 20 20 20 20 20 22 29 22 2c 20 26 70 4c  ".      ")", &pL
342e0 6f 6f 70 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  oop.  );.  while
342f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34300 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
34310 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f  qlite3_step(pLoo
34320 70 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 52  p) ){.    int iR
34330 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  oot = sqlite3_co
34340 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20  lumn_int(pLoop, 
34350 30 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 6e 74  0);.    int bInt
34360 6b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  key = sqlite3_co
34370 6c 75 6d 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20  lumn_int(pLoop, 
34380 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c  1);.    int nCol
34390 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
343a0 6e 5f 69 6e 74 28 70 4c 6f 6f 70 2c 20 32 29 3b  n_int(pLoop, 2);
343b0 0a 20 20 20 20 69 6e 74 20 62 4e 6f 6f 70 20 3d  .    int bNoop =
343c0 20 30 3b 0a 20 20 20 20 52 65 63 6f 76 65 72 54   0;.    RecoverT
343d0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a 20 20 20  able *pTab;..   
343e0 20 61 73 73 65 72 74 28 20 62 49 6e 74 6b 65 79   assert( bIntkey
343f0 3d 3d 30 20 7c 7c 20 62 49 6e 74 6b 65 79 3d 3d  ==0 || bIntkey==
34400 31 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  1 );.    pTab = 
34410 72 65 63 6f 76 65 72 46 69 6e 64 54 61 62 6c 65  recoverFindTable
34420 28 70 53 74 61 74 65 2c 20 26 72 63 2c 20 69 52  (pState, &rc, iR
34430 6f 6f 74 2c 20 62 49 6e 74 6b 65 79 2c 20 6e 43  oot, bIntkey, nC
34440 6f 6c 2c 20 26 62 4e 6f 6f 70 29 3b 0a 20 20 20  ol, &bNoop);.   
34450 20 69 66 28 20 62 4e 6f 6f 70 20 7c 7c 20 72 63   if( bNoop || rc
34460 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
34470 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
34480 20 20 20 20 20 20 69 66 28 20 70 4f 72 70 68 61        if( pOrpha
34490 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
344a0 70 4f 72 70 68 61 6e 20 3d 20 72 65 63 6f 76 65  pOrphan = recove
344b0 72 4f 72 70 68 61 6e 54 61 62 6c 65 28 70 53 74  rOrphanTable(pSt
344c0 61 74 65 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41  ate, &rc, zLostA
344d0 6e 64 46 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e  ndFound, nOrphan
344e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
344f0 20 70 54 61 62 20 3d 20 70 4f 72 70 68 61 6e 3b   pTab = pOrphan;
34500 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
34510 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
34520 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  }..    if( 0==sq
34530 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 54  lite3_stricmp(pT
34540 61 62 2d 3e 7a 51 75 6f 74 65 64 2c 20 22 5c 22  ab->zQuoted, "\"
34550 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 5c  sqlite_sequence\
34560 22 22 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77  "") ){.      raw
34570 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  _printf(pState->
34580 6f 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f  out, "DELETE FRO
34590 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
345a0 65 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  e;\n");.    }.  
345b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
345c0 6e 74 28 70 50 61 67 65 73 2c 20 31 2c 20 69 52  nt(pPages, 1, iR
345d0 6f 6f 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oot);.    sqlite
345e0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
345f0 73 2c 20 32 2c 20 70 54 61 62 2d 3e 69 50 6b 29  s, 2, pTab->iPk)
34600 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  ;..    while( rc
34610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
34620 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
34630 65 33 5f 73 74 65 70 28 70 50 61 67 65 73 29 20  e3_step(pPages) 
34640 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67  ){.      int iPg
34650 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
34660 75 6d 6e 5f 69 6e 74 28 70 50 61 67 65 73 2c 20  umn_int(pPages, 
34670 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
34680 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 65 6c 6c  3_bind_int(pCell
34690 73 2c 20 31 2c 20 69 50 67 6e 6f 29 3b 0a 20 20  s, 1, iPgno);.  
346a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
346b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
346c0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
346d0 73 74 65 70 28 70 43 65 6c 6c 73 29 20 29 7b 0a  step(pCells) ){.
346e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 65          int nFie
346f0 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ld = sqlite3_col
34700 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73 2c 20  umn_int(pCells, 
34710 30 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  0);.        int 
34720 69 4d 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  iMin = sqlite3_c
34730 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 65 6c 6c 73  olumn_int(pCells
34740 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 2);.        co
34750 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  nst char *zVal =
34760 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
34770 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
34780 74 28 70 43 65 6c 6c 73 2c 20 31 29 3b 0a 0a 20  t(pCells, 1);.. 
34790 20 20 20 20 20 20 20 52 65 63 6f 76 65 72 54 61         RecoverTa
347a0 62 6c 65 20 2a 70 54 61 62 32 20 3d 20 70 54 61  ble *pTab2 = pTa
347b0 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
347c0 54 61 62 21 3d 70 4f 72 70 68 61 6e 20 26 26 20  Tab!=pOrphan && 
347d0 28 69 4d 69 6e 3c 30 29 21 3d 62 49 6e 74 6b 65  (iMin<0)!=bIntke
347e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
347f0 66 28 20 70 4f 72 70 68 61 6e 3d 3d 30 20 29 7b  f( pOrphan==0 ){
34800 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
34810 70 68 61 6e 20 3d 20 72 65 63 6f 76 65 72 4f 72  phan = recoverOr
34820 70 68 61 6e 54 61 62 6c 65 28 70 53 74 61 74 65  phanTable(pState
34830 2c 20 26 72 63 2c 20 7a 4c 6f 73 74 41 6e 64 46  , &rc, zLostAndF
34840 6f 75 6e 64 2c 20 6e 4f 72 70 68 61 6e 29 3b 0a  ound, nOrphan);.
34850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34860 20 20 20 20 20 20 70 54 61 62 32 20 3d 20 70 4f        pTab2 = pO
34870 72 70 68 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  rphan;.         
34880 20 69 66 28 20 70 54 61 62 32 3d 3d 30 20 29 20   if( pTab2==0 ) 
34890 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
348a0 0a 0a 20 20 20 20 20 20 20 20 6e 46 69 65 6c 64  ..        nField
348b0 20 3d 20 6e 46 69 65 6c 64 2b 31 3b 0a 20 20 20   = nField+1;.   
348c0 20 20 20 20 20 69 66 28 20 70 54 61 62 32 3d 3d       if( pTab2==
348d0 70 4f 72 70 68 61 6e 20 29 7b 0a 20 20 20 20 20  pOrphan ){.     
348e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
348f0 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a 20 20  pState->out, .  
34900 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
34910 45 52 54 20 49 4e 54 4f 20 25 73 20 56 41 4c 55  ERT INTO %s VALU
34920 45 53 28 25 64 2c 20 25 64 2c 20 25 64 2c 20 25  ES(%d, %d, %d, %
34930 73 25 73 25 73 29 3b 5c 6e 22 2c 0a 20 20 20 20  s%s%s);\n",.    
34940 20 20 20 20 20 20 20 20 20 20 70 54 61 62 32 2d            pTab2-
34950 3e 7a 51 75 6f 74 65 64 2c 20 69 52 6f 6f 74 2c  >zQuoted, iRoot,
34960 20 69 50 67 6e 6f 2c 20 6e 46 69 65 6c 64 2c 0a   iPgno, nField,.
34970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4d                iM
34980 69 6e 3c 30 20 3f 20 22 22 20 3a 20 22 4e 55 4c  in<0 ? "" : "NUL
34990 4c 2c 20 22 2c 20 7a 56 61 6c 2c 20 70 54 61 62  L, ", zVal, pTab
349a0 32 2d 3e 61 7a 6c 43 6f 6c 5b 6e 46 69 65 6c 64  2->azlCol[nField
349b0 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
349c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
349d0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
349e0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
349f0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 28  "INSERT INTO %s(
34a00 25 73 29 20 56 41 4c 55 45 53 28 20 25 73 20 29  %s) VALUES( %s )
34a10 3b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ;\n", .         
34a20 20 20 20 20 20 70 54 61 62 32 2d 3e 7a 51 75 6f       pTab2->zQuo
34a30 74 65 64 2c 20 70 54 61 62 32 2d 3e 61 7a 6c 43  ted, pTab2->azlC
34a40 6f 6c 5b 6e 46 69 65 6c 64 5d 2c 20 7a 56 61 6c  ol[nField], zVal
34a50 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
34a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34a70 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74        shellReset
34a80 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20  (&rc, pCells);. 
34a90 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 52 65     }.    shellRe
34aa0 73 65 74 28 26 72 63 2c 20 70 50 61 67 65 73 29  set(&rc, pPages)
34ab0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 21 3d  ;.    if( pTab!=
34ac0 70 4f 72 70 68 61 6e 20 29 20 72 65 63 6f 76 65  pOrphan ) recove
34ad0 72 46 72 65 65 54 61 62 6c 65 28 70 54 61 62 29  rFreeTable(pTab)
34ae0 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e  ;.  }.  shellFin
34af0 61 6c 69 7a 65 28 26 72 63 2c 20 70 4c 6f 6f 70  alize(&rc, pLoop
34b00 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  );.  shellFinali
34b10 7a 65 28 26 72 63 2c 20 70 50 61 67 65 73 29 3b  ze(&rc, pPages);
34b20 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
34b30 28 26 72 63 2c 20 70 43 65 6c 6c 73 29 3b 0a 20  (&rc, pCells);. 
34b40 20 72 65 63 6f 76 65 72 46 72 65 65 54 61 62 6c   recoverFreeTabl
34b50 65 28 70 4f 72 70 68 61 6e 29 3b 0a 0a 20 20 2f  e(pOrphan);..  /
34b60 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
34b70 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69 66  e schema */.  if
34b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34b90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
34ba0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
34bb0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
34bc0 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63  (pState->db, &rc
34bd0 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
34be0 43 54 20 73 71 6c 2c 20 6e 61 6d 65 20 46 52 4f  CT sql, name FRO
34bf0 4d 20 72 65 63 6f 76 65 72 79 2e 73 63 68 65 6d  M recovery.schem
34c00 61 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45  a ".        "WHE
34c10 52 45 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20  RE sql NOT LIKE 
34c20 27 63 72 65 61 74 65 20 74 61 62 6c 65 25 27 22  'create table%'"
34c30 2c 20 26 70 53 74 6d 74 0a 20 20 20 20 29 3b 0a  , &pStmt.    );.
34c40 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
34c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
34c60 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
34c70 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
34c80 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
34c90 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zSql = (const c
34ca0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
34cb0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
34cc0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  0);.      if( sq
34cd0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
34ce0 53 71 6c 2c 20 22 63 72 65 61 74 65 20 76 69 72  Sql, "create vir
34cf0 74 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20 20  t", 11)==0 ){.  
34d00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34d10 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
34d20 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
34d30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
34d40 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 63 68  , 1);.        ch
34d50 61 72 20 2a 7a 50 72 69 6e 74 20 3d 20 73 68 65  ar *zPrint = she
34d60 6c 6c 4d 50 72 69 6e 74 66 28 26 72 63 2c 20 0a  llMPrintf(&rc, .
34d70 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
34d80 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61  T INTO sqlite_ma
34d90 73 74 65 72 20 56 41 4c 55 45 53 28 27 74 61 62  ster VALUES('tab
34da0 6c 65 27 2c 20 25 51 2c 20 25 51 2c 20 30 2c 20  le', %Q, %Q, 0, 
34db0 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
34dc0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 53  zName, zName, zS
34dd0 71 6c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ql.        );.  
34de0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34df0 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25  (pState->out, "%
34e00 73 3b 5c 6e 22 2c 20 7a 50 72 69 6e 74 29 3b 0a  s;\n", zPrint);.
34e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
34e20 66 72 65 65 28 7a 50 72 69 6e 74 29 3b 0a 20 20  free(zPrint);.  
34e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34e40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 53     raw_printf(pS
34e50 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c  tate->out, "%s;\
34e60 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
34e70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65   }.    }.    she
34e80 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
34e90 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  pStmt);.  }..  i
34ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34eb0 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
34ec0 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
34ed0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
34ee0 5f 73 63 68 65 6d 61 20 3d 20 6f 66 66 3b 5c 6e  _schema = off;\n
34ef0 22 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  ");.    raw_prin
34f00 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20  tf(pState->out, 
34f10 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20  "COMMIT;\n");.  
34f20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  }.  sqlite3_exec
34f30 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 22 44 45  (pState->db, "DE
34f40 54 41 43 48 20 72 65 63 6f 76 65 72 79 22 2c 20  TACH recovery", 
34f50 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  0, 0, 0);.  retu
34f60 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
34f70 2f 2a 20 21 28 53 51 4c 49 54 45 5f 4f 4d 49 54  /* !(SQLITE_OMIT
34f80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
34f90 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
34fa0 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f 56  _ENABLE_DBPAGE_V
34fb0 54 41 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TAB) */.../*.** 
34fc0 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65  If an input line
34fd0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22   begins with "."
34fe0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69   then invoke thi
34ff0 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20  s routine to.** 
35000 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e  process that lin
35010 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
35020 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f  1 on error, 2 to
35030 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68   exit, and 0 oth
35040 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
35050 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f  c int do_meta_co
35060 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e  mmand(char *zLin
35070 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  e, ShellState *p
35080 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a  ){.  int h = 1;.
35090 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
350a0 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e    int n, c;.  in
350b0 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72  t rc = 0;.  char
350c0 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23 69   *azArg[50];..#i
350d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
350e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
350f0 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70   if( p->expert.p
35100 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78  Expert ){.    ex
35110 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c  pertFinish(p, 1,
35120 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
35130 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
35140 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20  input line into 
35150 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77  tokens..  */.  w
35160 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
35170 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65  & nArg<ArraySize
35180 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77  (azArg) ){.    w
35190 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
351a0 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20  ine[h]) ){ h++; 
351b0 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b  }.    if( zLine[
351c0 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  h]==0 ) break;. 
351d0 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
351e0 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68  ='\'' || zLine[h
351f0 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
35200 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e  int delim = zLin
35210 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a  e[h++];.      az
35220 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a  Arg[nArg++] = &z
35230 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77  Line[h];.      w
35240 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26  hile( zLine[h] &
35250 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69  & zLine[h]!=deli
35260 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
35270 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20   zLine[h]=='\\' 
35280 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26  && delim=='"' &&
35290 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29   zLine[h+1]!=0 )
352a0 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b   h++;.        h+
352b0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
352c0 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64   if( zLine[h]==d
352d0 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  elim ){.        
352e0 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a  zLine[h++] = 0;.
352f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35300 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72  ( delim=='"' ) r
35310 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
35320 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
35330 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35340 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
35350 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20  ] = &zLine[h];. 
35360 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
35370 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65  e[h] && !IsSpace
35380 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b  (zLine[h]) ){ h+
35390 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a  +; }.      if( z
353a0 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b  Line[h] ) zLine[
353b0 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  h++] = 0;.      
353c0 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
353d0 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
353e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
353f0 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
35400 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  input line..  */
35410 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
35420 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f   return 0; /* no
35430 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f   tokens, no erro
35440 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65  r */.  n = strle
35450 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n30(azArg[0]);. 
35460 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d   c = azArg[0][0]
35470 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c  ;.  clearTempFil
35480 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  e(p);..#ifndef S
35490 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
354a0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 63  RIZATION.  if( c
354b0 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70  =='a' && strncmp
354c0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74 68  (azArg[0], "auth
354d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
354e0 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20  if( nArg!=2 ){. 
354f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35500 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
35510 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22 29  .auth ON|OFF\n")
35520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
35530 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
35540 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
35550 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
35560 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  p, 0);.    if( b
35570 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
35580 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 73  g[1]) ){.      s
35590 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
355a0 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68 65  rizer(p->db, she
355b0 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20 20  llAuth, p);.    
355c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
355d0 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
355e0 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  zer(p->db, 0, 0)
355f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
35600 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
35610 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
35620 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
35630 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
35640 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69 66  _HAVE_ZLIB).  if
35650 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
35660 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
35670 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20 29  rchive", n)==0 )
35680 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
35690 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72   0);.    rc = ar
356a0 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30 2c  DotCommand(p, 0,
356b0 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20   azArg, nArg);. 
356c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
356d0 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26 20   if( (c=='b' && 
356e0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
356f0 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b 75  azArg[0], "backu
35700 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  p", n)==0).   ||
35710 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 33   (c=='s' && n>=3
35720 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35730 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e 29  g[0], "save", n)
35740 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f  ==0).  ){.    co
35750 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74 46  nst char *zDestF
35760 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ile = 0;.    con
35770 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  st char *zDb = 0
35780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  ;.    sqlite3 *p
35790 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dest;.    sqlite
357a0 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
357b0 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  p;.    int j;.  
357c0 20 20 69 6e 74 20 62 41 73 79 6e 63 20 3d 20 30    int bAsync = 0
357d0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
357e0 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20 20   *zVfs = 0;.    
357f0 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67 3b  for(j=1; j<nArg;
35800 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e   j++){.      con
35810 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
35820 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  rg[j];.      if(
35830 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
35840 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d        if( z[1]==
35850 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
35860 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
35870 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20 29   "-append")==0 )
35880 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66 73  {.          zVfs
35890 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20 20   = "apndvfs";.  
358a0 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
358b0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
358c0 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30 20 29  , "-async")==0 )
358d0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41 73 79  {.          bAsy
358e0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
358f0 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
35900 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
35910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
35920 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
35930 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b  s\n", azArg[j]);
35940 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
35950 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
35960 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
35970 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  DestFile==0 ){. 
35980 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
35990 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
359a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62     }else if( zDb
359b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
359c0 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a  Db = zDestFile;.
359d0 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
359e0 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
359f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35a00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35a10 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
35a20 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50 54 49  ackup ?DB? ?OPTI
35a30 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22  ONS? FILENAME\n"
35a40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
35a50 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
35a60 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73 74   }.    if( zDest
35a70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
35a80 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35a90 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49 4c  rr, "missing FIL
35aa0 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 6f  ENAME argument o
35ab0 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20  n .backup\n");. 
35ac0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
35ad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62     }.    if( zDb
35ae0 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61 69  ==0 ) zDb = "mai
35af0 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  n";.    rc = sql
35b00 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 65  ite3_open_v2(zDe
35b10 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c 20  stFile, &pDest, 
35b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35b30 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
35b40 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
35b50 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56 66  OPEN_CREATE, zVf
35b60 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
35b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35b80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
35b90 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
35ba0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
35bb0 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29  "\n", zDestFile)
35bc0 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64 62  ;.      close_db
35bd0 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72  (pDest);.      r
35be0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
35bf0 20 20 20 69 66 28 20 62 41 73 79 6e 63 20 29 7b     if( bAsync ){
35c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
35c10 78 65 63 28 70 44 65 73 74 2c 20 22 50 52 41 47  xec(pDest, "PRAG
35c20 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f  MA synchronous=O
35c30 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  FF; PRAGMA journ
35c40 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c 0a 20  al_mode=OFF;",. 
35c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c60 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20    0, 0, 0);.    
35c70 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
35c80 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
35c90 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
35ca0 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
35cb0 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62  ain", p->db, zDb
35cc0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
35cd0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
35ce0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35cf0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
35d00 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
35d10 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
35d20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b  close_db(pDest);
35d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
35d40 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
35d50 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  (  (rc = sqlite3
35d60 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
35d70 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
35d80 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73 71  TE_OK ){}.    sq
35d90 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69 6e  lite3_backup_fin
35da0 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20 20  ish(pBackup);.  
35db0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35dc0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 72  _DONE ){.      r
35dd0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
35de0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
35df0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
35e00 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
35e10 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74 29  e3_errmsg(pDest)
35e20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
35e30 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65  .    }.    close
35e40 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  _db(pDest);.  }e
35e50 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
35e60 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
35e70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
35e80 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
35e90 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
35ea0 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
35eb0 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
35ec0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
35ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35ee0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35ef0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
35f00 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  il on|off\n");. 
35f10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
35f20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
35f30 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
35f40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
35f50 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20  g[0], "binary", 
35f60 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
35f70 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
35f80 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
35f90 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
35fa0 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72          setBinar
35fb0 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
35fc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35fd0 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f         setTextMo
35fe0 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
35ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36000 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
36010 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
36020 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66  e: .binary on|of
36030 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
36040 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
36050 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
36060 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
36070 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a  [0],"cd")==0 ){.
36080 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
36090 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
360a0 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
360b0 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77  d(WIN32).      w
360c0 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
360d0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
360e0 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b  o_unicode(azArg[
360f0 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
36100 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63  !SetCurrentDirec
36110 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20  toryW(z);.      
36120 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
36130 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
36140 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d  = chdir(azArg[1]
36150 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
36160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
36170 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36180 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68  derr, "Cannot ch
36190 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
361a0 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  y \"%s\"\n", azA
361b0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
361c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
361d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
361e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
361f0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20  rr, "Usage: .cd 
36200 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20  DIRECTORY\n");. 
36210 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36220 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
36230 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
36240 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
36250 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
36260 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
36270 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
36280 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
36290 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
362a0 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
362b0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
362c0 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
362d0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
362e0 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
362f0 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
36300 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
36310 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
36320 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
36330 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
36340 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
36350 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
36360 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
36370 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
36380 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
36390 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
363a0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
363b0 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
363c0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
363d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
363e0 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
363f0 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
36400 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
36410 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
36420 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
36430 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
36440 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
36450 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
36460 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
36470 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
36480 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
36490 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
364a0 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
364b0 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
364c0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
364d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
364e0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
364f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
36500 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
36510 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
36520 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
36530 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
36540 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36550 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
36560 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
36570 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
36580 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
36590 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
365a0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
365b0 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
365c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
365d0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
365e0 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
365f0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
36600 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
36610 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
36620 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
36630 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
36640 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
36650 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
36660 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
36670 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
36680 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
36690 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
366a0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
366b0 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
366c0 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
366d0 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
366e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
366f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36700 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
36710 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
36720 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
36730 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
36740 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
36750 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
36760 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
36770 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
36780 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
36790 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
367a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
367b0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
367c0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
367d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
367e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
367f0 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
36800 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
36810 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
36820 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
36830 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
36840 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36850 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
36860 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
36870 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
36880 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
36890 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
368a0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
368b0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
368c0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
368d0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
368e0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
368f0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
36900 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
36910 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
36920 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
36930 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
36940 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
36950 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
36960 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
36970 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
36980 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
36990 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
369a0 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
369c0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
369d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
369e0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
369f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36a00 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
36a10 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
36a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
36a30 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
36a40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
36a50 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
36a60 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26  c=='d' && n>=3 &
36a70 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
36a80 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c 20  0], "dbconfig", 
36a90 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
36aa0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
36ab0 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65 73   DbConfigChoices
36ac0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
36ad0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
36ae0 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 7d 20    int op;.    } 
36af0 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a  aDbConfig[] = {.
36b00 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62 6c          { "enabl
36b10 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20 20 20  e_fkey",        
36b20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
36b30 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20  ENABLE_FKEY     
36b40 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
36b50 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67 67   { "enable_trigg
36b60 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  er",     SQLITE_
36b70 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
36b80 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20 7d  TRIGGER        }
36b90 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73  ,.        { "fts
36ba0 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20  3_tokenizer",   
36bb0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
36bc0 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
36bd0 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20 20  KENIZER },.     
36be0 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e     { "load_exten
36bf0 73 69 6f 6e 22 2c 20 20 20 20 20 53 51 4c 49 54  sion",     SQLIT
36c00 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
36c10 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
36c20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e   },.        { "n
36c30 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22  o_ckpt_on_close"
36c40 2c 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ,   SQLITE_DBCON
36c50 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43  FIG_NO_CKPT_ON_C
36c60 4c 4f 53 45 20 20 20 20 20 20 7d 2c 0a 20 20 20  LOSE      },.   
36c70 20 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71       { "enable_q
36c80 70 73 67 22 2c 20 20 20 20 20 20 20 20 53 51 4c  psg",        SQL
36c90 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
36ca0 42 4c 45 5f 51 50 53 47 20 20 20 20 20 20 20 20  BLE_QPSG        
36cb0 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
36cc0 22 74 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20  "trigger_eqp",  
36cd0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
36ce0 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
36cf0 50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  P           },. 
36d00 20 20 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f         { "reset_
36d10 64 61 74 61 62 61 73 65 22 2c 20 20 20 20 20 53  database",     S
36d20 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 52  QLITE_DBCONFIG_R
36d30 45 53 45 54 5f 44 41 54 41 42 41 53 45 20 20 20  ESET_DATABASE   
36d40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
36d50 7b 20 22 64 65 66 65 6e 73 69 76 65 22 2c 20 20  { "defensive",  
36d60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
36d70 42 43 4f 4e 46 49 47 5f 44 45 46 45 4e 53 49 56  BCONFIG_DEFENSIV
36d80 45 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  E             },
36d90 0a 20 20 20 20 20 20 20 20 7b 20 22 77 72 69 74  .        { "writ
36da0 61 62 6c 65 5f 73 63 68 65 6d 61 22 2c 20 20 20  able_schema",   
36db0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
36dc0 5f 57 52 49 54 41 42 4c 45 5f 53 43 48 45 4d 41  _WRITABLE_SCHEMA
36dd0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
36de0 20 20 7b 20 22 6c 65 67 61 63 79 5f 61 6c 74 65    { "legacy_alte
36df0 72 5f 74 61 62 6c 65 22 2c 20 53 51 4c 49 54 45  r_table", SQLITE
36e00 5f 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59  _DBCONFIG_LEGACY
36e10 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 20 20 20  _ALTER_TABLE    
36e20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64 71  },.        { "dq
36e30 73 5f 64 6d 6c 22 2c 20 20 20 20 20 20 20 20 20  s_dml",         
36e40 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
36e50 49 47 5f 44 51 53 5f 44 4d 4c 20 20 20 20 20 20  IG_DQS_DML      
36e60 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
36e70 20 20 20 20 7b 20 22 64 71 73 5f 64 64 6c 22 2c      { "dqs_ddl",
36e80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
36e90 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f  TE_DBCONFIG_DQS_
36ea0 44 44 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  DDL             
36eb0 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
36ec0 69 6e 74 20 69 69 2c 20 76 3b 0a 20 20 20 20 6f  int ii, v;.    o
36ed0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
36ee0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 41    for(ii=0; ii<A
36ef0 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e 66  rraySize(aDbConf
36f00 69 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ig); ii++){.    
36f10 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
36f20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
36f30 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 7a   aDbConfig[ii].z
36f40 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  Name)!=0 ) conti
36f50 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
36f60 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
36f70 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
36f80 66 69 67 28 70 2d 3e 64 62 2c 20 61 44 62 43 6f  fig(p->db, aDbCo
36f90 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c 20 62 6f 6f  nfig[ii].op, boo
36fa0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
36fb0 32 5d 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  2]), 0);.      }
36fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
36fd0 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
36fe0 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70  aDbConfig[ii].op
36ff0 2c 20 2d 31 2c 20 26 76 29 3b 0a 20 20 20 20 20  , -1, &v);.     
37000 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
37010 6f 75 74 2c 20 22 25 31 38 73 20 25 73 5c 6e 22  out, "%18s %s\n"
37020 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e  , aDbConfig[ii].
37030 7a 4e 61 6d 65 2c 20 76 20 3f 20 22 6f 6e 22 20  zName, v ? "on" 
37040 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20 20 20  : "off");.      
37050 69 66 28 20 6e 41 72 67 3e 31 20 29 20 62 72 65  if( nArg>1 ) bre
37060 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
37070 28 20 6e 41 72 67 3e 31 20 26 26 20 69 69 3d 3d  ( nArg>1 && ii==
37080 41 72 72 61 79 53 69 7a 65 28 61 44 62 43 6f 6e  ArraySize(aDbCon
37090 66 69 67 29 20 29 7b 0a 20 20 20 20 20 20 75 74  fig) ){.      ut
370a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
370b0 2c 20 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77  , "Error: unknow
370c0 6e 20 64 62 63 6f 6e 66 69 67 20 5c 22 25 73 5c  n dbconfig \"%s\
370d0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
370e0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
370f0 74 66 28 73 74 64 65 72 72 2c 20 22 45 6e 74 65  tf(stderr, "Ente
37100 72 20 5c 22 2e 64 62 63 6f 6e 66 69 67 5c 22 20  r \".dbconfig\" 
37110 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
37120 73 20 66 6f 72 20 61 20 6c 69 73 74 5c 6e 22 29  s for a list\n")
37130 3b 0a 20 20 20 20 7d 20 20 20 0a 20 20 7d 65 6c  ;.    }   .  }el
37140 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
37150 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
37160 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64  cmp(azArg[0], "d
37170 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  binfo", n)==0 ){
37180 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
37190 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70  dbinfo_command(p
371a0 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a  , nArg, azArg);.
371b0 20 20 7d 65 6c 73 65 0a 0a 23 69 66 20 21 64 65    }else..#if !de
371c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
371d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
371e0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
371f0 45 5f 45 4e 41 42 4c 45 5f 44 42 50 41 47 45 5f  E_ENABLE_DBPAGE_
37200 56 54 41 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  VTAB).  if( c=='
37210 72 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  r' && strncmp(az
37220 41 72 67 5b 30 5d 2c 20 22 72 65 63 6f 76 65 72  Arg[0], "recover
37230 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
37240 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
37250 20 20 20 72 63 20 3d 20 72 65 63 6f 76 65 72 44     rc = recoverD
37260 61 74 61 62 61 73 65 43 6d 64 28 70 2c 20 6e 41  atabaseCmd(p, nA
37270 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65  rg, azArg);.  }e
37280 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 28  lse.#endif /* !(
37290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
372a0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
372b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
372c0 4c 45 5f 44 42 50 41 47 45 5f 56 54 41 42 29 20  LE_DBPAGE_VTAB) 
372d0 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  */..  if( c=='d'
372e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
372f0 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29  g[0], "dump", n)
37300 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
37310 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
37320 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
37330 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65   int savedShowHe
37340 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  ader = p->showHe
37350 61 64 65 72 3b 0a 20 20 20 20 69 6e 74 20 73 61  ader;.    int sa
37360 76 65 64 53 68 65 6c 6c 46 6c 61 67 73 20 3d 20  vedShellFlags = 
37370 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 3b 0a 20 20  p->shellFlgs;.  
37380 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67    ShellClearFlag
37390 28 70 2c 20 53 48 46 4c 47 5f 50 72 65 73 65 72  (p, SHFLG_Preser
373a0 76 65 52 6f 77 69 64 7c 53 48 46 4c 47 5f 4e 65  veRowid|SHFLG_Ne
373b0 77 6c 69 6e 65 73 7c 53 48 46 4c 47 5f 45 63 68  wlines|SHFLG_Ech
373c0 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  o);.    for(i=1;
373d0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
373e0 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
373f0 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
37400 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
37410 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
37420 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
37430 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
37440 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
37450 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
37460 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
37470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
37480 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
37490 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
374a0 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
374b0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
374c0 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
374d0 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
374e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374f0 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
37500 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
37510 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
37520 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
37530 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
37540 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
37550 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
37560 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
37570 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
37580 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
37590 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
375a0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
375b0 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
375c0 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
375d0 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
375e0 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
375f0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
37600 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
37610 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
37620 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
37630 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
37640 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
37650 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
37660 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
37670 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
37680 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
37690 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
376a0 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
376b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
376c0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
376d0 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
376e0 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37700 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
37710 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
37720 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
37730 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
37740 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
37750 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
37760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
37770 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
37780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
37790 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
377a0 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c  ..    /* When pl
377b0 61 79 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75  aying back a "du
377c0 6d 70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  mp", the content
377d0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
377e0 20 61 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a   an order.    **
377f0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 69 6d   which causes im
37800 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
37810 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
37820 74 6f 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a  to be violated..
37830 20 20 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c      ** So disabl
37840 65 20 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f  e foreign-key co
37850 6e 73 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65  nstraint enforce
37860 6d 65 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20  ment to prevent 
37870 70 72 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20  problems. */.   
37880 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
37890 75 74 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65  ut, "PRAGMA fore
378a0 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22  ign_keys=OFF;\n"
378b0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
378c0 66 28 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e  f(p->out, "BEGIN
378d0 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22   TRANSACTION;\n"
378e0 29 3b 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62  );.    p->writab
378f0 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  leSchema = 0;.  
37900 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20    p->showHeader 
37910 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20  = 0;.    /* Set 
37920 77 72 69 74