/ Hex Artifact Content
Login

Artifact 01c0cc01391d00d247fdf640052d38c267fc16d975bc4f3154a02277c232dbeb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64  ile contains cod
0190: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
01a0: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
01b0: 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20 75 74 69 6c  and line.** util
01c0: 69 74 79 20 66 6f 72 20 61 63 63 65 73 73 69 6e  ity for accessin
01d0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
01e0: 65 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  es..*/.#if (defi
01f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0200: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20 26  efined(WIN32)) &
0210: 26 20 21 64 65 66 69 6e 65 64 28 5f 43 52 54 5f  & !defined(_CRT_
0220: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0230: 47 53 29 0a 2f 2a 20 54 68 69 73 20 6e 65 65 64  GS)./* This need
0240: 73 20 74 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65  s to come before
0250: 20 61 6e 79 20 69 6e 63 6c 75 64 65 73 20 66 6f   any includes fo
0260: 72 20 4d 53 56 43 20 63 6f 6d 70 69 6c 65 72 20  r MSVC compiler 
0270: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 43 52 54 5f  */.#define _CRT_
0280: 53 45 43 55 52 45 5f 4e 4f 5f 57 41 52 4e 49 4e  SECURE_NO_WARNIN
0290: 47 53 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  GS.#endif../*.**
02a0: 20 57 61 72 6e 69 6e 67 20 70 72 61 67 6d 61 73   Warning pragmas
02b0: 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 6d 73 76   copied from msv
02c0: 63 2e 68 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  c.h in the core.
02d0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
02e0: 5f 4d 53 43 5f 56 45 52 29 0a 23 70 72 61 67 6d  _MSC_VER).#pragm
02f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0300: 65 20 3a 20 34 30 35 34 29 0a 23 70 72 61 67 6d  e : 4054).#pragm
0310: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0320: 65 20 3a 20 34 30 35 35 29 0a 23 70 72 61 67 6d  e : 4055).#pragm
0330: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0340: 65 20 3a 20 34 31 30 30 29 0a 23 70 72 61 67 6d  e : 4100).#pragm
0350: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0360: 65 20 3a 20 34 31 32 37 29 0a 23 70 72 61 67 6d  e : 4127).#pragm
0370: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0380: 65 20 3a 20 34 31 33 30 29 0a 23 70 72 61 67 6d  e : 4130).#pragm
0390: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03a0: 65 20 3a 20 34 31 35 32 29 0a 23 70 72 61 67 6d  e : 4152).#pragm
03b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03c0: 65 20 3a 20 34 31 38 39 29 0a 23 70 72 61 67 6d  e : 4189).#pragm
03d0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
03e0: 65 20 3a 20 34 32 30 36 29 0a 23 70 72 61 67 6d  e : 4206).#pragm
03f0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0400: 65 20 3a 20 34 32 31 30 29 0a 23 70 72 61 67 6d  e : 4210).#pragm
0410: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0420: 65 20 3a 20 34 32 33 32 29 0a 23 70 72 61 67 6d  e : 4232).#pragm
0430: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0440: 65 20 3a 20 34 32 34 34 29 0a 23 70 72 61 67 6d  e : 4244).#pragm
0450: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0460: 65 20 3a 20 34 33 30 35 29 0a 23 70 72 61 67 6d  e : 4305).#pragm
0470: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
0480: 65 20 3a 20 34 33 30 36 29 0a 23 70 72 61 67 6d  e : 4306).#pragm
0490: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04a0: 65 20 3a 20 34 37 30 32 29 0a 23 70 72 61 67 6d  e : 4702).#pragm
04b0: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c  a warning(disabl
04c0: 65 20 3a 20 34 37 30 36 29 0a 23 65 6e 64 69 66  e : 4706).#endif
04d0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   /* defined(_MSC
04e0: 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VER) */../*.** 
04f0: 4e 6f 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  No support for l
0500: 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
0510: 6e 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ns in VxWorks..*
0520: 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  /.#if (defined(_
0530: 5f 52 54 50 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  _RTP__) || defin
0540: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 29  ed(_WRS_KERNEL))
0550: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   && !SQLITE_OMIT
0560: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
0570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0580: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0590: 49 4f 4e 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ION 1.#endif../*
05a0: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c 61 72 67 65  .** Enable large
05b0: 2d 66 69 6c 65 20 73 75 70 70 6f 72 74 20 66 6f  -file support fo
05c0: 72 20 66 6f 70 65 6e 28 29 20 61 6e 64 20 66 72  r fopen() and fr
05d0: 69 65 6e 64 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  iends on unix..*
05e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
05f0: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64  _DISABLE_LFS.# d
0600: 65 66 69 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c  efine _LARGE_FIL
0610: 45 20 20 20 20 20 20 20 31 0a 23 20 69 66 6e 64  E       1.# ifnd
0620: 65 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ef _FILE_OFFSET_
0630: 42 49 54 53 0a 23 20 20 20 64 65 66 69 6e 65 20  BITS.#   define 
0640: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0650: 53 20 36 34 0a 23 20 65 6e 64 69 66 0a 23 20 64  S 64.# endif.# d
0660: 65 66 69 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45  efine _LARGEFILE
0670: 5f 53 4f 55 52 43 45 20 31 0a 23 65 6e 64 69 66  _SOURCE 1.#endif
0680: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ..#include <stdl
0690: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
06a0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
06b0: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
06c0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06d0: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
06e0: 65 33 2e 68 22 0a 74 79 70 65 64 65 66 20 73 71  e3.h".typedef sq
06f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b  lite3_int64 i64;
0700: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0710: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0720: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0730: 61 72 20 75 38 3b 0a 23 69 66 20 53 51 4c 49 54  ar u8;.#if SQLIT
0740: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
0750: 41 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20  ATION.# include 
0760: 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
0770: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c  .h".#endif.#incl
0780: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0790: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
07a0: 3e 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  >..#if !defined(
07b0: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
07c0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63  ned(WIN32).# inc
07d0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
07e0: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
07f0: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0800: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0810: 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e  #  include <pwd.
0820: 68 3e 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  h>.# endif.#endi
0830: 66 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  f.#if (!defined(
0840: 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  _WIN32) && !defi
0850: 6e 65 64 28 57 49 4e 33 32 29 29 20 7c 7c 20 64  ned(WIN32)) || d
0860: 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32  efined(__MINGW32
0870: 5f 5f 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  __).# include <u
0880: 6e 69 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75  nistd.h>.# inclu
0890: 64 65 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20  de <dirent.h>.# 
08a0: 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67 65  define GETPID ge
08b0: 74 70 69 64 0a 23 20 69 66 20 64 65 66 69 6e 65  tpid.# if define
08c0: 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 0a 23  d(__MINGW32__).#
08d0: 20 20 64 65 66 69 6e 65 20 44 49 52 45 4e 54 20    define DIRENT 
08e0: 64 69 72 65 6e 74 0a 23 20 20 69 66 6e 64 65 66  dirent.#  ifndef
08f0: 20 53 5f 49 53 4c 4e 4b 0a 23 20 20 20 64 65 66   S_ISLNK.#   def
0900: 69 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  ine S_ISLNK(mode
0910: 29 20 28 30 29 0a 23 20 20 65 6e 64 69 66 0a 23  ) (0).#  endif.#
0920: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
0930: 65 66 69 6e 65 20 47 45 54 50 49 44 20 28 69 6e  efine GETPID (in
0940: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
0950: 65 73 73 49 64 0a 23 65 6e 64 69 66 0a 23 69 6e  essId.#endif.#in
0960: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0970: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0980: 73 2f 73 74 61 74 2e 68 3e 0a 0a 23 69 66 20 48  s/stat.h>..#if H
0990: 41 56 45 5f 52 45 41 44 4c 49 4e 45 0a 23 20 69  AVE_READLINE.# i
09a0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09b0: 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 20 69  /readline.h>.# i
09c0: 6e 63 6c 75 64 65 20 3c 72 65 61 64 6c 69 6e 65  nclude <readline
09d0: 2f 68 69 73 74 6f 72 79 2e 68 3e 0a 23 65 6e 64  /history.h>.#end
09e0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09f0: 54 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  TLINE.# include 
0a00: 3c 65 64 69 74 6c 69 6e 65 2f 72 65 61 64 6c 69  <editline/readli
0a10: 6e 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ne.h>.#endif..#i
0a20: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 20  f HAVE_EDITLINE 
0a30: 7c 7c 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  || HAVE_READLINE
0a40: 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ..# define shell
0a50: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0a60: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  add_history(X).#
0a70: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65   define shell_re
0a80: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20 72 65  ad_history(X) re
0a90: 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20  ad_history(X).# 
0aa0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0ab0: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 77 72  te_history(X) wr
0ac0: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0ad0: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0ae0: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 20  ifle_history(X) 
0af0: 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58  stifle_history(X
0b00: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b10: 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 72 65 61  _readline(X) rea
0b20: 64 6c 69 6e 65 28 58 29 0a 0a 23 65 6c 69 66 20  dline(X)..#elif 
0b30: 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 0a  HAVE_LINENOISE..
0b40: 23 20 69 6e 63 6c 75 64 65 20 22 6c 69 6e 65 6e  # include "linen
0b50: 6f 69 73 65 2e 68 22 0a 23 20 64 65 66 69 6e 65  oise.h".# define
0b60: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0b70: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b80: 69 73 74 6f 72 79 41 64 64 28 58 29 0a 23 20 64  istoryAdd(X).# d
0b90: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64  efine shell_read
0ba0: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0bb0: 6e 6f 69 73 65 48 69 73 74 6f 72 79 4c 6f 61 64  noiseHistoryLoad
0bc0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0bd0: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0be0: 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73  (X) linenoiseHis
0bf0: 74 6f 72 79 53 61 76 65 28 58 29 0a 23 20 64 65  torySave(X).# de
0c00: 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c  fine shell_stifl
0c10: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0c20: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 65 74  enoiseHistorySet
0c30: 4d 61 78 4c 65 6e 28 58 29 0a 23 20 64 65 66 69  MaxLen(X).# defi
0c40: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e  ne shell_readlin
0c50: 65 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 28 58  e(X) linenoise(X
0c60: 29 0a 0a 23 65 6c 73 65 0a 0a 23 20 64 65 66 69  )..#else..# defi
0c70: 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69  ne shell_read_hi
0c80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0c90: 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69  e shell_write_hi
0ca0: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0cb0: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0cc0: 69 73 74 6f 72 79 28 58 29 0a 0a 23 20 64 65 66  istory(X)..# def
0cd0: 69 6e 65 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f  ine SHELL_USE_LO
0ce0: 43 41 4c 5f 47 45 54 4c 49 4e 45 20 31 0a 23 65  CAL_GETLINE 1.#e
0cf0: 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65 66 69 6e  ndif...#if defin
0d00: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
0d10: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 69  fined(WIN32).# i
0d20: 6e 63 6c 75 64 65 20 3c 69 6f 2e 68 3e 0a 23 20  nclude <io.h>.# 
0d30: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
0d40: 3e 0a 23 20 64 65 66 69 6e 65 20 69 73 61 74 74  >.# define isatt
0d50: 79 28 68 29 20 5f 69 73 61 74 74 79 28 68 29 0a  y(h) _isatty(h).
0d60: 23 20 69 66 6e 64 65 66 20 61 63 63 65 73 73 0a  # ifndef access.
0d70: 23 20 20 64 65 66 69 6e 65 20 61 63 63 65 73 73  #  define access
0d80: 28 66 2c 6d 29 20 5f 61 63 63 65 73 73 28 28 66  (f,m) _access((f
0d90: 29 2c 28 6d 29 29 0a 23 20 65 6e 64 69 66 0a 23  ),(m)).# endif.#
0da0: 20 69 66 6e 64 65 66 20 75 6e 6c 69 6e 6b 0a 23   ifndef unlink.#
0db0: 20 20 64 65 66 69 6e 65 20 75 6e 6c 69 6e 6b 20    define unlink 
0dc0: 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e 64 69 66 0a  _unlink.# endif.
0dd0: 23 20 69 66 6e 64 65 66 20 73 74 72 64 75 70 0a  # ifndef strdup.
0de0: 23 20 20 64 65 66 69 6e 65 20 73 74 72 64 75 70  #  define strdup
0df0: 20 5f 73 74 72 64 75 70 0a 23 20 65 6e 64 69 66   _strdup.# endif
0e00: 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e 0a 23  .# undef popen.#
0e10: 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20 5f 70   define popen _p
0e20: 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70 63 6c  open.# undef pcl
0e30: 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70 63 6c  ose.# define pcl
0e40: 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65 6c 73  ose _pclose.#els
0e50: 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  e. /* Make sure 
0e60: 69 73 61 74 74 79 28 29 20 68 61 73 20 61 20 70  isatty() has a p
0e70: 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20 65 78  rototype. */. ex
0e80: 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74 79 28  tern int isatty(
0e90: 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64 65 66  int);..# if !def
0ea0: 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26  ined(__RTP__) &&
0eb0: 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b   !defined(_WRS_K
0ec0: 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f 70 65  ERNEL).  /* pope
0ed0: 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61 72 65  n and pclose are
0ee0: 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74 69 6f   not C89 functio
0ef0: 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a 20 20  ns and so are.  
0f00: 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f 6d 69  ** sometimes omi
0f10: 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 3c 73  tted from the <s
0f20: 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72 20 2a  tdio.h> header *
0f30: 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49 4c 45  /.   extern FILE
0f40: 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68   *popen(const ch
0f50: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
0f60: 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ;.   extern int 
0f70: 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b 0a 23  pclose(FILE*);.#
0f80: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
0f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
0fa0: 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  N 1.# endif.#end
0fb0: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
0fc0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 20 57  _WIN32_WCE)./* W
0fd0: 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d 2d 77  indows CE (arm-w
0fe0: 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67  ince-mingw32ce-g
0ff0: 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f  cc) does not pro
1000: 76 69 64 65 20 69 73 61 74 74 79 28 29 0a 20 2a  vide isatty(). *
1010: 20 74 68 75 73 20 77 65 20 61 6c 77 61 79 73 20   thus we always 
1020: 61 73 73 75 6d 65 20 74 68 61 74 20 77 65 20 68  assume that we h
1030: 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e 20 54  ave a console. T
1040: 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20 6f 76  hat can be. * ov
1050: 65 72 72 69 64 64 65 6e 20 77 69 74 68 20 74 68  erridden with th
1060: 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61 6e 64  e -batch command
1070: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 20 2a   line option.. *
1080: 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74 74 79  /.#define isatty
1090: 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 1.#endif../*
10a0: 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20 74 68   ctype macros th
10b0: 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73 69 67  at work with sig
10c0: 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 2a  ned characters *
10d0: 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70 61 63  /.#define IsSpac
10e0: 65 28 58 29 20 20 69 73 73 70 61 63 65 28 28 75  e(X)  isspace((u
10f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
1100: 23 64 65 66 69 6e 65 20 49 73 44 69 67 69 74 28  #define IsDigit(
1110: 58 29 20 20 69 73 64 69 67 69 74 28 28 75 6e 73  X)  isdigit((uns
1120: 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a 23 64  igned char)X).#d
1130: 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28 58 29  efine ToLower(X)
1140: 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65 72 28    (char)tolower(
1150: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1160: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
1170: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1180: 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c 75 64  d(WIN32).#includ
1190: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 0a 2f  e <windows.h>../
11a0: 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65 72 73  * string convers
11b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f 6e 6c  ion routines onl
11c0: 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 33  y needed on Win3
11d0: 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68 61 72  2 */.extern char
11e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
11f0: 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28  unicode_to_utf8(
1200: 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65 72 6e  LPCWSTR);.extern
1210: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77   char *sqlite3_w
1220: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
1230: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
1240: 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20  *, int);.extern 
1250: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1260: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
1270: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
1280: 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e 20 4c  , int);.extern L
1290: 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69  PWSTR sqlite3_wi
12a0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
12b0: 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ode(const char *
12c0: 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  zText);.#endif..
12d0: 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c 20 77  /* On Windows, w
12e0: 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e 20 77  e normally run w
12f0: 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ith output mode 
1300: 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61 74 20  of TEXT so that 
1310: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  \n characters.**
1320: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
1330: 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  ly translated in
1340: 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65 76 65  to \r\n.  Howeve
1350: 72 2c 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  r, this behavior
1360: 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62 65 20   needs.** to be 
1370: 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f 6d 65  disabled in some
1380: 20 63 61 73 65 73 20 28 65 78 3a 20 77 68 65 6e   cases (ex: when
1390: 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53 56 20   generating CSV 
13a0: 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65 6e 0a  output and when.
13b0: 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71 75 6f  ** rendering quo
13c0: 74 65 64 20 73 74 72 69 6e 67 73 20 74 68 61 74  ted strings that
13d0: 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68 61 72   contain \n char
13e0: 61 63 74 65 72 73 29 2e 20 20 54 68 65 20 66 6f  acters).  The fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
1400: 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20 6f 66  nes take care of
1410: 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20 64 65   that..*/.#if de
1420: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
1430: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
1440: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 42  static void setB
1450: 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45 20 2a  inaryMode(FILE *
1460: 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70  file, int isOutp
1470: 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74  ut){.  if( isOut
1480: 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c  put ) fflush(fil
1490: 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f  e);.  _setmode(_
14a0: 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f  fileno(file), _O
14b0: 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74 61 74  _BINARY);.}.stat
14c0: 69 63 20 76 6f 69 64 20 73 65 74 54 65 78 74 4d  ic void setTextM
14d0: 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20  ode(FILE *file, 
14e0: 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20  int isOutput){. 
14f0: 20 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20   if( isOutput ) 
1500: 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20  fflush(file);.  
1510: 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f  _setmode(_fileno
1520: 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58 54 29  (file), _O_TEXT)
1530: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1540: 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  ne setBinaryMode
1550: 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65 20 73  (X,Y).# define s
1560: 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59 29 0a  etTextMode(X,Y).
1570: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72 75 65  #endif.../* True
1580: 20 69 66 20 74 68 65 20 74 69 6d 65 72 20 69 73   if the timer is
1590: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
15a0: 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54 69 6d  ic int enableTim
15b0: 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65 74 75  er = 0;../* Retu
15c0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
15d0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
15e0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
15f0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1600: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1610: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1620: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1630: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1640: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1650: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1660: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1670: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1680: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1690: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
16a0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
16b0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
16c0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
16d0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
16e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16f0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1700: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1710: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1720: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1730: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1740: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1750: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 23 69   return t;.}..#i
1760: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
1770: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 57  2) && !defined(W
1780: 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
1790: 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e 63 6c  d(__minux).#incl
17a0: 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e  ude <sys/time.h>
17b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72  .#include <sys/r
17c0: 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a 20 56  esource.h>../* V
17d0: 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f 74 20  xWorks does not 
17e0: 73 75 70 70 6f 72 74 20 67 65 74 72 75 73 61 67  support getrusag
17f0: 65 28 29 20 61 73 20 66 61 72 20 61 73 20 77 65  e() as far as we
1800: 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 2a   can determine *
1810: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1820: 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20 64 65  RS_KERNEL) || de
1830: 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 0a 73  fined(__RTP__).s
1840: 74 72 75 63 74 20 72 75 73 61 67 65 20 7b 0a 20  truct rusage {. 
1850: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
1860: 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75 73 65  ru_utime; /* use
1870: 72 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20  r CPU time used 
1880: 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  */.  struct time
1890: 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20 2f 2a  val ru_stime; /*
18a0: 20 73 79 73 74 65 6d 20 43 50 55 20 74 69 6d 65   system CPU time
18b0: 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64 65 66   used */.};.#def
18c0: 69 6e 65 20 67 65 74 72 75 73 61 67 65 28 41 2c  ine getrusage(A,
18d0: 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c 73 69  B) memset(B,0,si
18e0: 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64 69 66  zeof(*B)).#endif
18f0: 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f 75  ../* Saved resou
1900: 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  rce information 
1910: 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  for the beginnin
1920: 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  g of an operatio
1930: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
1940: 63 74 20 72 75 73 61 67 65 20 73 42 65 67 69 6e  ct rusage sBegin
1950: 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65 20 61  ;  /* CPU time a
1960: 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61 74 69  t start */.stati
1970: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1980: 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61 6c 6c  iBegin;  /* Wall
1990: 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74 20 73  -clock time at s
19a0: 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42  tart */../*.** B
19b0: 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f  egin timing an o
19c0: 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  peration.*/.stat
19d0: 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d  ic void beginTim
19e0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
19f0: 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20  enableTimer ){. 
1a00: 20 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53     getrusage(RUS
1a10: 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65 67 69  AGE_SELF, &sBegi
1a20: 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e 20 3d  n);.    iBegin =
1a30: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
1a40: 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  }.}../* Return t
1a50: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66  he difference of
1a60: 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75 63 74   two time_struct
1a70: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
1a80: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
1a90: 6d 65 44 69 66 66 28 73 74 72 75 63 74 20 74 69  meDiff(struct ti
1aa0: 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c 20 73  meval *pStart, s
1ab0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1ac0: 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  End){.  return (
1ad0: 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20 2d 20  pEnd->tv_usec - 
1ae0: 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65 63 29  pStart->tv_usec)
1af0: 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20 20 20  *0.000001 +.    
1b00: 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28 70 45       (double)(pE
1b10: 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70 53 74  nd->tv_sec - pSt
1b20: 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a 7d 0a  art->tv_sec);.}.
1b30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
1b40: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
1b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b60: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
1b70: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
1b80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b90: 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 74 69  _int64 iEnd = ti
1ba0: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 73  meOfDay();.    s
1bb0: 74 72 75 63 74 20 72 75 73 61 67 65 20 73 45 6e  truct rusage sEn
1bc0: 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  d;.    getrusage
1bd0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1be0: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
1bf0: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
1c00: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
1c10: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
1c20: 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e 29 2a  (iEnd - iBegin)*
1c30: 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69  0.001,.       ti
1c40: 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e 2e 72  meDiff(&sBegin.r
1c50: 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64 2e 72  u_utime, &sEnd.r
1c60: 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_utime),.      
1c70: 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69   timeDiff(&sBegi
1c80: 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73 45 6e  n.ru_stime, &sEn
1c90: 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a 20 20  d.ru_stime));.  
1ca0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
1cb0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
1cc0: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
1cd0: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
1ce0: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
1cf0: 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20 28 64  IMER 1..#elif (d
1d00: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
1d10: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
1d20: 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73 6f  )../* Saved reso
1d30: 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  urce information
1d40: 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69   for the beginni
1d50: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ng of an operati
1d60: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48 41 4e  on */.static HAN
1d70: 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 73 74  DLE hProcess;.st
1d80: 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74  atic FILETIME ft
1d90: 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73 74 61  KernelBegin;.sta
1da0: 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66 74 55  tic FILETIME ftU
1db0: 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74 69 63  serBegin;.static
1dc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1dd0: 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79 70 65  tWallBegin;.type
1de0: 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41 50 49  def BOOL (WINAPI
1df0: 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53 29 28   *GETPROCTIMES)(
1e00: 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45 54 49  HANDLE, LPFILETI
1e10: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 2c 0a  ME, LPFILETIME,.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20      LPFILETIME, 
1e50: 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73 74 61  LPFILETIME);.sta
1e60: 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d 45 53  tic GETPROCTIMES
1e70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1e80: 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a  Addr = NULL;../*
1e90: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1ea0: 20 69 66 20 77 65 20 68 61 76 65 20 74 69 6d 65   if we have time
1eb0: 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65 74 75  r support.  Retu
1ec0: 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73 61 72  rn 1 if necessar
1ed0: 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66 6f 75  y.** support fou
1ee0: 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70 72 65  nd (or found pre
1ef0: 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73 74 61  viously)..*/.sta
1f00: 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d 65 72  tic int hasTimer
1f10: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 65  (void){.  if( ge
1f20: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
1f30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f40: 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  1;.  } else {.  
1f50: 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73 73 54    /* GetProcessT
1f60: 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73 75 70  imes() isn't sup
1f70: 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39 35 20  ported in WIN95 
1f80: 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72 20 57  and some other W
1f90: 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20 76 65  indows.    ** ve
1fa0: 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66 20 74  rsions. See if t
1fb0: 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20 61 72  he version we ar
1fc0: 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68 61 73  e running on has
1fd0: 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74 0a 20   it, and if it. 
1fe0: 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61 76 65     ** does, save
1ff0: 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72 20 74   off a pointer t
2000: 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63 75 72  o it and the cur
2010: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68 61 6e  rent process han
2020: 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dle..    */.    
2030: 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43 75  hProcess = GetCu
2040: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b 0a  rrentProcess();.
2050: 20 20 20 20 69 66 28 20 68 50 72 6f 63 65 73 73      if( hProcess
2060: 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53 54 41   ){.      HINSTA
2070: 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d 20 4c  NCE hinstLib = L
2080: 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58 54 28  oadLibrary(TEXT(
2090: 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 29  "Kernel32.dll"))
20a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c  ;.      if( NULL
20b0: 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29 7b 0a   != hinstLib ){.
20c0: 20 20 20 20 20 20 20 20 67 65 74 50 72 6f 63 65          getProce
20d0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a 20 20  ssTimesAddr =.  
20e0: 20 20 20 20 20 20 20 20 20 20 28 47 45 54 50 52            (GETPR
20f0: 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72 6f 63  OCTIMES) GetProc
2100: 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c 69 62  Address(hinstLib
2110: 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54 69 6d  , "GetProcessTim
2120: 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  es");.        if
2130: 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50 72 6f  ( NULL != getPro
2140: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b  cessTimesAddr ){
2150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2160: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
2170: 20 20 20 20 20 20 20 46 72 65 65 4c 69 62 72 61         FreeLibra
2180: 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a 20 20  ry(hinstLib);.  
2190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21b0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e  *.** Begin timin
21c0: 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  g an operation.*
21d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
21e0: 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  ginTimer(void){.
21f0: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2200: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
2210: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
2220: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
2230: 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20 20 20  ion, ftExit;.   
2240: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2250: 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66  Addr(hProcess,&f
2260: 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69  tCreation,&ftExi
2270: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2280: 20 20 20 20 20 20 20 20 20 20 20 26 66 74 4b 65             &ftKe
2290: 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55 73 65  rnelBegin,&ftUse
22a0: 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66 74 57  rBegin);.    ftW
22b0: 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f  allBegin = timeO
22c0: 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  fDay();.  }.}../
22d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66  * Return the dif
22e0: 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 46  ference of two F
22f0: 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 73 20  ILETIME structs 
2300: 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 74  in seconds */.st
2310: 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69 6d 65  atic double time
2320: 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20 2a 70  Diff(FILETIME *p
2330: 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d 45 20  Start, FILETIME 
2340: 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69 74 65  *pEnd){.  sqlite
2350: 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72 74 20  _int64 i64Start 
2360: 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e 74 36  = *((sqlite_int6
2370: 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a 20 20  4 *) pStart);.  
2380: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34  sqlite_int64 i64
2390: 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  End = *((sqlite_
23a0: 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29 3b 0a  int64 *) pEnd);.
23b0: 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62 6c 65    return (double
23c0: 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69 36 34  ) ((i64End - i64
23d0: 53 74 61 72 74 29 20 2f 20 31 30 30 30 30 30 30  Start) / 1000000
23e0: 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  0.0);.}../*.** P
23f0: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
2400: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
2410: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
2420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2430: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2440: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2450: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2460: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2470: 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it, ftKernelEnd,
2480: 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20 20 20   ftUserEnd;.    
2490: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74  sqlite3_int64 ft
24a0: 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65 4f 66  WallEnd = timeOf
24b0: 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74 50 72  Day();.    getPr
24c0: 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68  ocessTimesAddr(h
24d0: 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74  Process,&ftCreat
24e0: 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66 74 4b  ion,&ftExit,&ftK
24f0: 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73 65 72  ernelEnd,&ftUser
2500: 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  End);.    printf
2510: 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65 61 6c  ("Run Time: real
2520: 20 25 2e 33 66 20 75 73 65 72 20 25 66 20 73 79   %.3f user %f sy
2530: 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %f\n",.       
2540: 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66 74 57  (ftWallEnd - ftW
2550: 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c  allBegin)*0.001,
2560: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
2570: 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c 20 26  (&ftUserBegin, &
2580: 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20 20 20  ftUserEnd),.    
2590: 20 20 20 74 69 6d 65 44 69 66 66 28 26 66 74 4b     timeDiff(&ftK
25a0: 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66 74 4b  ernelBegin, &ftK
25b0: 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20 7d 0a  ernelEnd));.  }.
25c0: 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47 49 4e  }..#define BEGIN
25d0: 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69 6d 65  _TIMER beginTime
25e0: 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f  r().#define END_
25f0: 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72 28 29  TIMER endTimer()
2600: 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d  .#define HAS_TIM
2610: 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a 0a 23  ER hasTimer()..#
2620: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42 45 47  else.#define BEG
2630: 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69 6e 65  IN_TIMER.#define
2640: 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65 66 69   END_TIMER.#defi
2650: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30 0a 23  ne HAS_TIMER 0.#
2660: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
2670: 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77 61 72  d to prevent war
2680: 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e 75 73  nings about unus
2690: 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2f  ed parameters.*/
26a0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
26b0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 28 76 6f  PARAMETER(x) (vo
26c0: 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20 4e 75  id)(x)../*.** Nu
26d0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
26e0: 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f 0a   in an array.*/.
26f0: 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69 7a  #define ArraySiz
2700: 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a 65  e(X)  (int)(size
2710: 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30  of(X)/sizeof(X[0
2720: 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ]))../*.** If th
2730: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6c 61 67  e following flag
2740: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 63 6f   is set, then co
2750: 6d 6d 61 6e 64 20 65 78 65 63 75 74 69 6f 6e 20  mmand execution 
2760: 73 74 6f 70 73 0a 2a 2a 20 61 74 20 61 6e 20 65  stops.** at an e
2770: 72 72 6f 72 20 69 66 20 77 65 20 61 72 65 20 6e  rror if we are n
2780: 6f 74 20 69 6e 74 65 72 61 63 74 69 76 65 2e 0a  ot interactive..
2790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27a0: 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 30 3b  il_on_error = 0;
27b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65 61 74 20 73  ../*.** Threat s
27c0: 74 64 69 6e 20 61 73 20 61 6e 20 69 6e 74 65 72  tdin as an inter
27d0: 61 63 74 69 76 65 20 69 6e 70 75 74 20 69 66 20  active input if 
27e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
27f0: 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 74 72 75  riable.** is tru
2800: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  e.  Otherwise, a
2810: 73 73 75 6d 65 20 73 74 64 69 6e 20 69 73 20 63  ssume stdin is c
2820: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 66 69  onnected to a fi
2830: 6c 65 20 6f 72 20 70 69 70 65 2e 0a 2a 2f 0a 73  le or pipe..*/.s
2840: 74 61 74 69 63 20 69 6e 74 20 73 74 64 69 6e 5f  tatic int stdin_
2850: 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 3d  is_interactive =
2860: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 57 69   1;../*.** On Wi
2870: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 77 65  ndows systems we
2880: 20 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 69 66   have to know if
2890: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
28a0: 20 69 73 20 61 20 63 6f 6e 73 6f 6c 65 0a 2a 2a   is a console.**
28b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 61   in order to tra
28c0: 6e 73 6c 61 74 65 20 55 54 46 2d 38 20 69 6e 74  nslate UTF-8 int
28d0: 6f 20 4d 42 43 53 2e 20 20 54 68 65 20 66 6f 6c  o MBCS.  The fol
28e0: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
28f0: 69 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 72  is.** true if tr
2900: 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 72 65 71  anslation is req
2910: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
2920: 20 69 6e 74 20 73 74 64 6f 75 74 5f 69 73 5f 63   int stdout_is_c
2930: 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  onsole = 1;../*.
2940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2950: 20 69 73 20 74 68 65 20 6f 70 65 6e 20 53 51 4c   is the open SQL
2960: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 57  ite database.  W
2970: 65 20 6d 61 6b 65 20 61 20 70 6f 69 6e 74 65 72  e make a pointer
2980: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 64 61 74 61  .** to this data
2990: 62 61 73 65 20 61 20 73 74 61 74 69 63 20 76 61  base a static va
29a0: 72 69 61 62 6c 65 20 73 6f 20 74 68 61 74 20 69  riable so that i
29b0: 74 20 63 61 6e 20 62 65 20 61 63 63 65 73 73 65  t can be accesse
29c0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 53 49 47 49  d.** by the SIGI
29d0: 4e 54 20 68 61 6e 64 6c 65 72 20 74 6f 20 69 6e  NT handler to in
29e0: 74 65 72 72 75 70 74 20 64 61 74 61 62 61 73 65  terrupt database
29f0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a   processing..*/.
2a00: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 20 2a  static sqlite3 *
2a10: 67 6c 6f 62 61 6c 44 62 20 3d 20 30 3b 0a 0a 2f  globalDb = 0;../
2a20: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 61 6e 20  *.** True if an 
2a30: 69 6e 74 65 72 72 75 70 74 20 28 43 6f 6e 74 72  interrupt (Contr
2a40: 6f 6c 2d 43 29 20 68 61 73 20 62 65 65 6e 20 72  ol-C) has been r
2a50: 65 63 65 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  eceived..*/.stat
2a60: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
2a70: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20  seenInterrupt = 
2a80: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  0;../*.** This i
2a90: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6f 75  s the name of ou
2aa0: 72 20 70 72 6f 67 72 61 6d 2e 20 49 74 20 69 73  r program. It is
2ab0: 20 73 65 74 20 69 6e 20 6d 61 69 6e 28 29 2c 20   set in main(), 
2ac0: 75 73 65 64 0a 2a 2a 20 69 6e 20 61 20 6e 75 6d  used.** in a num
2ad0: 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 6c 61  ber of other pla
2ae0: 63 65 73 2c 20 6d 6f 73 74 6c 79 20 66 6f 72 20  ces, mostly for 
2af0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
2b00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2b10: 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  Argv0;../*.** Pr
2b20: 6f 6d 70 74 20 73 74 72 69 6e 67 73 2e 20 49 6e  ompt strings. In
2b30: 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 6d 61 69  itialized in mai
2b40: 6e 2e 20 53 65 74 74 61 62 6c 65 20 77 69 74 68  n. Settable with
2b50: 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70 74 20 6d 61  .**   .prompt ma
2b60: 69 6e 20 63 6f 6e 74 69 6e 75 65 0a 2a 2f 0a 73  in continue.*/.s
2b70: 74 61 74 69 63 20 63 68 61 72 20 6d 61 69 6e 50  tatic char mainP
2b80: 72 6f 6d 70 74 5b 32 30 5d 3b 20 20 20 20 20 2f  rompt[20];     /
2b90: 2a 20 46 69 72 73 74 20 6c 69 6e 65 20 70 72 6f  * First line pro
2ba0: 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 73  mpt. default: "s
2bb0: 71 6c 69 74 65 3e 20 22 2a 2f 0a 73 74 61 74 69  qlite> "*/.stati
2bc0: 63 20 63 68 61 72 20 63 6f 6e 74 69 6e 75 65 50  c char continueP
2bd0: 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f 2a 20 43 6f  rompt[20]; /* Co
2be0: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
2bf0: 74 2e 20 64 65 66 61 75 6c 74 3a 20 22 20 20 20  t. default: "   
2c00: 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ...> " */../*.**
2c10: 20 52 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c   Render output l
2c20: 69 6b 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20  ike fprintf().  
2c30: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f  Except, if the o
2c40: 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74  utput is going t
2c50: 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 73 6f 6c 65  o the.** console
2c60: 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
2c70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 57 69 6e  running on a Win
2c80: 64 6f 77 73 20 6d 61 63 68 69 6e 65 2c 20 74 72  dows machine, tr
2c90: 61 6e 73 6c 61 74 65 20 74 68 65 0a 2a 2a 20 6f  anslate the.** o
2ca0: 75 74 70 75 74 20 66 72 6f 6d 20 55 54 46 2d 38  utput from UTF-8
2cb0: 20 69 6e 74 6f 20 4d 42 43 53 2e 0a 2a 2f 0a 23   into MBCS..*/.#
2cc0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2cd0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2ce0: 4e 33 32 29 0a 76 6f 69 64 20 75 74 66 38 5f 70  N32).void utf8_p
2cf0: 72 69 6e 74 66 28 46 49 4c 45 20 2a 6f 75 74 2c  rintf(FILE *out,
2d00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2d10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2d20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
2d30: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2d40: 29 3b 0a 20 20 69 66 28 20 73 74 64 6f 75 74 5f  );.  if( stdout_
2d50: 69 73 5f 63 6f 6e 73 6f 6c 65 20 26 26 20 28 6f  is_console && (o
2d60: 75 74 3d 3d 73 74 64 6f 75 74 20 7c 7c 20 6f 75  ut==stdout || ou
2d70: 74 3d 3d 73 74 64 65 72 72 29 20 29 7b 0a 20 20  t==stderr) ){.  
2d80: 20 20 63 68 61 72 20 2a 7a 31 20 3d 20 73 71 6c    char *z1 = sql
2d90: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2da0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
2db0: 63 68 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74  char *z2 = sqlit
2dc0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
2dd0: 5f 6d 62 63 73 5f 76 32 28 7a 31 2c 20 30 29 3b  _mbcs_v2(z1, 0);
2de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2df0: 65 28 7a 31 29 3b 0a 20 20 20 20 66 70 75 74 73  e(z1);.    fputs
2e00: 28 7a 32 2c 20 6f 75 74 29 3b 0a 20 20 20 20 73  (z2, out);.    s
2e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 32 29 3b  qlite3_free(z2);
2e20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 66  .  }else{.    vf
2e30: 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a 46 6f 72  printf(out, zFor
2e40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 20 20  mat, ap);.  }.  
2e50: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65  va_end(ap);.}.#e
2e60: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 75 74 66  lif !defined(utf
2e70: 38 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69  8_printf).# defi
2e80: 6e 65 20 75 74 66 38 5f 70 72 69 6e 74 66 20 66  ne utf8_printf f
2e90: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2ea0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2eb0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2ec0: 29 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ).  This should 
2ed0: 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20 61  not be used on a
2ee0: 6e 79 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  nything that.** 
2ef0: 69 6e 63 6c 75 64 65 73 20 73 74 72 69 6e 67 20  includes string 
2f00: 66 6f 72 6d 61 74 74 69 6e 67 20 28 65 2e 67 2e  formatting (e.g.
2f10: 20 22 25 73 22 29 2e 0a 2a 2f 0a 23 69 66 20 21   "%s")..*/.#if !
2f20: 64 65 66 69 6e 65 64 28 72 61 77 5f 70 72 69 6e  defined(raw_prin
2f30: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 72 61 77  tf).# define raw
2f40: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2f50: 23 65 6e 64 69 66 0a 0a 2f 2a 20 49 6e 64 69 63  #endif../* Indic
2f60: 61 74 65 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72  ate out-of-memor
2f70: 79 20 61 6e 64 20 65 78 69 74 2e 20 2a 2f 0a 73  y and exit. */.s
2f80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
2f90: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76  _out_of_memory(v
2fa0: 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e  oid){.  raw_prin
2fb0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
2fc0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
2fd0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49  }../*.** Write I
2ff0: 2f 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65  /O traces to the
3000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61   following strea
3010: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
3020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
3030: 43 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  CE.static FILE *
3040: 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  iotrace = 0;.#en
3050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3060: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69  routine works li
3070: 6b 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61  ke printf in tha
3080: 74 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75  t its first argu
3090: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72  ment is a.** for
30a0: 6d 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73  mat string and s
30b0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
30c0: 6e 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74  nts are values t
30d0: 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
30e0: 0a 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  .** in place of 
30f0: 25 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72  % fields.  The r
3100: 65 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74  esult of formatt
3110: 69 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a  ing this string.
3120: 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
3130: 20 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66   iotrace..*/.#if
3140: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3150: 45 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63  E_IOTRACE.static
3160: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
3170: 43 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66  CL iotracePrintf
3180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
3190: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
31a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
31b0: 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61   *z;.  if( iotra
31c0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
31d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
31e0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73  Format);.  z = s
31f0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
3200: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3210: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74  va_end(ap);.  ut
3220: 66 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63  f8_printf(iotrac
3230: 65 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73  e, "%s", z);.  s
3240: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
3250: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3260: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55  Output string zU
3270: 74 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75  tf to stream pOu
3280: 74 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72  t as w character
3290: 73 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61  s.  If w is nega
32a0: 74 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69  tive,.** then ri
32b0: 67 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20  ght-justify the 
32c0: 74 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20  text.  W is the 
32d0: 77 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63  width in UTF-8 c
32e0: 68 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a  haracters, not.*
32f0: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
3300: 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  s is different f
3310: 72 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70  rom the %*.*s sp
3320: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70  ecification in p
3330: 72 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77  rintf.** since w
3340: 69 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69  ith %*.*s the wi
3350: 64 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20  dth is measured 
3360: 69 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68  in bytes, not ch
3370: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
3380: 74 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69  tic void utf8_wi
3390: 64 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  dth_print(FILE *
33a0: 70 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e  pOut, int w, con
33b0: 73 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a  st char *zUtf){.
33c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33d0: 3b 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30  ;.  int aw = w<0
33e0: 20 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61   ? -w : w;.  cha
33f0: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
3400: 69 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65  if( aw>(int)size
3410: 6f 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20  of(zBuf)/3 ) aw 
3420: 3d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42  = (int)sizeof(zB
3430: 75 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e  uf)/3;.  for(i=n
3440: 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b  =0; zUtf[i]; i++
3450: 29 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66  ){.    if( (zUtf
3460: 5b 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20  [i]&0xc0)!=0x80 
3470: 29 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  ){.      n++;.  
3480: 20 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b      if( n==aw ){
3490: 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b  .        do{ i++
34a0: 3b 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b  ; }while( (zUtf[
34b0: 69 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29  i]&0xc0)==0x80 )
34c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
34d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e0: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29   }.  if( n>=aw )
34f0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
3500: 66 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  f(pOut, "%.*s", 
3510: 69 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  i, zUtf);.  }els
3520: 65 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20  e if( w<0 ){.   
3530: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75   utf8_printf(pOu
3540: 74 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e  t, "%*s%s", aw-n
3550: 2c 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d  , "", zUtf);.  }
3560: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
3570: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25  rintf(pOut, "%s%
3580: 2a 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c  *s", zUtf, aw-n,
3590: 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   "");.  }.}.../*
35a0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69  .** Determines i
35b0: 66 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20  f a string is a 
35c0: 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a  number of not..*
35d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
35e0: 75 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72  umber(const char
35f0: 20 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75   *z, int *realnu
3600: 6d 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d  m){.  if( *z=='-
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a  ' || *z=='+' ) z
3620: 2b 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67  ++;.  if( !IsDig
3630: 69 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65  it(*z) ){.    re
3640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b  turn 0;.  }.  z+
3650: 2b 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d  +;.  if( realnum
3660: 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b   ) *realnum = 0;
3670: 0a 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69  .  while( IsDigi
3680: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3690: 20 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b    if( *z=='.' ){
36a0: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  .    z++;.    if
36b0: 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29  ( !IsDigit(*z) )
36c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77   return 0;.    w
36d0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
36e0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ z++; }.    
36f0: 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72  if( realnum ) *r
3700: 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a  ealnum = 1;.  }.
3710: 20 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c    if( *z=='e' ||
3720: 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20   *z=='E' ){.    
3730: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  z++;.    if( *z=
3740: 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20  ='+' || *z=='-' 
3750: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21  ) z++;.    if( !
3760: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3770: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
3780: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
3790: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
37a0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
37b0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  num = 1;.  }.  r
37c0: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
37d0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
37e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68  string length th
37f0: 61 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f  at is limited to
3800: 20 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f   what can be sto
3810: 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20  red in.** lower 
3820: 33 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d  30 bits of a 32-
3830: 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67  bit signed integ
3840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
3850: 74 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74  t strlen30(const
3860: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e   char *z){.  con
3870: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3880: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b  .  while( *z2 ){
3890: 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72   z2++; }.  retur
38a0: 6e 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28  n 0x3fffffff & (
38b0: 69 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a  int)(z2 - z);.}.
38c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
38d0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74  e length of a st
38e0: 72 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65  ring in characte
38f0: 72 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55  rs.  Multibyte U
3900: 54 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a  TF8 characters.*
3910: 2a 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e  * count as a sin
3920: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
3930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72  /.static int str
3940: 6c 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68  lenChar(const ch
3950: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20  ar *z){.  int n 
3960: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
3970: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63   ){.    if( (0xc
3980: 30 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20  0&*(z++))!=0x80 
3990: 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ) n++;.  }.  ret
39a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
39b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61  This routine rea
39c0: 64 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78  ds a line of tex
39d0: 74 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20  t from FILE in, 
39e0: 73 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65  stores.** the te
39f0: 78 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  xt in memory obt
3a00: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
3a10: 63 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20  c() and returns 
3a20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3a30: 74 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20  the text.  NULL 
3a40: 69 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65  is returned at e
3a50: 6e 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69  nd of file, or i
3a60: 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61  f malloc().** fa
3a70: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c  ils..**.** If zL
3a80: 69 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ine is not NULL 
3a90: 74 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c  then it is a mal
3aa0: 6c 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74  loced buffer ret
3ab0: 75 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  urned from.** a 
3ac0: 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
3ad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68   this routine th
3ae0: 61 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64  at may be reused
3af0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
3b00: 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28   *local_getline(
3b10: 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c  char *zLine, FIL
3b20: 45 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c  E *in){.  int nL
3b30: 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f  ine = zLine==0 ?
3b40: 20 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20   0 : 100;.  int 
3b50: 6e 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  n = 0;..  while(
3b60: 20 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b   1 ){.    if( n+
3b70: 31 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20  100>nLine ){.   
3b80: 20 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65     nLine = nLine
3b90: 2a 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20  *2 + 100;.      
3ba0: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3bb0: 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
3bc0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3bd0: 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
3be0: 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d  _memory();.    }
3bf0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3c00: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3c10: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3c20: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3c30: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3c40: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3c50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3c60: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3c70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3c80: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3c90: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3ca0: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3cb0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3cc0: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3cd0: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ce0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3cf0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3d00: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3d10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d20: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3d30: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3d40: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3d50: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3d60: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3d70: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3d80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3d90: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3da0: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3db0: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3dc0: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3dd0: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3de0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3df0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3e00: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3e10: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3e20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3e30: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3e40: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3e50: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3e60: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3e70: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3e80: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3e90: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3ea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3eb0: 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  e==0 ) shell_out
3ec0: 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
3ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
3ee0: 70 79 28 7a 4c 69 6e 65 2c 20 7a 54 72 61 6e 73  py(zLine, zTrans
3ef0: 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20 20 20  , nTrans);.     
3f00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3f10: 72 61 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rans);.    }.  }
3f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
3f30: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
3f40: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 2a 2f 0a  fined(WIN32) */.
3f50: 20 20 72 65 74 75 72 6e 20 7a 4c 69 6e 65 3b 0a    return zLine;.
3f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
3f70: 65 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  e a single line 
3f80: 6f 66 20 69 6e 70 75 74 20 74 65 78 74 2e 0a 2a  of input text..*
3f90: 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d 30 20 74 68  *.** If in==0 th
3fa0: 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 73 74 61  en read from sta
3fb0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 20  ndard input and 
3fc0: 70 72 6f 6d 70 74 20 62 65 66 6f 72 65 20 65 61  prompt before ea
3fd0: 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20 49 66 20 69  ch line..** If i
3fe0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ff0: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 63 6f   true, then a co
4000: 6e 74 69 6e 75 61 74 69 6f 6e 20 70 72 6f 6d 70  ntinuation promp
4010: 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  t is appropriate
4020: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
4030: 75 61 74 69 6f 6e 20 69 73 20 7a 65 72 6f 2c 20  uation is zero, 
4040: 74 68 65 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  then the main pr
4050: 6f 6d 70 74 20 73 68 6f 75 6c 64 20 62 65 20 75  ompt should be u
4060: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 50  sed..**.** If zP
4070: 72 69 6f 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rior is not NULL
4080: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 62 75   then it is a bu
4090: 66 66 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  ffer from a prio
40a0: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a  r call to this.*
40b0: 2a 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 63  * routine that c
40c0: 61 6e 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2a  an be reused..**
40d0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
40e0: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  s stored in spac
40f0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
4100: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
4110: 74 20 65 69 74 68 65 72 0a 2a 2a 20 62 65 20 66  t either.** be f
4120: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4130: 65 72 20 6f 72 20 65 6c 73 65 20 70 61 73 73 65  er or else passe
4140: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 69 73  d back into this
4150: 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 68 65   routine via the
4160: 0a 2a 2a 20 7a 50 72 69 6f 72 20 61 72 67 75 6d  .** zPrior argum
4170: 65 6e 74 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ent for reuse..*
4180: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6f  /.static char *o
4190: 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e 65 28 46 49  ne_input_line(FI
41a0: 4c 45 20 2a 69 6e 2c 20 63 68 61 72 20 2a 7a 50  LE *in, char *zP
41b0: 72 69 6f 72 2c 20 69 6e 74 20 69 73 43 6f 6e 74  rior, int isCont
41c0: 69 6e 75 61 74 69 6f 6e 29 7b 0a 20 20 63 68 61  inuation){.  cha
41d0: 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a 20 20 63 68  r *zPrompt;.  ch
41e0: 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20 20 69  ar *zResult;.  i
41f0: 66 28 20 69 6e 21 3d 30 20 29 7b 0a 20 20 20 20  f( in!=0 ){.    
4200: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4210: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4220: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  in);.  }else{.  
4230: 20 20 7a 50 72 6f 6d 70 74 20 3d 20 69 73 43 6f    zPrompt = isCo
4240: 6e 74 69 6e 75 61 74 69 6f 6e 20 3f 20 63 6f 6e  ntinuation ? con
4250: 74 69 6e 75 65 50 72 6f 6d 70 74 20 3a 20 6d 61  tinuePrompt : ma
4260: 69 6e 50 72 6f 6d 70 74 3b 0a 23 69 66 20 53 48  inPrompt;.#if SH
4270: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
4280: 54 4c 49 4e 45 0a 20 20 20 20 70 72 69 6e 74 66  TLINE.    printf
4290: 28 22 25 73 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  ("%s", zPrompt);
42a0: 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
42b0: 75 74 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74  ut);.    zResult
42c0: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
42d0: 28 7a 50 72 69 6f 72 2c 20 73 74 64 69 6e 29 3b  (zPrior, stdin);
42e0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 72 65 65 28  .#else.    free(
42f0: 7a 50 72 69 6f 72 29 3b 0a 20 20 20 20 7a 52 65  zPrior);.    zRe
4300: 73 75 6c 74 20 3d 20 73 68 65 6c 6c 5f 72 65 61  sult = shell_rea
4310: 64 6c 69 6e 65 28 7a 50 72 6f 6d 70 74 29 3b 0a  dline(zPrompt);.
4320: 20 20 20 20 69 66 28 20 7a 52 65 73 75 6c 74 20      if( zResult 
4330: 26 26 20 2a 7a 52 65 73 75 6c 74 20 29 20 73 68  && *zResult ) sh
4340: 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79 28  ell_add_history(
4350: 7a 52 65 73 75 6c 74 29 3b 0a 23 65 6e 64 69 66  zResult);.#endif
4360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
4370: 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  esult;.}.../*.**
4380: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4390: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
43a0: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
43b0: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
43c0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
43d0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
43e0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
43f0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4400: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4410: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4420: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4430: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4440: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4450: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4460: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4470: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4480: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4490: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
44a0: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
44b0: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
44c0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
44d0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  xes..*/.static s
44e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 6e 74  qlite3_int64 int
44f0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
4500: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
4510: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
4520: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
4530: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
4540: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
4550: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
4560: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
4570: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
4580: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
4590: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
45a0: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
45b0: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
45c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
45d0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
45e0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
45f0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4600: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
4610: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
4620: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
4630: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
4640: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
4650: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
4660: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
4670: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
4680: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
4690: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
46a0: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
46b0: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
46c0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
46d0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
46e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
46f0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
4700: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
4710: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
4720: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
4730: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
4740: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4750: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4760: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
4770: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
4780: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
4790: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
47a0: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
47b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
47c0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 75   i<ArraySize(aMu
47d0: 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lt); i++){.    i
47e0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
47f0: 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66  mp(aMult[i].zSuf
4800: 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b  fix, zArg)==0 ){
4810: 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c  .      v *= aMul
4820: 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20  t[i].iMult;.    
4830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 73 4e 65   }.  return isNe
4850: 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a  g? -v : v;.}../*
4860: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
4870: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
4880: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4890: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
48a0: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
48b0: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
48c0: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
48d0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
48e0: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
48f0: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4900: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4910: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4920: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
4930: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
4940: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
4950: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
4960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
4970: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
4980: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4990: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
49a0: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
49b0: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
49c0: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
49d0: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
49e0: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
49f0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4a00: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4a10: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4a20: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
4a30: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
4a40: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
4a50: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
4a60: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
4a70: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4a80: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4a90: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4aa0: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4ab0: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4ac0: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4ad0: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4ae0: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4af0: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4b00: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4b10: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
4b30: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
4b40: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
4b50: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
4b60: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
4b70: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
4b80: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4b90: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4ba0: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4bb0: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4bc0: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4bd0: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4be0: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4bf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4c00: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4c10: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4c20: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
4c30: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
4c40: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
4c50: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
4c60: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
4c70: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
4c80: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4c90: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73   if( p->z==0 ) s
4ca0: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
4cb0: 72 79 28 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ry();.  }..  if(
4cc0: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4cd0: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
4ce0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
4cf0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
4d00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
4d10: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
4d20: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
4d30: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4d40: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4d50: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4d60: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4d70: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4d80: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4d90: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4da0: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4dc0: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4dd0: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
4de0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
4df0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
4e00: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
4e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
4e20: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
4e30: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4e40: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4e50: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4e60: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4e70: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4e80: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4e90: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4ea0: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4eb0: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4ec0: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4ed0: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
4ee0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
4ef0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
4f00: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
4f10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
4f20: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
4f30: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4f40: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4f50: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4f60: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4f70: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4f80: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
4f90: 20 69 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70   i;.  if( !isalp
4fa0: 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ha((unsigned cha
4fb0: 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  r)zName[0]) && z
4fc0: 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72  Name[0]!='_' ) r
4fd0: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72  eturn '"';.  for
4fe0: 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
4ff0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69  i++){.    if( !i
5000: 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64  salnum((unsigned
5010: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20   char)zName[i]) 
5020: 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27  && zName[i]!='_'
5030: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
5050: 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 68 65 63  te3_keyword_chec
5060: 6b 28 7a 4e 61 6d 65 2c 20 69 29 20 3f 20 27 22  k(zName, i) ? '"
5070: 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ' : 0;.}../*.** 
5080: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5090: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
50a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
50b0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
50c0: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
50d0: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
50e0: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
50f0: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5100: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5110: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
5120: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
5130: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5160: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
5170: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5180: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5190: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
51a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
51b0: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
51c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
51d0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
51e0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
51f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5200: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5210: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
5220: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
5230: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
5240: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
5250: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
5260: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
5270: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5280: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5290: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
52a0: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
52d0: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
52e0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
52f0: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5300: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5310: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5320: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
5330: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
5340: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5350: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5360: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
5370: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5380: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5390: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
53a0: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
53b0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53c0: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
53d0: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
53e0: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
53f0: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5400: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5410: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
5420: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
5430: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
5440: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
5450: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
5460: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5470: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5480: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5490: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
54a0: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
54b0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
54c0: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
54d0: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
54e0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
54f0: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5500: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5510: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5520: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5530: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5540: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5550: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5560: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5570: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5580: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5590: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
55a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
55b0: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
55c0: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
55d0: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
55e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
55f0: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5600: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5610: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5620: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5630: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5640: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5650: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5660: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5670: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5680: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5690: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
56a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
56b0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
56c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
56d0: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
56e0: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
56f0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5700: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5720: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5730: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5740: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5750: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5760: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5770: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
57a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
57b0: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
57c0: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
57d0: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
57e0: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
57f0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5800: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5810: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5820: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5830: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5840: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5850: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5860: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5870: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5880: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5890: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
58a0: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
58b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
58c0: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
58d0: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
58e0: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
58f0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5900: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5910: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5920: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5930: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5940: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5950: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5960: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5970: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5980: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5990: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
59a0: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
59b0: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
59c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
59d0: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
59e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
59f0: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5a00: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5a10: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5a20: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5a30: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5a40: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5a50: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5a60: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5a70: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
5a80: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
5a90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5aa0: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
5ab0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5ac0: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
5ad0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
5ae0: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
5af0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b00: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
5b10: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
5b20: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
5b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5b40: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
5b50: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
5b60: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
5b70: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
5b80: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
5b90: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
5ba0: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
5bb0: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
5bc0: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
5bd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
5be0: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
5bf0: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
5c00: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
5c10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
5c20: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
5c30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
5c40: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
5c50: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
5c60: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
5c70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
5c80: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
5c90: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
5ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
5cb0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
5cc0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
5cd0: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5ce0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
5cf0: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
5d00: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
5d10: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
5d20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d30: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d40: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
5d50: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d60: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d70: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5da0: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
5db0: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
5dc0: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
5dd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5de0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5df0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
5e00: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
5e10: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
5e20: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
5e30: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
5e40: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
5e50: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
5e60: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5e80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5e90: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
5ea0: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
5eb0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
5ed0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5ee0: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
5ef0: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5f10: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5f40: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5f50: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5f60: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5f70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5f80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5fa0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5fb0: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5fc0: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5fd0: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5fe0: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5ff0: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6000: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6010: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
6020: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
6030: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
6040: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
6050: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
6060: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
6070: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6080: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6090: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
60a0: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
60b0: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
60c0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
60d0: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
60e0: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
60f0: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6100: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6110: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6120: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
6130: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
6140: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
6150: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
6160: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
6170: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6180: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6190: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
61a0: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
61b0: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
61c0: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
61d0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
61e0: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
61f0: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6200: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6210: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
6220: 6e 64 76 66 73 2e 63 0a 49 4e 43 4c 55 44 45 20  ndvfs.c.INCLUDE 
6230: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d 74  ../ext/misc/memt
6240: 72 61 63 65 2e 63 0a 23 69 66 64 65 66 20 53 51  race.c.#ifdef SQ
6250: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6260: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6270: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
6280: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
6290: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
62a0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
62b0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
62c0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
62d0: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
62e0: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
62f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6310: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6320: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6330: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6340: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6350: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6360: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6370: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63a0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
63b0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
63c0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63e0: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63f0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6400: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6410: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6420: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6430: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6440: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6450: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6460: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6470: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6480: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6490: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
64a0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
64b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
64c0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
64d0: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
64e0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64f0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6500: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6510: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6520: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6530: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6540: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6550: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6560: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6570: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6580: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6590: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
65a0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
65b0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
65c0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
65d0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
65e0: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65f0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6600: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6610: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6620: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6630: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6640: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6650: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6660: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6670: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6680: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6690: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
66a0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
66b0: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
66c0: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
66d0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
66e0: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66f0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
6700: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
6710: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
6720: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
6730: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
6740: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6750: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6760: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6770: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6780: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6790: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
67a0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
67b0: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
67c0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
67d0: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
67e0: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67f0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
6800: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
6810: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
6820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
6830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
6840: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6850: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6860: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6870: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6890: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
68a0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
68b0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
68c0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
68d0: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
68e0: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68f0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
6900: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
6910: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
6920: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
6930: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
6940: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6950: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6960: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6980: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6990: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
69a0: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
69b0: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
69c0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
69d0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69f0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
6a00: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
6a10: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
6a20: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
6a30: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a50: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a60: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a70: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a80: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a90: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6aa0: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6ab0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75   mode */.  u8 au
6ac0: 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20 20 20  toEQPtrace;     
6ad0: 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20    /* autoEQP is 
6ae0: 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f  in trace mode */
6af0: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6b10: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6b20: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6b30: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6b40: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6b50: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6b60: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6b70: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6b80: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6b90: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6bb0: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6bc0: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6bd0: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6be0: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6bf0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6c00: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6c10: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6c20: 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70  t() */.  u8 nEqp
6c30: 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
6c40: 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68 65 20  /* Depth of the 
6c50: 45 51 50 20 6f 75 74 70 75 74 20 67 72 61 70 68  EQP output graph
6c60: 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54   */.  u8 eTraceT
6c70: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
6c80: 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61  SHELL_TRACE_* va
6c90: 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20  lue for type of 
6ca0: 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67  trace */.  unsig
6cb0: 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20  ned mEqpLines;  
6cc0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72    /* Mask of ver
6cd0: 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20  itical lines in 
6ce0: 74 68 65 20 45 51 50 20 6f 75 74 70 75 74 20 67  the EQP output g
6cf0: 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75  raph */.  int ou
6d00: 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  tCount;         
6d10: 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74   /* Revert to st
6d20: 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69  dout when reachi
6d30: 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ng zero */.  int
6d40: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
6d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6d60: 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79   records display
6d70: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  ed so far */.  i
6d80: 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  nt lineno;      
6d90: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
6da0: 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e  mber of last lin
6db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a  e read from in *
6dc0: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
6dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6de0: 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d  ad commands from
6df0: 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a   this stream */.
6e00: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6e20: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6e30: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6e40: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6e50: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6e60: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6e70: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e90: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6ea0: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6ec0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6ed0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6ee0: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6ef0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6f00: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6f20: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6f30: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6f40: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6f50: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6f60: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6f70: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6f80: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6f90: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6fa0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6fb0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6fc0: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6fd0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ff0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
7000: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
7010: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
7020: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
7030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7040: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
7050: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
7060: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
7070: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
7080: 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  f progress callb
7090: 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  acks encountered
70a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d   */.  unsigned m
70b0: 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20  xProgress;   /* 
70c0: 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73  Maximum progress
70d0: 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72   callbacks befor
70e0: 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75  e failing */.  u
70f0: 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72  nsigned flgProgr
7100: 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66  ess;  /* Flags f
7110: 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  or the progress 
7120: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e  callback */.  un
7130: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
7140: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
7150: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
7160: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20  e3_int64 szMax; 
7170: 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61    /* --maxsize a
7180: 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e  rgument to .open
7190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
71a0: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
71b0: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
71c0: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
71d0: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
71e0: 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b  char *zTempFile;
71f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
7200: 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69  ary file that mi
7210: 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e  ght need deletin
7220: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  g */.  char zTes
7230: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7240: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7250: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7260: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7270: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7280: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
7290: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
72a0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
72b0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
72c0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
72d0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
72e0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
72f0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69    char colSepPri
7300: 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65  or[20];  /* Save
7310: 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  d column separat
7320: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77  or */.  char row
7330: 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f  SepPrior[20];  /
7340: 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70 61  * Saved row sepa
7350: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
7360: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
7370: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
7380: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7390: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
73a0: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
73b0: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
73c0: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
73d0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
73f0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
7400: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
7410: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
7420: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
7450: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
7460: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
7470: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
7480: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
7490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
74a0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
74b0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
74c0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
74d0: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
74e0: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
74f0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
7500: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
7510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7520: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
7530: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
7540: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
7550: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
7560: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
7570: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
7580: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
75a0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
75b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
75c0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
75d0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
75e0: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
75f0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
7600: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
7610: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
7620: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
7630: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
7640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
7650: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
7660: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
7670: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73   */.  EQPGraph s
7680: 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20  Graph;       /* 
7690: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
76a0: 74 68 65 20 67 72 61 70 68 69 63 61 6c 20 45 58  the graphical EX
76b0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
76c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
76d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
76e0: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
76f0: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
7700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7710: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
7720: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
7730: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
7740: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
7750: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
7760: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
7770: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
7780: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
7790: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
77a0: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
77b0: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
77c0: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65  /.};.../* Allowe
77d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
77e0: 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a  llState.autoEQP.
77f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7800: 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20  QP_off      0   
7810: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
7820: 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
7830: 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a  RY PLAN is off *
7840: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7850: 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20  P_on       1    
7860: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61         /* Automa
7870: 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f  tic EQP is on */
7880: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7890: 5f 74 72 69 67 67 65 72 20 20 32 20 20 20 20 20  _trigger  2     
78a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20        /* On and 
78b0: 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20  also show plans 
78c0: 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  for triggers */.
78d0: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
78e0: 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20  full     3      
78f0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c       /* Show ful
7900: 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  l EXPLAIN */../*
7910: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7920: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f  for ShellState.o
7930: 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69  penMode.*/.#defi
7940: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  ne SHELL_OPEN_UN
7950: 53 50 45 43 20 20 20 20 20 20 30 20 20 20 20 20  SPEC      0     
7960: 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65   /* No open-mode
7970: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64   specified */.#d
7980: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7990: 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20  _NORMAL      1  
79a0: 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61      /* Normal da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
79c0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
79d0: 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20 32 20  N_APPENDVFS   2 
79e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
79f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7a00: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7a10: 49 4c 45 20 20 20 20 20 33 20 20 20 20 20 20 2f  ILE     3      /
7a20: 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c  * Use the zipfil
7a30: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7a50: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
7a60: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7a70: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7a80: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7a90: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7aa0: 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35  EN_DESERIALIZE 5
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73        /* Open us
7ac0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
7ad0: 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65  rialize() */.#de
7ae0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7af0: 48 45 58 44 42 20 20 20 20 20 20 20 36 20 20 20  HEXDB       6   
7b00: 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74     /* Use "dbtot
7b10: 78 74 22 20 6f 75 74 70 75 74 20 61 73 20 64 61  xt" output as da
7b20: 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 0a 2f 2a  ta source */../*
7b30: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7b40: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 65  for ShellState.e
7b50: 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23 64 65  TraceType.*/.#de
7b60: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7b70: 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20 20 20  _PLAIN      0   
7b80: 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70 75 74     /* Show input
7b90: 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23 64 65   SQL text */.#de
7ba0: 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41 43 45  fine SHELL_TRACE
7bb0: 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20 20 20  _EXPANDED   1   
7bc0: 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70 61 6e     /* Show expan
7bd0: 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a  ded SQL text */.
7be0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52  #define SHELL_TR
7bf0: 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44 20 32  ACE_NORMALIZED 2
7c00: 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 6e 6f        /* Show no
7c10: 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74 65 78  rmalized SQL tex
7c20: 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20 69 6e  t */../* Bits in
7c30: 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 2e   the ShellState.
7c40: 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61 72 69  flgProgress vari
7c50: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
7c60: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51  SHELL_PROGRESS_Q
7c70: 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20 4f 6d  UIET 0x01  /* Om
7c80: 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20 65 76  it announcing ev
7c90: 65 72 79 20 70 72 6f 67 72 65 73 73 20 63 61 6c  ery progress cal
7ca0: 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65  lback */.#define
7cb0: 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f   SHELL_PROGRESS_
7cc0: 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a 20 52  RESET 0x02  /* R
7cd0: 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74 20 77  eset the count w
7ce0: 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65 73 0a  hen the progres.
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 6c     ** callback l
7d20: 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
7d30: 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a 20 20   and for each.  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 53 51   ** top-level SQ
7d70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 23  L statement */.#
7d80: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50 52 4f  define SHELL_PRO
7d90: 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78 30 34  GRESS_ONCE  0x04
7da0: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68 65 20    /* Cancel the 
7db0: 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20 66 69  --limit after fi
7dc0: 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a 2f 2a  ring once */../*
7dd0: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68  .** These are th
7de0: 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46  e allowed shellF
7df0: 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64  lgs values.*/.#d
7e00: 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67 65  efine SHFLG_Page
7e10: 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30 30  cache      0x000
7e20: 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70  00001 /* The --p
7e30: 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e 20  agecache option 
7e40: 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66 69  is used */.#defi
7e50: 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69  ne SHFLG_Lookasi
7e60: 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  de      0x000000
7e70: 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20  02 /* Lookaside 
7e80: 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20 2a  memory is used *
7e90: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7ea0: 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20 30  Backslash      0
7eb0: 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68 65  x00000004 /* The
7ec0: 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70 74   --backslash opt
7ed0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
7ee0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72 65  define SHFLG_Pre
7ef0: 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30 30  serveRowid  0x00
7f00: 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20  000008 /* .dump 
7f10: 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64 20  preserves rowid 
7f20: 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e  values */.#defin
7f30: 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  e SHFLG_Newlines
7f40: 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30 31         0x0000001
7f50: 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77  0 /* .dump --new
7f60: 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65  line flag */.#de
7f70: 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74  fine SHFLG_Count
7f80: 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30 30  Changes   0x0000
7f90: 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73  0020 /* .changes
7fa0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66   setting */.#def
7fb0: 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20 20  ine SHFLG_Echo  
7fc0: 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30 30           0x00000
7fd0: 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20  040 /* .echo or 
7fe0: 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20 2a  --echo setting *
7ff0: 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20  /../*.** Macros 
8000: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
8010: 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67  setting shellFlg
8020: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68 65  s.*/.#define She
8030: 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20 20  llHasFlag(P,X)  
8040: 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c    (((P)->shellFl
8050: 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23 64  gs & (X))!=0).#d
8060: 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c  efine ShellSetFl
8070: 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29 2d  ag(P,X)    ((P)-
8080: 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29  >shellFlgs|=(X))
8090: 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c  .#define ShellCl
80a0: 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28 28  earFlag(P,X)  ((
80b0: 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28  P)->shellFlgs&=(
80c0: 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ~(X)))../*.** Th
80d0: 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c 6f  ese are the allo
80e0: 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64  wed modes..*/.#d
80f0: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20  efine MODE_Line 
8100: 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f      0  /* One co
8110: 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20  lumn per line.  
8120: 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65  Blank line betwe
8130: 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64  en records */.#d
8140: 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d  efine MODE_Colum
8150: 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65  n   1  /* One re
8160: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69 6e  cord per line in
8170: 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f   neat columns */
8180: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69  .#define MODE_Li
8190: 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65  st     2  /* One
81a0: 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65   record per line
81b0: 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74 6f   with a separato
81c0: 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  r */.#define MOD
81d0: 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f 2a  E_Semi     3  /*
81e0: 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69   Same as MODE_Li
81f0: 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22 3b  st but append ";
8200: 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a  " to each line *
8210: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48  /.#define MODE_H
8220: 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47 65  tml     4  /* Ge
8230: 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c 20  nerate an XHTML 
8240: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
8250: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20 35   MODE_Insert   5
8260: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53 51    /* Generate SQ
8270: 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74 65  L "insert" state
8280: 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ments */.#define
8290: 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20 36   MODE_Quote    6
82a0: 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75 65    /* Quote value
82b0: 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a  s as for SQL */.
82c0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c  #define MODE_Tcl
82d0: 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e 65        7  /* Gene
82e0: 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20 54  rate ANSI-C or T
82f0: 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e  CL quoted elemen
8300: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
8310: 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20 2f  DE_Csv      8  /
8320: 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73 2c  * Quote strings,
8330: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c 61   numbers are pla
8340: 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  in */.#define MO
8350: 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20 2f  DE_Explain  9  /
8360: 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75  * Like MODE_Colu
8370: 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 74  mn, but do not t
8380: 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f 0a  runcate data */.
8390: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63  #define MODE_Asc
83a0: 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65 20  ii   10  /* Use 
83b0: 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20 72  ASCII unit and r
83c0: 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72 73  ecord separators
83d0: 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a   (0x1F/0x1E) */.
83e0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65  #define MODE_Pre
83f0: 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65 74  tty  11  /* Pret
8400: 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61 73  ty-print schemas
8410: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8420: 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f 2a 20  _EQP     12  /* 
8430: 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41 49 4e  Converts EXPLAIN
8440: 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75 74 70   QUERY PLAN outp
8450: 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70 68 20  ut into a graph 
8460: 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  */..static const
8470: 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72   char *modeDescr
8480: 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c  [] = {.  "line",
8490: 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22  .  "column",.  "
84a0: 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c  list",.  "semi",
84b0: 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e  .  "html",.  "in
84c0: 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22  sert",.  "quote"
84d0: 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73  ,.  "tcl",.  "cs
84e0: 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c  v",.  "explain",
84f0: 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70  .  "ascii",.  "p
8500: 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20 20 22  rettyprint",.  "
8510: 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  eqp".};../*.** T
8520: 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c  hese are the col
8530: 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70  umn/row/line sep
8540: 61 72 61 74 6f 72 73 20 75 73 65 64 20 62 79 20  arators used by 
8550: 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69  the various.** i
8560: 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64  mport/export mod
8570: 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  es..*/.#define S
8580: 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22  EP_Column    "|"
8590: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77  .#define SEP_Row
85a0: 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66         "\n".#def
85b0: 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20 20 20  ine SEP_Tab     
85c0: 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53    "\t".#define S
85d0: 45 50 5f 53 70 61 63 65 20 20 20 20 20 22 20 22  EP_Space     " "
85e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d  .#define SEP_Com
85f0: 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69  ma     ",".#defi
8600: 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20  ne SEP_CrLf     
8610: 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20   "\r\n".#define 
8620: 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c  SEP_Unit      "\
8630: 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50  x1F".#define SEP
8640: 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45  _Record    "\x1E
8650: 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 62  "../*.** A callb
8660: 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
8670: 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65 72 66  te3_log() interf
8680: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ace..*/.static v
8690: 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76 6f 69  oid shellLog(voi
86a0: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72  d *pArg, int iEr
86b0: 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  rCode, const cha
86c0: 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68 65 6c  r *zMsg){.  Shel
86d0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
86e0: 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20  llState*)pArg;. 
86f0: 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d 30 20   if( p->pLog==0 
8700: 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74 66 38  ) return;.  utf8
8710: 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f 67 2c  _printf(p->pLog,
8720: 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20 69 45   "(%d) %s\n", iE
8730: 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20  rrCode, zMsg);. 
8740: 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f 67 29   fflush(p->pLog)
8750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8760: 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f  unction:  shell_
8770: 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a 2a 20  putsnl(X).**.** 
8780: 57 72 69 74 65 20 74 68 65 20 74 65 78 74 20 58  Write the text X
8790: 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e 20 28   to the screen (
87a0: 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75 74 70  or whatever outp
87b0: 75 74 20 69 73 20 62 65 69 6e 67 20 64 69 72 65  ut is being dire
87c0: 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e 67 20  cted).** adding 
87d0: 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74 68 65  a newline at the
87e0: 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 72   end, and then r
87f0: 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74 61 74  eturn X..*/.stat
8800: 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 75 74  ic void shellPut
8810: 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  sFunc(.  sqlite3
8820: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
8830: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
8840: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
8850: 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  Val.){.  ShellSt
8860: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
8870: 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f 75 73  tate*)sqlite3_us
8880: 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
8890: 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20 20 75   (void)nVal;.  u
88a0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
88b0: 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
88c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
88d0: 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69  Val[0]));.  sqli
88e0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
88f0: 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30 5d 29  (pCtx, apVal[0])
8900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
8910: 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69 74 28  unction:   edit(
8920: 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20 20 20  VALUE).**       
8930: 20 20 20 20 20 20 20 20 20 20 65 64 69 74 28 56            edit(V
8940: 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a 2a 0a  ALUE,EDITOR).**.
8950: 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73 3a 0a  ** These steps:.
8960: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 57 72  **.**     (1) Wr
8970: 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f 20 61  ite VALUE into a
8980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8990: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75 6e 20  .**     (2) Run 
89a0: 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52 20 6f  program EDITOR o
89b0: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
89c0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 33   file..**     (3
89d0: 29 20 52 65 61 64 20 74 68 65 20 74 65 6d 70 6f  ) Read the tempo
89e0: 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b 20 61  rary file back a
89f0: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 63 6f  nd return its co
8a00: 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72 65 73  ntent as the res
8a10: 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20  ult..**     (4) 
8a20: 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  Delete the tempo
8a30: 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a 2a 20  rary file.**.** 
8a40: 49 66 20 74 68 65 20 45 44 49 54 4f 52 20 61 72  If the EDITOR ar
8a50: 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74 74 65  gument is omitte
8a60: 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  d, use the value
8a70: 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c 0a 2a   in the VISUAL.*
8a80: 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  * environment va
8a90: 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74 69 6c  riable.  If stil
8aa0: 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 44  l there is no ED
8ab0: 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20 61 6e  ITOR, through an
8ac0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c   error..**.** Al
8ad0: 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  so throw an erro
8ae0: 72 20 69 66 20 74 68 65 20 45 44 49 54 4f 52 20  r if the EDITOR 
8af0: 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e 73 20  program returns 
8b00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69 74 20  a non-zero exit 
8b10: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  code..*/.#ifndef
8b20: 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
8b30: 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76 6f 69  YSTEM.static voi
8b40: 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20 73 71  d editFunc(.  sq
8b50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8b60: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
8b70: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8b80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8b90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 64 69  const char *zEdi
8ba0: 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  tor;.  char *zTe
8bb0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71  mpFile = 0;.  sq
8bc0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
8bd0: 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 69  r *zCmd = 0;.  i
8be0: 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74 20 72  nt bBin;.  int r
8bf0: 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52 4e 4c  c;.  int hasCRNL
8c00: 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 66 20   = 0;.  FILE *f 
8c10: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
8c20: 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c 69 74  nt64 sz;.  sqlit
8c30: 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20 75 6e  e3_int64 x;.  un
8c40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 20 3d  signed char *p =
8c50: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d   0;..  if( argc=
8c60: 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69 74 6f  =2 ){.    zEdito
8c70: 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  r = (const char*
8c80: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8c90: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
8ca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64 69 74  }else{.    zEdit
8cb0: 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56 49 53  or = getenv("VIS
8cc0: 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  UAL");.  }.  if(
8cd0: 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b 0a 20   zEditor==0 ){. 
8ce0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8cf0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
8d00: 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f 72 20   "no editor for 
8d10: 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20  edit()", -1);.  
8d20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
8d30: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
8d40: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
8d50: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
8d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d70: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8d80: 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f  , "NULL input to
8d90: 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a 20   edit()", -1);. 
8da0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8db0: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   db = sqlite3_co
8dc0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
8dd0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54 65 6d  context);.  zTem
8de0: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pFile = 0;.  sql
8df0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
8e00: 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f  l(db, 0, SQLITE_
8e10: 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
8e20: 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65 29 3b  ME, &zTempFile);
8e30: 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65  .  if( zTempFile
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8e50: 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20 30 3b  e3_uint64 r = 0;
8e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
8e70: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
8e80: 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54 65 6d  ), &r);.    zTem
8e90: 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
8ea0: 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25 6c 6c  mprintf("temp%ll
8eb0: 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66 28 20  x", r);.    if( 
8ec0: 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8ee0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8ef0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
8f00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8f10: 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71 6c 69   }.  bBin = sqli
8f20: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
8f30: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
8f40: 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65 6e 20  BLOB;.  /* When 
8f50: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 6c 65  writing the file
8f60: 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c 20 64   to be edited, d
8f70: 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63 6f 6e  o \n to \r\n con
8f80: 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79 73 74  versions on syst
8f90: 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 61  ems.  ** that wa
8fa0: 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65 6e 64  nt \r\n line end
8fb0: 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20 66 6f  ings */.  f = fo
8fc0: 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c 20 62  pen(zTempFile, b
8fd0: 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22 77 22  Bin ? "wb" : "w"
8fe0: 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  );.  if( f==0 ){
8ff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9000: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9010: 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f  t, "edit() canno
9020: 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  t open temp file
9030: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f  ", -1);.    goto
9040: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9050: 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c 69 74    }.  sz = sqlit
9060: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
9070: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 62  rgv[0]);.  if( b
9080: 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d 20 66  Bin ){.    x = f
9090: 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f 76 61  write(sqlite3_va
90a0: 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d  lue_blob(argv[0]
90b0: 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  ), 1, sz, f);.  
90c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
90d0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
90e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
90f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9100: 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65 6d 65  0]);.    /* Reme
9110: 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f 72 20  mber whether or 
9120: 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 72  not the value or
9130: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  iginally contain
9140: 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20 20 69  ed \r\n */.    i
9150: 66 28 20 7a 20 26 26 20 73 74 72 73 74 72 28 7a  f( z && strstr(z
9160: 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20 68 61  ,"\r\n")!=0 ) ha
9170: 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20 20 78  sCRNL = 1;.    x
9180: 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74 65   = fwrite(sqlite
9190: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
91a0: 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29  v[0]), 1, sz, f)
91b0: 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
91c0: 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69 66  );.  f = 0;.  if
91d0: 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73  ( x!=sz ){.    s
91e0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
91f0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 64  ror(context, "ed
9200: 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20 77  it() could not w
9210: 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20 66  rite the whole f
9220: 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67  ile", -1);.    g
9230: 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e  oto edit_func_en
9240: 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20  d;.  }.  zCmd = 
9250: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9260: 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45 64  "%s \"%s\"", zEd
9270: 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65 29  itor, zTempFile)
9280: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
9290: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
92a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
92b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
92c0: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
92d0: 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  nd;.  }.  rc = s
92e0: 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 73  ystem(zCmd);.  s
92f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
9300: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9310: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9320: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
9330: 20 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e 65   "EDITOR returne
9340: 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31 29  d non-zero", -1)
9350: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
9360: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
9370: 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46  f = fopen(zTempF
9380: 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ile, "rb");.  if
9390: 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( f==0 ){.    sq
93a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
93b0: 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20  or(context,.    
93c0: 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74    "edit() cannot
93d0: 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c   reopen temp fil
93e0: 65 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d  e after edit", -
93f0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
9400: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
9410: 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45    fseek(f, 0, SE
9420: 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20  EK_END);.  sz = 
9430: 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69  ftell(f);.  rewi
9440: 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c  nd(f);.  p = sql
9450: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
9460: 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20  z+(bBin==0) );. 
9470: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
9480: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9490: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
94a0: 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ext);.    goto e
94b0: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
94c0: 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c  }.  x = fread(p,
94d0: 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 66 63   1, sz, f);.  fc
94e0: 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d 20 30  lose(f);.  f = 0
94f0: 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20 29 7b  ;.  if( x!=sz ){
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9510: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9520: 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 72 65  t, "could not re
9530: 61 64 20 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ad back the whol
9540: 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  e file", -1);.  
9550: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9560: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
9570: 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  bBin ){.    sqli
9580: 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 36  te3_result_blob6
9590: 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20 73 7a  4(context, p, sz
95a0: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
95b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
95c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c 20 6a  lite3_int64 i, j
95d0: 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43 52 4e  ;.    if( hasCRN
95e0: 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  L ){.      /* If
95f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
9600: 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68 65 6e  ntains \r\n then
9610: 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f   do no conversio
9620: 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20 2a 2f  ns back to \n */
9630: 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b 0a 20  .      j = sz;. 
9640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9650: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64  /* If the file d
9660: 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c  id not originall
9670: 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e 20 74  y contain \r\n t
9680: 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e 79 20  hen convert any 
9690: 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c 72 5c  new.      ** \r\
96a0: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e 20 2a  n back into \n *
96b0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d  /.      for(i=j=
96c0: 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b 0a 20  0; i<sz; i++){. 
96d0: 20 20 20 20 20 20 20 69 66 28 20 70 5b 69 5d 3d         if( p[i]=
96e0: 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31 5d 3d  ='\r' && p[i+1]=
96f0: 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\n' ) i++;.   
9700: 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20 70 5b       p[j++] = p[
9710: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9720: 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20 20 20    sz = j;.      
9730: 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  p[sz] = 0;.    }
9740: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65   .    sqlite3_re
9750: 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74  sult_text64(cont
9760: 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ext, (const char
9770: 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20  *)p, sz,.       
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c     sqlite3_free,
97a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
97b0: 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69   }.  p = 0;..edi
97c0: 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66  t_func_end:.  if
97d0: 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b  ( f ) fclose(f);
97e0: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46  .  unlink(zTempF
97f0: 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
9800: 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b  free(zTempFile);
9810: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9820: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  p);.}.#endif /* 
9830: 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
9840: 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  STEM */../*.** S
9850: 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74  ave or restore t
9860: 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75  he current outpu
9870: 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63  t mode.*/.static
9880: 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65   void outputMode
9890: 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20  Push(ShellState 
98a0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72  *p){.  p->modePr
98b0: 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ior = p->mode;. 
98c0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
98d0: 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65  pPrior, p->colSe
98e0: 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28  parator, sizeof(
98f0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9900: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9910: 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72  owSepPrior, p->r
9920: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a  owSeparator, siz
9930: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9940: 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tor));.}.static 
9950: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
9960: 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  op(ShellState *p
9970: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  ){.  p->mode = p
9980: 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d  ->modePrior;.  m
9990: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61  emcpy(p->colSepa
99a0: 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  rator, p->colSep
99b0: 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  Prior, sizeof(p-
99c0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
99d0: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
99e0: 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f  Separator, p->ro
99f0: 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f  wSepPrior, sizeo
9a00: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9a10: 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  r));.}../*.** Ou
9a20: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
9a30: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
9a40: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
9a50: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
9a60: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
9a70: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
9a80: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
9a90: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
9aa0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
9ab0: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
9ac0: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
9ad0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
9ae0: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
9af0: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
9b00: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
9b10: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
9b20: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
9b30: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
9b40: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
9b50: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
9b60: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
9b70: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
9b80: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
9b90: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
9ba0: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
9bb0: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
9bc0: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
9bd0: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
9be0: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
9bf0: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
9c00: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
9c10: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
9c20: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
9c30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
9c40: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
9c50: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c70: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
9c80: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
9c90: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
9ca0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
9cb0: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
9cc0: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
9cd0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
9d00: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
9d10: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
9d20: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
9d30: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
9d40: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
9d50: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
9d60: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
9d70: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
9d80: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
9d90: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
9da0: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
9db0: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
9dc0: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
9dd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
9de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
9df0: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
9e00: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
9e10: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
9e20: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
9e30: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
9e40: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
9e50: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
9e60: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
9e70: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
9e80: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
9e90: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
9ea0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
9eb0: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
9ec0: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
9ed0: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
9ee0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
9ef0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
9f00: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
9f10: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
9f20: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
9f30: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9f40: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
9f50: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
9f60: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
9f70: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
9f80: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
9f90: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
9fa0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
9fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
9fc0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
9fd0: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
9fe0: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
9ff0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
a000: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
a010: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a020: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
a030: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
a040: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
a050: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
a060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a070: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
a080: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a090: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
a0a0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
a0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
a0c0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
a0d0: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
a0e0: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
a0f0: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
a100: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
a110: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
a120: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
a130: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
a140: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
a150: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
a160: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
a170: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
a180: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
a190: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
a1a0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
a1b0: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
a1c0: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
a1d0: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
a1e0: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
a1f0: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
a200: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
a210: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
a220: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
a230: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a240: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a250: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
a260: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
a270: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
a280: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
a290: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
a2a0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
a2b0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
a2c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
a2d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
a2e0: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
a2f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a300: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
a310: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
a320: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
a330: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
a340: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
a350: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
a360: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
a370: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
a380: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
a390: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
a3a0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
a3b0: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
a3c0: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
a3d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a3e0: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
a3f0: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
a400: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
a410: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
a420: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
a430: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
a440: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a450: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
a460: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
a470: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
a480: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
a490: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
a4a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
a4b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
a4c0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
a4d0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
a4e0: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
a4f0: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
a500: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
a510: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
a520: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
a530: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a540: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
a550: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
a560: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
a570: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
a580: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
a590: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a5a0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
a5b0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a5c0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
a5f0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
a600: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
a610: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
a620: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
a630: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
a640: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
a650: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
a660: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a670: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a680: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
a690: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
a6a0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
a6b0: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
a6c0: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
a6d0: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
a6e0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a6f0: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
a700: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
a710: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
a720: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
a730: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
a740: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
a750: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
a760: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
a770: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
a780: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
a790: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
a7a0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
a7b0: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
a7c0: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
a7d0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
a7e0: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
a7f0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
a800: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
a810: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
a820: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
a830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a840: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
a850: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a860: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a870: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
a880: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
a890: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a8a0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a8b0: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
a8c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a8d0: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
a8e0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
a8f0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
a900: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
a910: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
a920: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
a930: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
a940: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
a950: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a960: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
a970: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
a980: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
a990: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
a9a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
a9b0: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a9c0: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
a9d0: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
a9e0: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
a9f0: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
aa00: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
aa10: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
aa20: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
aa30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
aa40: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
aa50: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
aa60: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
aa70: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
aa80: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
aa90: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
aaa0: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
aab0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
aac0: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
aad0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
aaf0: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
ab00: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
ab10: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
ab20: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
ab30: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
ab40: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
ab50: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
ab60: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
ab70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
ab80: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
ab90: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
aba0: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
abb0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
abc0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
abd0: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
abe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
abf0: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
ac00: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
ac10: 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
ac20: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
ac30: 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \"' ){.      raw
ac40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  _printf(out,"&qu
ac50: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
ac60: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
ac70: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
ac80: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
ac90: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
acb0: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
acc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
acd0: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
ace0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
acf0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
ad00: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
ad10: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
ad20: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
ad30: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
ad40: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
ad50: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
ad60: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
ad70: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ad80: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
ad90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
ada0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
adb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
adc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
add0: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
ade0: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
adf0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae00: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
ae10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
ae30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
ae40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
ae50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
ae60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
ae70: 20 20 30 2c 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 20 20 30 2c 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 0a 20 20 30 2c 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 20 20  , 0, 0, 0, 0,   
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aed0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 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 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
af00: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
af10: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
af20: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
af30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
af40: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
af50: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
af60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
af70: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
af80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
afa0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 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 20 20 31 2c 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 0a 20 20 31 2c  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 20 20 31 2c 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 0a   1, 1, 1, 1, 1,.
b010: 20 20 31 2c 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 20 20 31 2c 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 0a 20 20 31 2c 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 20 20  , 1, 1, 1, 1,   
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b070: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 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 20 20 31 2c 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 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
b0b0: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
b0c0: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
b0d0: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
b0e0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
b0f0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
b100: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
b110: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
b120: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
b130: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
b140: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
b150: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
b160: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
b170: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
b180: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
b190: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
b1a0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
b1b0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
b1c0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
b1d0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
b1e0: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
b1f0: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
b200: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
b210: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
b220: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
b230: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
b240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
b250: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
b260: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
b270: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
b280: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
b290: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
b2a0: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
b2b0: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
b2c0: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
b2d0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
b2e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
b2f0: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
b300: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
b310: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
b320: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
b330: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
b340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b350: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
b360: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75  .      char *zQu
b370: 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oted = sqlite3_m
b380: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
b390: 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   z);.      utf8_
b3a0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
b3b0: 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  , zQuoted);.    
b3c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
b3d0: 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c  Quoted);.    }el
b3e0: 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
b3f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
b400: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
b410: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
b420: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b430: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
b440: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  lSeparator);.  }
b450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b460: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
b470: 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65   the user presse
b480: 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74  s Ctrl-C.*/.stat
b490: 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70  ic void interrup
b4a0: 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f  t_handler(int No
b4b0: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
b4c0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
b4d0: 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed);.  seenInter
b4e0: 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65  rupt++;.  if( se
b4f0: 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20  enInterrupt>2 ) 
b500: 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67  exit(1);.  if( g
b510: 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65  lobalDb ) sqlite
b520: 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62  3_interrupt(glob
b530: 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64  alDb);.}..#if (d
b540: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
b550: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
b560: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
b570: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20  IN32_WCE)./*.** 
b580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
b590: 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76  s for console ev
b5a0: 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d  ents (e.g. Ctrl-
b5b0: 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73  C) on Win32.*/.s
b5c0: 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50  tatic BOOL WINAP
b5d0: 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  I ConsoleCtrlHan
b5e0: 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77  dler(.  DWORD dw
b5f0: 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20  CtrlType /* One 
b600: 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56  of the CTRL_*_EV
b610: 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ENT constants */
b620: 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c  .){.  if( dwCtrl
b630: 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45  Type==CTRL_C_EVE
b640: 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72  NT ){.    interr
b650: 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a  upt_handler(0);.
b660: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
b670: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
b680: 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  LSE;.}.#endif..#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
b6b0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
b6c0: 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65  ".auth ON" is se
b6d0: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
b6e0: 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
b6f0: 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  back is.** invok
b700: 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  ed.  It always r
b710: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
b720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b730: 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69  shellAuth(.  voi
b740: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a  d *pClientData,.
b750: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
b760: 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63  t char *zA1,.  c
b770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a  onst char *zA2,.
b780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
b790: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
b7a0: 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  *zA4.){.  ShellS
b7b0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
b7c0: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
b7d0: 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ta;.  static con
b7e0: 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f  st char *azActio
b7f0: 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20  n[] = { 0,.     
b800: 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20  "CREATE_INDEX", 
b810: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
b820: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b830: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  "CREATE_TEMP_IND
b840: 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EX",.     "CREAT
b850: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  E_TEMP_TABLE",  
b860: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
b870: 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54  RIGGER",  "CREAT
b880: 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  E_TEMP_VIEW",.  
b890: 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47     "CREATE_TRIGG
b8a0: 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41  ER",       "CREA
b8b0: 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  TE_VIEW",       
b8c0: 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20     "DELETE",.   
b8d0: 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20    "DROP_INDEX", 
b8e0: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
b8f0: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
b900: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44    "DROP_TEMP_IND
b910: 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EX",.     "DROP_
b920: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b930: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49    "DROP_TEMP_TRI
b940: 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f  GGER",    "DROP_
b950: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b960: 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c   "DROP_TRIGGER",
b970: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56           "DROP_V
b980: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  IEW",           
b990: 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20   "INSERT",.     
b9a0: 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20  "PRAGMA",       
b9b0: 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20          "READ", 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22  "SELECT",.     "
b9e0: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20  TRANSACTION",   
b9f0: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c         "UPDATE",
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ba10: 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44  ATTACH",.     "D
ba20: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20  ETACH",         
ba30: 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42        "ALTER_TAB
ba40: 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52  LE",          "R
ba50: 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41  EINDEX",.     "A
ba60: 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20  NALYZE",        
ba70: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54        "CREATE_VT
ba80: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44  ABLE",        "D
ba90: 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20  ROP_VTABLE",.   
baa0: 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20    "FUNCTION",   
bab0: 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50            "SAVEP
bac0: 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  OINT",          
bad0: 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20    "RECURSIVE".  
bae0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  };.  int i;.  co
baf0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b  nst char *az[4];
bb00: 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a  .  az[0] = zA1;.
bb10: 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20    az[1] = zA2;. 
bb20: 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20   az[2] = zA3;.  
bb30: 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75  az[3] = zA4;.  u
bb40: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb50: 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20  t, "authorizer: 
bb60: 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70  %s", azAction[op
bb70: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
bb80: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61  <4; i++){.    ra
bb90: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bba0: 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61   " ");.    if( a
bbb0: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75  z[i] ){.      ou
bbc0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
bbd0: 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  >out, az[i]);.  
bbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
bbf0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
bc00: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  , "NULL");.    }
bc10: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
bc20: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
bc30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bc40: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
bc50: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68  *.** Print a sch
bc60: 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ema statement.  
bc70: 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d  Part of MODE_Sem
bc80: 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74  i and MODE_Prett
bc90: 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  y output..**.** 
bca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
bcb0: 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54  verts some CREAT
bcc0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bcd0: 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61  ts for shadow ta
bce0: 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f  bles.** in FTS3/
bcf0: 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20  4/5 into CREATE 
bd00: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bd10: 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  STS statements..
bd20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bd30: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46  rintSchemaLine(F
bd40: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
bd50: 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63  char *z, const c
bd60: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69  har *zTail){.  i
bd70: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
bd80: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
bd90: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
bda0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
bdb0: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
bdc0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
bdd0: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
bde0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
bdf0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
be00: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
be10: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
be20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
be30: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
be40: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
be50: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
be60: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
be70: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
be80: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
be90: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
bea0: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
beb0: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
bec0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73  Return true if s
bed0: 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f  tring z[] has no
bee0: 74 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73  thing but whites
bef0: 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  pace and comment
bf00: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  s to the.** end 
bf10: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  of the first lin
bf20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bf30: 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63   wsToEol(const c
bf40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
bf50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
bf60: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
bf70: 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65   z[i]=='\n' ) re
bf80: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
bf90: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20  IsSpace(z[i]) ) 
bfa0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
bfb0: 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[i]=='-' && z
bfc0: 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74  [i+1]=='-' ) ret
bfd0: 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
bfe0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
bff0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
c000: 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20 74 6f  d a new entry to
c010: 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
c020: 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a  RY PLAN data.*/.
c030: 73 74 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f  static void eqp_
c040: 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74 61 74  append(ShellStat
c050: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c060: 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73 74 20  , int p2, const 
c070: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
c080: 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70 4e 65  EQPGraphRow *pNe
c090: 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74 20 3d  w;.  int nText =
c0a0: 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78 74 29   strlen30(zText)
c0b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45  ;.  if( p->autoE
c0c0: 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20 75 74  QPtest ){.    ut
c0d0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c0e0: 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22 2c 20  , "%d,%d,%s\n", 
c0f0: 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54 65 78  iEqpId, p2, zTex
c100: 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d  t);.  }.  pNew =
c110: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
c120: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
c130: 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20 69 66   + nText );.  if
c140: 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68 65 6c  ( pNew==0 ) shel
c150: 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
c160: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71 70 49  );.  pNew->iEqpI
c170: 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20 70 4e  d = iEqpId;.  pN
c180: 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20 3d 20  ew->iParentId = 
c190: 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  p2;.  memcpy(pNe
c1a0: 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78 74 2c  w->zText, zText,
c1b0: 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70 4e 65   nText+1);.  pNe
c1c0: 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  w->pNext = 0;.  
c1d0: 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  if( p->sGraph.pL
c1e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 73 47  ast ){.    p->sG
c1f0: 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e 65 78  raph.pLast->pNex
c200: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73  t = pNew;.  }els
c210: 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61 70 68  e{.    p->sGraph
c220: 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a 20 20  .pRow = pNew;.  
c230: 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e 70 4c  }.  p->sGraph.pL
c240: 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  ast = pNew;.}../
c250: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20 72 65  *.** Free and re
c260: 73 65 74 20 74 68 65 20 45 58 50 4c 41 49 4e 20  set the EXPLAIN 
c270: 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 20  QUERY PLAN data 
c280: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 63 6f  that has been co
c290: 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20 70 2d  llected.** in p-
c2a0: 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74 61 74  >sGraph..*/.stat
c2b0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 73 65  ic void eqp_rese
c2c0: 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
c2d0: 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20  {.  EQPGraphRow 
c2e0: 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pRow, *pNext;. 
c2f0: 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d 3e 73   for(pRow = p->s
c300: 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52 6f 77  Graph.pRow; pRow
c310: 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b  ; pRow = pNext){
c320: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 52 6f  .    pNext = pRo
c330: 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  w->pNext;.    sq
c340: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29  lite3_free(pRow)
c350: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
c360: 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20 73 69  p->sGraph, 0, si
c370: 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 29 29  zeof(p->sGraph))
c380: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c390: 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49 4e 20  he next EXPLAIN 
c3a0: 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e 65 20  QUERY PLAN line 
c3b0: 77 69 74 68 20 69 45 71 70 49 64 20 74 68 61 74  with iEqpId that
c3c0: 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a 2a 2a   occurs after.**
c3d0: 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75 72 6e   pOld, or return
c3e0: 20 74 68 65 20 66 69 72 73 74 20 73 75 63 68 20   the first such 
c3f0: 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69 73 20  line if pOld is 
c400: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 45  NULL.*/.static E
c410: 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71 70 5f  QPGraphRow *eqp_
c420: 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c 53 74  next_row(ShellSt
c430: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c440: 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f 77 20  Id, EQPGraphRow 
c450: 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47 72 61  *pOld){.  EQPGra
c460: 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20 70 4f  phRow *pRow = pO
c470: 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65 78 74  ld ? pOld->pNext
c480: 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70 52 6f   : p->sGraph.pRo
c490: 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 6f 77  w;.  while( pRow
c4a0: 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72 65 6e   && pRow->iParen
c4b0: 74 49 64 21 3d 69 45 71 70 49 64 20 29 20 70 52  tId!=iEqpId ) pR
c4c0: 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65 78 74  ow = pRow->pNext
c4d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f 77 3b  ;.  return pRow;
c4e0: 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20 61 20  .}../* Render a 
c4f0: 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f 66 20  single level of 
c500: 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20 68  the graph that h
c510: 61 73 20 69 45 71 70 49 64 20 61 73 20 69 74 73  as iEqpId as its
c520: 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c 65 64   parent.  Called
c530: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c 79 20  .** recursively 
c540: 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c 65 76  to render sublev
c550: 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  els..*/.static v
c560: 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c  oid eqp_render_l
c570: 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74 65 20  evel(ShellState 
c580: 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64 29 7b  *p, int iEqpId){
c590: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c5a0: 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pRow, *pNext;.  
c5b0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
c5c0: 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66  (p->sGraph.zPref
c5d0: 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ix);.  char *z;.
c5e0: 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65 71 70    for(pRow = eqp
c5f0: 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71  _next_row(p, iEq
c600: 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b 20 70  pId, 0); pRow; p
c610: 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a 20 20  Row = pNext){.  
c620: 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f 6e 65    pNext = eqp_ne
c630: 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70 49 64  xt_row(p, iEqpId
c640: 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a 20 3d  , pRow);.    z =
c650: 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a 20 20   pRow->zText;.  
c660: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c670: 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c 6e 22  >out, "%s%s%s\n"
c680: 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65  , p->sGraph.zPre
c690: 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22 7c 2d  fix, pNext ? "|-
c6a0: 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29 3b 0a  -" : "`--", z);.
c6b0: 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74 29 73      if( n<(int)s
c6c0: 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68 2e  izeof(p->sGraph.
c6d0: 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a 20 20  zPrefix)-7 ){.  
c6e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 73      memcpy(&p->s
c6f0: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c700: 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20 22 20  , pNext ? "|  " 
c710: 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20 20 20  : "   ", 4);.   
c720: 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f 6c 65     eqp_render_le
c730: 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69 45 71  vel(p, pRow->iEq
c740: 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  pId);.      p->s
c750: 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b 6e 5d  Graph.zPrefix[n]
c760: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
c770: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
c780: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 45   and reset the E
c790: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c7a0: 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63  N data.*/.static
c7b0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c7c0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
c7d0: 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a  .  EQPGraphRow *
c7e0: 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61 70 68  pRow = p->sGraph
c7f0: 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70 52 6f  .pRow;.  if( pRo
c800: 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  w ){.    if( pRo
c810: 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27 2d 27  w->zText[0]=='-'
c820: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
c830: 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a  ow->pNext==0 ){.
c840: 20 20 20 20 20 20 20 20 65 71 70 5f 72 65 73 65          eqp_rese
c850: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
c860: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
c870: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c880: 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
c890: 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29 3b 0a  pRow->zText+3);.
c8a0: 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70 68 2e        p->sGraph.
c8b0: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c8c0: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
c8d0: 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a 20 20  3_free(pRow);.  
c8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
c8f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c900: 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e 5c 6e  t, "QUERY PLAN\n
c910: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ");.    }.    p-
c920: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c930: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71 70 5f  0] = 0;.    eqp_
c940: 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70 2c 20  render_level(p, 
c950: 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65 73 65  0);.    eqp_rese
c960: 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  t(p);.  }.}..#if
c970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c980: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
c990: 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72 65 73  CK./*.** Progres
c9a0: 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  s handler callba
c9b0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
c9c0: 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  t progress_handl
c9d0: 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  er(void *pClient
c9e0: 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c 6c 53  Data) {.  ShellS
c9f0: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
ca00: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
ca10: 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67 72 65  ta;.  p->nProgre
ca20: 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ss++;.  if( p->n
ca30: 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d 78 50  Progress>=p->mxP
ca40: 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e 6d 78  rogress && p->mx
ca50: 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a 20 20  Progress>0 ){.  
ca60: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ca70: 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20 6c  out, "Progress l
ca80: 69 6d 69 74 20 72 65 61 63 68 65 64 20 28 25 75  imit reached (%u
ca90: 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72 65  )\n", p->nProgre
caa0: 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ss);.    if( p->
cab0: 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20 53 48  flgProgress & SH
cac0: 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52 45 53  ELL_PROGRESS_RES
cad0: 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72 65 73  ET ) p->nProgres
cae0: 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
caf0: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb00: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 4f  SHELL_PROGRESS_O
cb10: 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f 67 72  NCE ) p->mxProgr
cb20: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ess = 0;.    ret
cb30: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
cb40: 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73   (p->flgProgress
cb50: 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53   & SHELL_PROGRES
cb60: 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b 0a 20  S_QUIET)==0 ){. 
cb70: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
cb80: 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73 20  >out, "Progress 
cb90: 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67 72  %u\n", p->nProgr
cba0: 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ess);.  }.  retu
cbb0: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
cbc0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  * SQLITE_OMIT_PR
cbd0: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 20  OGRESS_CALLBACK 
cbe0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  */../*.** This i
cbf0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
cc00: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
cc10: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
cc20: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
cc30: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cc40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
cc50: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
cc60: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
cc70: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
cc80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
cc90: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
cca0: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
ccb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
ccc0: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
ccd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
cce0: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
ccf0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
cd00: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
cd10: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
cd20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
cd30: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
cd40: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
cd50: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
cd60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
cd70: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
cd80: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
cd90: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
cda0: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
cdb0: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
cdc0: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
cdd0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cde0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
cdf0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
ce00: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
ce10: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
ce20: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
ce30: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
ce40: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
ce50: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
ce60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
ce70: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
ce80: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ce90: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cea0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
ceb0: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
cec0: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
ced0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
cee0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
cef0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
cf00: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
cf10: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
cf20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cf40: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
cf50: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
cf60: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
cf70: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
cf80: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
cf90: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
cfa0: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
cfb0: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
cfc0: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
cfd0: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
cfe0: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
cff0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
d000: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
d010: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d020: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
d030: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
d040: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
d050: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
d060: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d070: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d080: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
d090: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
d0a0: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
d0b0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
d0c0: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
d0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d0e0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
d0f0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
d100: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
d120: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
d130: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
d140: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
d150: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
d160: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
d170: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d180: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
d190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d1a0: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
d1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
d1c0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
d1d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
d1e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
d1f0: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
d200: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
d210: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
d220: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
d230: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d240: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d260: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
d270: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d280: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
d290: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
d2a0: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
d2b0: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
d2c0: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
d2e0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
d2f0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
d300: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
d310: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
d320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d330: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d340: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
d350: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
d360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d380: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d390: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
d3a0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
d3c0: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
d3d0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d3e0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
d400: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
d410: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
d420: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
d430: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
d440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d450: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
d460: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
d470: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
d480: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d490: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
d4a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d4b0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d500: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
d540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d550: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
d560: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
d570: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d590: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
d5a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
d5b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d5c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d5d0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
d5e0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
d5f0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
d600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
d610: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
d620: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
d630: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
d640: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
d650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d660: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
d670: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
d680: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
d690: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
d6a0: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
d6b0: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
d6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d6d0: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
d6e0: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
d6f0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
d700: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
d710: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
d720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d730: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d740: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
d750: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
d760: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
d770: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
d780: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
d790: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
d7a0: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
d7b0: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
d7c0: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
d7d0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
d7e0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d7f0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d800: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
d810: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
d820: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d830: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d840: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
d850: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
d860: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
d870: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
d880: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
d890: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
d8a0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
d8b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
d8c0: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
d8d0: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
d8e0: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
d8f0: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
d900: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
d910: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
d920: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
d930: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
d940: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
d950: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
d960: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
d970: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
d980: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
d990: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
d9a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
d9b0: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
d9c0: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
d9d0: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
d9e0: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
d9f0: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
da00: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
da10: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
da20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
da30: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
da40: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
da50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da60: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
da70: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
da80: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
da90: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
daa0: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
dab0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
dac0: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
dad0: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
dae0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
daf0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
db00: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
db10: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
db20: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
db30: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
db40: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
db50: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
db60: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
db70: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
db80: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
db90: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
dba0: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbc0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
dbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
dbe0: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
dbf0: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
dc00: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
dc10: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
dc20: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
dc30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
dc40: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
dc50: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
dc60: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
dc70: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
dc80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
dc90: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
dca0: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
dcb0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
dcc0: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
dcd0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
dce0: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
dcf0: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
dd00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dd10: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
dd20: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
dd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dd40: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
dd50: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
dd60: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dd70: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
dd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
dd90: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
dda0: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
ddb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ddc0: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
ddd0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
ddf0: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
de00: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
de20: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
de30: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
de40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
de50: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
de60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
de70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
de80: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
de90: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
dea0: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
deb0: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
dec0: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
ded0: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
dee0: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
def0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
df00: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
df10: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
df20: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
df30: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
df40: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
df50: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
df60: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
df70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
df80: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
df90: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dfb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
dfc0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
dfd0: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
dfe0: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
dff0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
e000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
e010: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e020: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e030: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
e040: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e050: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e070: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
e090: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e0a0: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
e0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0c0: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
e0d0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
e0e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e0f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e100: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
e110: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
e120: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e130: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e140: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
e150: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
e160: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
e170: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
e180: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e190: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1a0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
e1b0: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
e1c0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
e1d0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e1e0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e1f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e200: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
e210: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e220: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e230: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
e240: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
e250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e260: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
e270: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e280: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e290: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e2a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
e2b0: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
e2c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e2d0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e2e0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
e2f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
e300: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
e310: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
e320: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
e330: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          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 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
e360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
e370: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e380: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
e390: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
e3a0: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
e3b0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e3c0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
e3d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e3e0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e3f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e400: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
e410: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
e420: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
e430: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
e440: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
e450: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
e460: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e470: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
e480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
e490: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
e4a0: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
e4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e4c0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
e4d0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e4e0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
e4f0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
e500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e510: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e520: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
e530: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
e540: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
e550: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
e560: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
e570: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e580: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
e590: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e5a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
e5b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e5c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
e5d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
e5f0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
e610: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
e620: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
e630: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
e640: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
e650: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
e660: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
e670: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
e680: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
e690: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
e6a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
e6b0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e6c0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e6d0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e6e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e6f0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
e700: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
e710: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
e720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
e730: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
e740: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
e750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
e760: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
e770: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
e780: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
e790: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
e7a0: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
e7b0: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
e7c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
e7d0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
e7e0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
e7f0: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
e800: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
e810: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e820: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
e830: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
e840: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
e850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e860: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e870: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e880: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e890: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
e8a0: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
e8b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e8c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
e8d0: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
e8e0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
e8f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
e900: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e910: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
e920: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
e930: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
e940: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e950: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
e960: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
e970: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e980: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e990: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e9a0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
e9b0: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
e9c0: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
e9d0: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
e9f0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
ea00: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
ea10: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
ea20: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
ea30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ea40: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
ea50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
ea60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ea70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
ea80: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
ea90: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
eaa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eac0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ead0: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
eae0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
eaf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
eb00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
eb10: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
eb20: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
eb30: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
eb40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
eb50: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
eb60: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
eb70: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
eb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
eb90: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
eba0: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
ebb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
ebc0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
ebd0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
ebe0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
ebf0: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
ec00: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
ec20: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
ec30: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
ec40: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
ec50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ec60: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
ec70: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
ec80: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
ec90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
eca0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ecb0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
ecc0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
ecd0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
ece0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
ecf0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
ed00: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
ed10: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
ed20: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
ed30: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
ed40: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
ed50: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
ed60: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
ed70: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
ed80: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
ed90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
eda0: 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20 20 20  t64 ur;.        
edb0: 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26 72 2c    memcpy(&ur,&r,
edc0: 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 20 20  sizeof(r));.    
edd0: 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d 30 78        if( ur==0x
ede0: 37 66 66 30 30 30 30 30 30 30 30 30 30 30 30 30  7ff0000000000000
edf0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
ee00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
ee10: 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b 0a 20  out, "1e999");. 
ee20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
ee30: 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30 30 30  f( ur==0xfff0000
ee40: 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b 0a 20  000000000LL ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
ee60: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2d  rintf(p->out, "-
ee70: 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20 20 20  1e999");.       
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
eea0: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
eeb0: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
eec0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
eed0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
eee0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
eef0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ef00: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
ef10: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f  e[i]==SQLITE_BLO
ef20: 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  B && p->pStmt ){
ef30: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
ef40: 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20 73   void *pBlob = s
ef50: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
ef60: 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  ob(p->pStmt, i);
ef70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ef80: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
ef90: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e 70  olumn_bytes(p->p
efa0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
efb0: 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f 62      output_hex_b
efc0: 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c 6f  lob(p->out, pBlo
efd0: 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20 20  b, nBlob);.     
efe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e     }else if( isN
eff0: 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c 20  umber(azArg[i], 
f000: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
f010: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f020: 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  ut,"%s", azArg[i
f030: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
f040: 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c  e if( ShellHasFl
f050: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
f060: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
f070: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
f080: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
f090: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
f0c0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
f0d0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
f0e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
f0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
f100: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 29  printf(p->out,")
f110: 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ;\n");.      bre
f120: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f130: 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20 7b  se MODE_Quote: {
f140: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
f150: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f160: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d 30     if( p->cnt==0
f170: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
f180: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
f190: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
f1a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
f1b0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
f1c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
f1e0: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
f1f0: 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69 5d  p->out, azCol[i]
f200: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f210: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f220: 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  p->out,"\n");.  
f230: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63      }.      p->c
f240: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt++;.      for(
f250: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
f260: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
f270: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
f280: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
f290: 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72 67        if( (azArg
f2a0: 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54 79  [i]==0) || (aiTy
f2b0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
f2c0: 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b  =SQLITE_NULL) ){
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
f2e0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 4e  printf(p->out,"N
f2f0: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 7d  ULL");.        }
f300: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
f310: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
f320: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
f330: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
f340: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
f350: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
f360: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f370: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
f380: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
f390: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
f3a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f3b0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f3c0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f3d0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
f3e0: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
f3f0: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
f400: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
f410: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
f420: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
f430: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
f440: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f460: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
f470: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
f480: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f490: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
f4a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f4b0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f4c0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
f4d0: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
f4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f4f0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
f500: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f510: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
f520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
f530: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
f540: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
f550: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
f560: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f570: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f580: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f590: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f5a0: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f5b0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f5c0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f5d0: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f5e0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f5f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  lse{.          o
f600: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
f610: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
f620: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
f630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f640: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
f650: 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  ,"\n");.      br
f660: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f670: 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a 20  ase MODE_Ascii: 
f680: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
f690: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
f6a0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
f6b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f6c0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
f6d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75       if( i>0 ) u
f6e0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f6f0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
f700: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
f710: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
f720: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 43  (p->out,"%s",azC
f730: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
f740: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
f750: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
f760: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f770: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f780: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
f790: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
f7a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f7b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
f7c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f7d0: 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72  f( i>0 ) utf8_pr
f7e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
f7f0: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
f800: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  or);.        utf
f810: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f820: 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f 20  "%s",azArg[i] ? 
f830: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
f840: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
f850: 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  }.      utf8_pri
f860: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
f870: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
f880: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
f890: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f8a0: 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20 20 20  MODE_EQP: {.    
f8b0: 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70 2c 20    eqp_append(p, 
f8c0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
f8d0: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 2c 20  atoi(azArg[1]), 
f8e0: 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20 20 20  azArg[3]);.     
f8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f900: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f910: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
f920: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
f930: 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51 4c  ine that the SQL
f940: 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69  ite library.** i
f950: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
f960: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
f970: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
f980: 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f   int callback(vo
f990: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
f9a0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
f9b0: 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b  , char **azCol){
f9c0: 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64  .  /* since we d
f9d0: 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20 69  on't have type i
f9e0: 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68  nfo, call the sh
f9f0: 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74  ell_callback wit
fa00: 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a  h a NULL value *
fa10: 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c  /.  return shell
fa20: 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  _callback(pArg, 
fa30: 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43  nArg, azArg, azC
fa40: 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a  ol, NULL);.}../*
fa50: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
fa60: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
fa70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78   from sqlite3_ex
fa80: 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e 64  ec() that append
fa90: 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20  s all.** output 
faa0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
fab0: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
fac0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
fad0: 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74 43  t captureOutputC
fae0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
faf0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
fb00: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
fb10: 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54   **az){.  ShellT
fb20: 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54  ext *p = (ShellT
fb30: 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ext*)pArg;.  int
fb40: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
fb50: 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66  AMETER(az);.  if
fb60: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74  ( azArg==0 ) ret
fb70: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  urn 0;.  if( p->
fb80: 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  n ) appendText(p
fb90: 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72  , "|", 0);.  for
fba0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
fbb0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20  +){.    if( i ) 
fbc0: 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c  appendText(p, ",
fbd0: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
fbe0: 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64  zArg[i] ) append
fbf0: 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d  Text(p, azArg[i]
fc00: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
fc10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
fc20: 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f  enerate an appro
fc30: 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54 20  priate SELFTEST 
fc40: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69  table in the mai
fc50: 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  n database..*/.s
fc60: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
fc70: 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53  eSelftestTable(S
fc80: 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20  hellState *p){. 
fc90: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fca0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   0;.  sqlite3_ex
fcb0: 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53  ec(p->db,.    "S
fcc0: 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73  AVEPOINT selftes
fcd0: 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22  t_init;\n".    "
fce0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
fcf0: 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66 74  NOT EXISTS selft
fd00: 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74  est(\n".    "  t
fd10: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
fd20: 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20  RY KEY,\n"   /* 
fd30: 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Test number */. 
fd40: 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e     "  op TEXT,\n
fd50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fd60: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a      /* Operator:
fd70: 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20    memo run */.  
fd80: 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e    "  cmd TEXT,\n
fd90: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
fda0: 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65     /* Command te
fdb0: 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73  xt */.    "  ans
fdc0: 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20   TEXT\n"        
fdd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
fde0: 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a  sired answer */.
fdf0: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52      ");".    "CR
fe00: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
fe10: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70  [_shell$self](op
fe20: 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20  ,cmd,ans);\n".  
fe30: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
fe40: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77  _shell$self](row
fe50: 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20  id,op,cmd)\n".  
fe60: 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c    "  VALUES(coal
fe70: 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61  esce((SELECT (ma
fe80: 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46  x(tno)+100)/10 F
fe90: 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30  ROM selftest),10
fea0: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  ),\n".    "     
feb0: 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74      'memo','Test
fec0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d  s generated by -
fed0: 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20  -init');\n".    
fee0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
fef0: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
ff00: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
ff10: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27  ',\n".    "    '
ff20: 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f  SELECT hex(sha3_
ff30: 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 74  query(''SELECT t
ff40: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
ff50: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff70: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
ff80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
ff90: 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29 27  ER BY 2'',224))'
ffa0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65  ,\n".    "    he
ffb0: 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53 45  x(sha3_query('SE
ffc0: 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74  LECT type,name,t
ffd0: 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20  bl_name,sql ".  
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71          "FROM sq
10000 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45  lite_master ORDE
10010 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e  R BY 2',224));\n
10020 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10030 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
10040 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
10050 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20  T 'run',".    " 
10060 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28 73     'SELECT hex(s
10070 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45  ha3_query(''SELE
10080 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c  CT * FROM \"' ||
10090 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 70  ".    "        p
100a0 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29  rintf('%w',name)
100b0 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45   || '\" NOT INDE
100c0 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22  XED'',224))',\n"
100d0 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68  .    "    hex(sh
100e0 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28  a3_query(printf(
100f0 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  'SELECT * FROM \
10100 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  "%w\" NOT INDEXE
10110 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e  D',name),224))\n
10120 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c  ".    "  FROM (\
10130 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45  n".    "    SELE
10140 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
10150 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20  ite_master\n".  
10160 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74 79    "     WHERE ty
10170 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20  pe='table'\n".  
10180 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61    "       AND na
10190 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e  me<>'selftest'\n
101a0 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41 4e  ".    "       AN
101b0 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
101c0 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20  age,0)>0\n".    
101d0 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52  "  )\n".    " OR
101e0 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a  DER BY name;\n".
101f0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
10200 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
10210 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53 28  ".    "  VALUES(
10220 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e  'run','PRAGMA in
10230 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27  tegrity_check','
10240 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ok');\n".    "IN
10250 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65  SERT INTO selfte
10260 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e  st(tno,op,cmd,an
10270 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  s)".    "  SELEC
10280 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d  T rowid*10,op,cm
10290 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65  d,ans FROM [_she
102a0 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20  ll$self];\n".   
102b0 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73   "DROP TABLE [_s
102c0 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20  hell$self];".   
102d0 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b   ,0,0,&zErrMsg);
102e0 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
102f0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10300 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54  f(stderr, "SELFT
10310 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  EST initializati
10320 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e  on failure: %s\n
10330 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
10340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
10350 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71  rrMsg);.  }.  sq
10360 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
10370 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74  , "RELEASE selft
10380 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29  est_init",0,0,0)
10390 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
103a0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
103b0 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74  table field of t
103c0 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74  he ShellState st
103d0 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68  ructure to.** th
103e0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
103f0 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61  ble given.  Esca
10400 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61  pe any quote cha
10410 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a  racters in the.*
10420 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f  * table name..*/
10430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
10440 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c  _table_name(Shel
10450 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
10460 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
10470 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61   int i, n;.  cha
10480 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
10490 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a   *z;..  if( p->z
104a0 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20  DestTable ){.   
104b0 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61   free(p->zDestTa
104c0 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  ble);.    p->zDe
104d0 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  stTable = 0;.  }
104e0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
104f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f  ) return;.  cQuo
10500 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
10510 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72  Name);.  n = str
10520 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
10530 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b  if( cQuote ) n +
10540 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e  = n+2;.  z = p->
10550 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c  zDestTable = mal
10560 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66  loc( n+1 );.  if
10570 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f  ( z==0 ) shell_o
10580 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a  ut_of_memory();.
10590 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63    n = 0;.  if( c
105a0 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
105b0 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69   cQuote;.  for(i
105c0 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
105d0 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d  +){.    z[n++] =
105e0 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69   zName[i];.    i
105f0 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75  f( zName[i]==cQu
10600 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
10610 51 75 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Quote;.  }.  if(
10620 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
10630 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e   = cQuote;.  z[n
10640 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ] = 0;.}.../*.**
10650 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
10660 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
10670 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51  will generate SQ
10680 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74  L output.  Print
10690 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
106a0 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65  olumns, comma-se
106b0 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69  parated, on a li
106c0 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20  ne and then add 
106d0 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74  a.** semicolon t
106e0 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65  erminator to the
106f0 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e   end of that lin
10700 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10710 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
10720 73 20 69 73 20 31 20 61 6e 64 20 74 68 61 74 20  s is 1 and that 
10730 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
10740 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65  text "--".** the
10750 6e 20 77 72 69 74 65 20 74 68 65 20 73 65 6d 69  n write the semi
10760 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72  colon on a separ
10770 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20  ate line.  That 
10780 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d  way, if a.** "--
10790 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73  " comment occurs
107a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
107b0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
107c0 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e  e comment.** won
107d0 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73  't consume the s
107e0 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
107f0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
10800 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d  nt run_table_dum
10810 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
10820 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
10830 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e      /* Query con
10840 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
10850 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20  char *zSelect,  
10860 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
10870 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63  tement to extrac
10880 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63  t content */.  c
10890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73  onst char *zFirs
108a0 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74  tRow    /* Print
108b0 20 62 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f   before first ro
108c0 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  w, if not NULL *
108d0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
108e0 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20  tmt *pSelect;.  
108f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52  int rc;.  int nR
10900 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  esult;.  int i;.
10910 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10930 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
10940 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26  , zSelect, -1, &
10950 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10970 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a   || !pSelect ){.
10980 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
10990 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
109a0 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
109b0 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
109d0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
109e0 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
109f0 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
10a00 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
10a10 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ++;.    return r
10a20 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  c;.  }.  rc = sq
10a30 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10a40 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  ct);.  nResult =
10a50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
10a60 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a  count(pSelect);.
10a70 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10a80 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
10a90 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a  f( zFirstRow ){.
10aa0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
10ab0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
10ac0 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20  zFirstRow);.    
10ad0 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b    zFirstRow = 0;
10ae0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28  .    }.    z = (
10af0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10b00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10b10 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
10b20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
10b30 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  out, "%s", z);. 
10b40 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52     for(i=1; i<nR
10b50 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  esult; i++){.   
10b60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10b70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71  ->out, ",%s", sq
10b80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10b90 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a  t(pSelect, i));.
10ba0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d      }.    if( z=
10bb0 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20  =0 ) z = "";.   
10bc0 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20   while( z[0] && 
10bd0 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]!='-' || z[
10be0 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a  1]!='-') ) z++;.
10bf0 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a      if( z[0] ){.
10c00 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10c10 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22  (p->out, "\n;\n"
10c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10c30 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10c40 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20  ->out, ";\n");. 
10c50 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
10c60 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65  lite3_step(pSele
10c70 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ct);.  }.  rc = 
10c80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
10c90 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28  (pSelect);.  if(
10ca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10cb0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
10cc0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
10cd0 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
10ce0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10d00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10d10 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10d20 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10d30 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10d40 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rr++;.  }.  retu
10d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10d60 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61  Allocate space a
10d70 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75 72 72  nd save off curr
10d80 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67  ent error string
10d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
10da0 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a   *save_err_msg(.
10db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20    sqlite3 *db   
10dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10dd0 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10de0 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73  .){.  int nErrMs
10df0 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73  g = 1+strlen30(s
10e00 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
10e10 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ));.  char *zErr
10e20 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Msg = sqlite3_ma
10e30 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b  lloc64(nErrMsg);
10e40 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29  .  if( zErrMsg )
10e50 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72  {.    memcpy(zEr
10e60 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72  rMsg, sqlite3_er
10e70 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73  rmsg(db), nErrMs
10e80 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
10e90 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66   zErrMsg;.}..#if
10ea0 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a  def __linux__./*
10eb0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  .** Attempt to d
10ec0 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73  isplay I/O stats
10ed0 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20   on Linux using 
10ee0 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a  /proc/PID/io.*/.
10ef0 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
10f00 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28  layLinuxIoStats(
10f10 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49  FILE *out){.  FI
10f20 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a  LE *in;.  char z
10f30 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  [200];.  sqlite3
10f40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
10f50 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25  (z), z, "/proc/%
10f60 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29  d/io", getpid())
10f70 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
10f80 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  , "rb");.  if( i
10f90 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
10fa0 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c   while( fgets(z,
10fb0 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21   sizeof(z), in)!
10fc0 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
10fd0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10fe0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
10ff0 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20   *zPattern;.    
11000 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
11010 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e  esc;.    } aTran
11020 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  s[] = {.      { 
11030 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "rchar: ",      
11040 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
11050 65 73 20 72 65 63 65 69 76 65 64 20 62 79 20 72  es received by r
11060 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20  ead():" },.     
11070 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20   { "wchar: ",   
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11090 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72  Bytes sent to wr
110a0 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20  ite():"    },.  
110b0 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c      { "syscr: ",
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 22 52 65 61 64 28 29 20 73 79 73 74 65 6d    "Read() system
110e0 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c   calls:"      },
110f0 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a  .      { "syscw:
11100 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
11110 20 20 20 20 20 22 57 72 69 74 65 28 29 20 73 79       "Write() sy
11120 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20  stem calls:"    
11130 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61   },.      { "rea
11140 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20  d_bytes: ",     
11150 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 72          "Bytes r
11160 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65  ead from storage
11170 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  :"  },.      { "
11180 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20  write_bytes: ", 
11190 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65             "Byte
111a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f  s written to sto
111b0 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20  rage:" },.      
111c0 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69  { "cancelled_wri
111d0 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43  te_bytes: ",  "C
111e0 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62  ancelled write b
111f0 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20  ytes:"    },.   
11200 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
11210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
11220 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b  raySize(aTrans);
11230 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
11240 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54   n = strlen30(aT
11250 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
11260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
11270 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  ncmp(aTrans[i].z
11280 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d  Pattern, z, n)==
11290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  0 ){.        utf
112a0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
112b0 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73  -36s %s", aTrans
112c0 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d  [i].zDesc, &z[n]
112d0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
112e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
112f0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29    }.  fclose(in)
11300 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11310 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67  * Display a sing
11320 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75  le line of statu
11330 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76  s using 64-bit v
11340 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
11350 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61   void displaySta
11360 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74  tLine(.  ShellSt
11370 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
11380 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20     /* The shell 
11390 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61  context */.  cha
113a0 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20  r *zLabel,      
113b0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
113c0 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e  for this one lin
113d0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f  e */.  char *zFo
113e0 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20  rmat,           
113f0 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74   /* Format for t
11400 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69  he result */.  i
11410 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20  nt iStatusCtrl, 
11420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
11430 68 20 73 74 61 74 75 73 20 74 6f 20 64 69 73 70  h status to disp
11440 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  lay */.  int bRe
11450 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
11460 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
11470 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
11480 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
11490 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  t64 iCur = -1;. 
114a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
114b0 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Hiwtr = -1;.  in
114c0 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20  t i, nPercent;. 
114d0 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d   char zLine[200]
114e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74  ;.  sqlite3_stat
114f0 75 73 36 34 28 69 53 74 61 74 75 73 43 74 72 6c  us64(iStatusCtrl
11500 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11510 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72  , bReset);.  for
11520 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30  (i=0, nPercent=0
11530 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b  ; zFormat[i]; i+
11540 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72  +){.    if( zFor
11550 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50  mat[i]=='%' ) nP
11560 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  ercent++;.  }.  
11570 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29  if( nPercent>1 )
11580 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
11590 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
115a0 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f  ine), zLine, zFo
115b0 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77  rmat, iCur, iHiw
115c0 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tr);.  }else{.  
115d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
115e0 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  tf(sizeof(zLine)
115f0 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74  , zLine, zFormat
11600 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20  , iHiwtr);.  }. 
11610 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
11620 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22  ut, "%-36s %s\n"
11630 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29  , zLabel, zLine)
11640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
11650 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e  ay memory stats.
11660 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
11670 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20  isplay_stats(.  
11680 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
116a0 61 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79  atabase to query
116b0 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65   */.  ShellState
116c0 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20   *pArg,         
116d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
116e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20  ShellState */.  
116f0 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
11700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11710 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
11720 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69   stats */.){.  i
11730 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69  nt iCur;.  int i
11740 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f  Hiwtr;.  FILE *o
11750 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d  ut;.  if( pArg==
11760 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d  0 || pArg->out==
11770 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11780 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b  out = pArg->out;
11790 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53  ..  if( pArg->pS
117a0 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74  tmt && (pArg->st
117b0 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20  atsOn & 2) ){.  
117c0 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78    int nCol, i, x
117d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
117e0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67  mt *pStmt = pArg
117f0 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61  ->pStmt;.    cha
11800 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43  r z[100];.    nC
11810 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
11820 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
11830 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11840 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c  (out, "%-36s %d\
11850 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f  n", "Number of o
11860 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c  utput columns:",
11870 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28   nCol);.    for(
11880 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
11890 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
118a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
118b0 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64  (z),z,"Column %d
118c0 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78   %nname:", i, &x
118d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
118e0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
118f0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11900 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
11910 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65  Stmt,i));.#ifnde
11920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
11930 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c  CLTYPE.      sql
11940 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11950 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64  , z+x, "declared
11960 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20   type:");.      
11970 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
11980 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
11990 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
119a0 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c  _decltype(pStmt,
119b0 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66   i));.#endif.#if
119c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
119d0 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
119e0 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  A.      sqlite3_
119f0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11a00 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65  , "database name
11a10 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11a20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11a30 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11a40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
11a50 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  base_name(pStmt,
11a60 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i));.      sqlit
11a70 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
11a80 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65  z+x, "table name
11a90 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11aa0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11ab0 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11ac0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
11ad0 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
11ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11af0 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
11b00 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22  , "origin name:"
11b10 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
11b20 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
11b30 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
11b40 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
11b50 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b  _name(pStmt,i));
11b60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
11b70 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  }..  displayStat
11b80 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f  Line(pArg, "Memo
11b90 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  ry Used:",.     
11ba0 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11bb0 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
11bc0 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53  STATUS_MEMORY_US
11bd0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  ED, bReset);.  d
11be0 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11bf0 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20  Arg, "Number of 
11c00 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f  Outstanding Allo
11c10 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20  cations:",.     
11c20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29  "%lld (max %lld)
11c30 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
11c40 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62  _MALLOC_COUNT, b
11c50 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41  Reset);.  if( pA
11c60 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
11c70 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
11c80 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74  ){.    displaySt
11c90 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
11ca0 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 50  mber of Pcache P
11cb0 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20  ages Used:",.   
11cc0 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
11cd0 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c  lld) pages", SQL
11ce0 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
11cf0 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65  ACHE_USED, bRese
11d00 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61  t);.  }.  displa
11d10 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
11d20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
11d30 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  e Overflow Bytes
11d40 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28  :",.     "%lld (
11d50 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22  max %lld) bytes"
11d60 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
11d70 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
11d80 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64  OW, bReset);.  d
11d90 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
11da0 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c  Arg, "Largest Al
11db0 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
11dc0 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
11dd0 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
11de0 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  LOC_SIZE, bReset
11df0 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74  );.  displayStat
11e00 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
11e10 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
11e20 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
11e30 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
11e40 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
11e50 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74  CHE_SIZE, bReset
11e60 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52 41 43  );.#ifdef YYTRAC
11e70 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20  KMAXSTACKDEPTH. 
11e80 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11e90 28 70 41 72 67 2c 20 22 44 65 65 70 65 73 74 20  (pArg, "Deepest 
11ea0 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a  Parser Stack:",.
11eb0 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
11ec0 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
11ed0 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41  TATUS_PARSER_STA
11ee0 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e  CK, bReset);.#en
11ef0 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b  dif..  if( db ){
11f00 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
11f10 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
11f20 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
11f30 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
11f40 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
11f50 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
11f60 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
11f70 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
11f80 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
11f90 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
11fa0 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11fb0 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
11fc0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
11fe0 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
11ff0 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
12000 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
12010 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
12020 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
12030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12040 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12050 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12060 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
12090 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
120a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
120b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
120c0 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
120d0 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
120e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
120f0 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
12100 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12110 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12120 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
12130 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
12160 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
12170 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
12180 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
12190 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
121a0 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
121b0 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
121c0 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
121d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
121e0 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
121f0 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12200 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
12210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12220 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
12230 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
12240 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
12250 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
12260 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
12270 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
12280 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12290 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
122a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
122b0 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
122c0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
122d0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
122e0 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
122f0 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
12300 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
12310 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12320 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
12330 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12350 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
12360 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
12370 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12380 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
12390 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
123a0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
123b0 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
123c0 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
123d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
123e0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
123f0 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
12420 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
12430 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
12440 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12450 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12460 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
12470 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
12480 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
12490 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
124a0 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
124d0 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
124e0 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
124f0 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12500 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
12510 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
12520 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
12530 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12540 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12550 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12580 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
12590 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
125a0 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
125b0 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
125c0 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69  _CACHE_SPILL, &i
125d0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
125e0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
125f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12600 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20  e cache spills: 
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12620 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12630 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12640 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12650 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12660 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12670 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26  S_SCHEMA_USED, &
12680 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
12690 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
126a0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
126b0 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55  , "Schema Heap U
126c0 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
126d0 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
126e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
126f0 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77   iCur);.    iHiw
12700 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
12710 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
12720 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
12730 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55  _DBSTATUS_STMT_U
12740 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
12750 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
12760 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12770 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65  g->out, "Stateme
12780 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64  nt Heap/Lookasid
12790 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64  e Usage:      %d
127a0 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
127b0 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
127c0 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70  }..  if( pArg->p
127d0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
127e0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
127f0 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
12800 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
12810 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
12820 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
12850 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12860 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
12870 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
12890 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
128a0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
128b0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
128c0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
128d0 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
128e0 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
128f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12900 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
12910 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
12920 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
12930 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
12940 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
12950 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
12960 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
12970 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
12980 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12990 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
129a0 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
129b0 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
129c0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
129d0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
129e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
129f0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12a00 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12a10 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
12a20 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12a30 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12a40 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
12a50 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
12a60 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12a70 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12a80 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12a90 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12aa0 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12ab0 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52 65 73  _REPREPARE, bRes
12ac0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
12ad0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12ae0 52 65 70 72 65 70 61 72 65 20 6f 70 65 72 61 74  Reprepare operat
12af0 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12b00 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
12b10 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
12b20 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
12b30 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
12b40 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
12b50 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20  _RUN, bReset);. 
12b60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12b70 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72  rg->out, "Number
12b80 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20   of times run:  
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
12ba0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
12bb0 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
12bc0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12bd0 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12be0 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53  STMTSTATUS_MEMUS
12bf0 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  ED, bReset);.   
12c00 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12c10 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75  ->out, "Memory u
12c20 73 65 64 20 62 79 20 70 72 65 70 61 72 65 64 20  sed by prepared 
12c30 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c  stmt:        %d\
12c40 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a  n", iCur);.  }..
12c50 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f  #ifdef __linux__
12c60 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  .  displayLinuxI
12c70 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74  oStats(pArg->out
12c80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
12c90 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68  Do not remove th
12ca0 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61  is machine reada
12cb0 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74  ble comment: ext
12cc0 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d  ra-stats-output-
12cd0 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  here */..  retur
12ce0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  n 0;.}../*.** Di
12cf0 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73  splay scan stats
12d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12d10 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61   display_scansta
12d20 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
12d30 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
12d40 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
12d50 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  e to query */.  
12d60 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67  ShellState *pArg
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
12d90 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23  ellState */.){.#
12da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
12db0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
12dc0 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41  ATUS.  UNUSED_PA
12dd0 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
12de0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12df0 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69  pArg);.#else.  i
12e00 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a  nt i, k, n, mx;.
12e10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12e20 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
12e30 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d  - scanstats ----
12e40 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d  ----\n");.  mx =
12e50 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   0;.  for(k=0; k
12e60 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  <=mx; k++){.    
12e70 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20  double rEstLoop 
12e80 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69  = 1.0;.    for(i
12e90 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20  =n=0; 1; i++){. 
12ea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
12eb0 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74  t *p = pArg->pSt
12ec0 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mt;.      sqlite
12ed0 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e  3_int64 nLoop, n
12ee0 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75  Visit;.      dou
12ef0 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20  ble rEst;.      
12f00 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20  int iSid;.      
12f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70  const char *zExp
12f20 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  lain;.      if( 
12f30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
12f40 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
12f50 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
12f60 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
12f70 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  op) ){.        b
12f80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12f90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
12fa0 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
12fb0 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
12fc0 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69  T_SELECTID, (voi
12fd0 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20  d*)&iSid);.     
12fe0 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d   if( iSid>mx ) m
12ff0 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20  x = iSid;.      
13000 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f  if( iSid!=k ) co
13010 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
13020 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
13030 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f    rEstLoop = (do
13040 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20  uble)nLoop;.    
13050 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61      if( k>0 ) ra
13060 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
13070 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75  ut, "-------- su
13080 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d  bquery %d ------
13090 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20  -\n", k);.      
130a0 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  }.      n++;.   
130b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f     sqlite3_stmt_
130c0 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c  scanstatus(p, i,
130d0 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
130e0 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29  _NVISIT, (void*)
130f0 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20  &nVisit);.      
13100 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
13110 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
13120 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
13130 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
13140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13150 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
13160 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
13170 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
13180 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
13190 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
131a0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
131b0 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c  Loop %2d: %s\n",
131c0 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   n, zExplain);. 
131d0 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d       rEstLoop *=
131e0 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77   rEst;.      raw
131f0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
13200 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  t,.          "  
13210 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38         nLoop=%-8
13220 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20  lld nRow=%-8lld 
13230 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  estRow=%-8lld es
13240 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e  tRow/Loop=%-8g\n
13250 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f  ",.          nLo
13260 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c  op, nVisit, (sql
13270 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74  ite3_int64)(rEst
13280 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a  Loop+0.5), rEst.
13290 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
132a0 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
132b0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d  pArg->out, "----
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e  -------\n");.#en
132e0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  dif.}../*.** Par
132f0 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20 70  ameter azArray p
13300 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d  oints to a zero-
13310 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79  terminated array
13320 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74   of strings. zSt
13330 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  r.** points to a
13340 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d   single nul-term
13350 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52  inated string. R
13360 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
13370 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75  f zStr.** is equ
13380 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  al, according to
13390 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e   strcmp(), to an
133a0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73  y of the strings
133b0 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a   in the array..*
133c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
133d0 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
133e0 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61  tic int str_in_a
133f0 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20  rray(const char 
13400 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
13410 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20  r **azArray){.  
13420 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
13430 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b  ; azArray[i]; i+
13440 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
13450 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72  trcmp(zStr, azAr
13460 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  ray[i]) ) return
13470 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
13480 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
13490 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
134a0 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73 20  nt pSql appears 
134b0 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e  to be an EXPLAIN
134c0 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f   statement, allo
134d0 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  cate.** and popu
134e0 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74  late the ShellSt
134f0 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61  ate.aiIndent[] a
13500 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e 75  rray with the nu
13510 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65  mber of.** space
13520 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68  s each opcode sh
13530 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
13540 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75   before it is ou
13550 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
13560 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20  indenting rules 
13570 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  are:.**.**     *
13580 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22   For each "Next"
13590 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74  , "Prev", "VNext
135a0 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73  " or "VPrev" ins
135b0 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74  truction, indent
135c0 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70  .**       all op
135d0 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75 72  codes that occur
135e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32 20   between the p2 
135f0 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
13600 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a   and the opcode.
13610 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66 20  **       itself 
13620 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a  by 2 spaces..**.
13630 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
13640 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65  h "Goto", if the
13650 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
13660 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20  n is earlier in 
13670 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20  the program.**  
13680 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e       and ends on
13690 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20   one of:.**     
136a0 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b       Yield  Seek
136b0 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53  Gt  SeekLt  RowS
136c0 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a  etRead  Rewind.*
136d0 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74 68  *       or if th
136e0 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69  e P1 parameter i
136f0 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66  s one instead of
13700 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20   zero,.**       
13710 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20  then indent all 
13720 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20  opcodes between 
13730 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74  the earlier inst
13740 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ruction.**      
13750 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32   and "Goto" by 2
13760 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
13770 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f  ic void explain_
13780 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68 65  data_prepare(She
13790 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
137a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b  te3_stmt *pSql){
137b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137c0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
137d0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f     /* The text o
137e0 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  f the SQL statem
137f0 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
13800 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
13810 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
13820 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69   to check if thi
13830 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  s is an EXPLAIN 
13840 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c  */.  int *abYiel
13850 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
13860 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
13870 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c  op is an OP_Yiel
13880 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  d */.  int nAllo
13890 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
138a0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
138b0 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61  ted size of p->a
138c0 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65  iIndent[], abYie
138d0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b  ld */.  int iOp;
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13900 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e   of operation in
13910 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a   p->aiIndent[] *
13920 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  /..  const char 
13930 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e  *azNext[] = { "N
13940 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
13950 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20  Prev", "VNext", 
13960 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20 30 20  "SorterNext", 0 
13970 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
13980 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22  *azYield[] = { "
13990 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22  Yield", "SeekLT"
139a0 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77  , "SeekGT", "Row
139b0 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20  SetRead",.      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20        "Rewind", 
139e0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
139f0 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20  r *azGoto[] = { 
13a00 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20  "Goto", 0 };..  
13a10 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65  /* Try to figure
13a20 20 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20   out if this is 
13a30 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49  really an EXPLAI
13a40 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  N statement. If 
13a50 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74  this.  ** cannot
13a60 20 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65   be verified, re
13a70 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a  turn early.  */.
13a80 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f    if( sqlite3_co
13a90 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29  lumn_count(pSql)
13aa0 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d  !=8 ){.    p->cM
13ab0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
13ac0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13ad0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13ae0 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28  sql(pSql);.  if(
13af0 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72   zSql==0 ) retur
13b00 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b  n;.  for(z=zSql;
13b10 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d   *z==' ' || *z==
13b20 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27  '\t' || *z=='\n'
13b30 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20   || *z=='\f' || 
13b40 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a  *z=='\r'; z++);.
13b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
13b60 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61  rnicmp(z, "expla
13b70 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70  in", 7) ){.    p
13b80 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
13b90 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
13ba0 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b   }..  for(iOp=0;
13bb0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
13bc0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b  ite3_step(pSql);
13bd0 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74   iOp++){.    int
13be0 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64   i;.    int iAdd
13bf0 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
13c00 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b  mn_int(pSql, 0);
13c10 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13c20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
13c30 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
13c40 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
13c50 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32  ;..    /* Set p2
13c60 20 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64   to the P2 field
13c70 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
13c80 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73  opcode. Then, as
13c90 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20  suming that.    
13ca0 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74  ** p2 is an inst
13cb0 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  ruction address,
13cc0 20 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32   set variable p2
13cd0 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  op to the index 
13ce0 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  of that.    ** i
13cf0 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13d00 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e aiIndent[] arr
13d10 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20  ay. p2 and p2op 
13d20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
13d30 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   if.    ** the c
13d40 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69  urrent instructi
13d50 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
13d60 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65  sub-program gene
13d70 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20  rated by an.    
13d80 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f  ** SQL trigger o
13d90 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  r foreign key.  
13da0 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20  */.    int p2 = 
13db0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13dc0 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20  nt(pSql, 3);.   
13dd0 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20   int p2op = (p2 
13de0 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a  + (iOp-iAddr));.
13df0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
13e00 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72   p->aiIndent arr
13e10 61 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a  ay as required *
13e20 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e  /.    if( iOp>=n
13e30 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
13e40 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  f( iOp==0 ){.   
13e50 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68       /* Do furth
13e60 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74  er verfication t
13e70 68 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c  hat this is expl
13e80 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f  ain output.  Abo
13e90 72 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  rt if.        **
13ea0 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20   it is not */.  
13eb0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
13ec0 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  st char *explain
13ed0 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Cols[] = {.     
13ee0 20 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f        "addr", "o
13ef0 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70  pcode", "p1", "p
13f00 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20  2", "p3", "p4", 
13f10 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20  "p5", "comment" 
13f20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  };.        int j
13f30 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
13f40 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a  j=0; jj<ArraySiz
13f50 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20  e(explainCols); 
13f60 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
13f70 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69   if( strcmp(sqli
13f80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
13f90 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e  pSql,jj),explain
13fa0 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a  Cols[jj])!=0 ){.
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63              p->c
13fc0 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13fe0 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b  te3_reset(pSql);
13ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
14000 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  urn;.          }
14010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14020 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20   }.      nAlloc 
14030 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d  += 100;.      p-
14040 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74  >aiIndent = (int
14050 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
14060 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c  c64(p->aiIndent,
14070 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69   nAlloc*sizeof(i
14080 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nt));.      if( 
14090 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30 20 29  p->aiIndent==0 )
140a0 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
140b0 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 61 62  mory();.      ab
140c0 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71  Yield = (int*)sq
140d0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
140e0 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a  abYield, nAlloc*
140f0 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
14100 20 20 20 20 69 66 28 20 61 62 59 69 65 6c 64 3d      if( abYield=
14110 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f  =0 ) shell_out_o
14120 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
14130 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f  }.    abYield[iO
14140 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61  p] = str_in_arra
14150 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b  y(zOp, azYield);
14160 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74  .    p->aiIndent
14170 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70  [iOp] = 0;.    p
14180 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b  ->nIndent = iOp+
14190 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f  1;..    if( str_
141a0 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
141b0 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66  Next) ){.      f
141c0 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
141d0 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
141e0 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
141f0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e  }.    if( str_in
14200 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f  _array(zOp, azGo
14210 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e  to) && p2op<p->n
14220 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28  Indent.     && (
14230 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c  abYield[p2op] ||
14240 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
14250 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20  int(pSql, 2)).  
14260 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69    ){.      for(i
14270 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b  =p2op; i<iOp; i+
14280 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69  +) p->aiIndent[i
14290 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  ] += 2;.    }.  
142a0 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20  }..  p->iIndent 
142b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
142c0 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20  ree(abYield);.  
142d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
142e0 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ql);.}../*.** Fr
142f0 65 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c  ee the array all
14300 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69  ocated by explai
14310 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29  n_data_prepare()
14320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14330 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
14340 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20  lete(ShellState 
14350 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  *p){.  sqlite3_f
14360 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29  ree(p->aiIndent)
14370 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20  ;.  p->aiIndent 
14380 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e  = 0;.  p->nInden
14390 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64  t = 0;.  p->iInd
143a0 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
143b0 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65  * Disable and re
143c0 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63  store .wheretrac
143d0 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61  e and .selecttra
143e0 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a  ce settings..*/.
143f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14400 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14410 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14420 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14430 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14440 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73  e3SelectTrace;.s
14450 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53  tatic int savedS
14460 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
14470 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
14480 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
14490 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
144a0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
144b0 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
144c0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
144d0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
144e0 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64  WhereTrace;.#end
144f0 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  if.static void d
14500 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61  isable_debug_tra
14510 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a  ce_modes(void){.
14520 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14530 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66  TE_DEBUG) && def
14540 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14550 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a  LE_SELECTTRACE).
14560 20 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61    savedSelectTra
14570 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ce = sqlite3Sele
14580 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  ctTrace;.  sqlit
14590 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
145a0 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
145b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
145c0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
145d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
145e0 52 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  RETRACE).  saved
145f0 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c  WhereTrace = sql
14600 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
14610 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
14620 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
14630 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
14640 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63  store_debug_trac
14650 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
14660 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14670 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
14680 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14690 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
146a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
146b0 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63  ace = savedSelec
146c0 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  tTrace;.#endif.#
146d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
146e0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
146f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
14700 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
14710 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
14720 65 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72  e = savedWhereTr
14730 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ace;.#endif.}../
14740 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 54 45  * Name of the TE
14750 4d 50 20 74 61 62 6c 65 20 74 68 61 74 20 68 6f  MP table that ho
14760 6c 64 73 20 62 69 6e 64 20 70 61 72 61 6d 65 74  lds bind paramet
14770 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65  er values */.#de
14780 66 69 6e 65 20 42 49 4e 44 5f 50 41 52 41 4d 5f  fine BIND_PARAM_
14790 54 41 42 4c 45 20 22 24 50 61 72 61 6d 65 74 65  TABLE "$Paramete
147a0 72 73 22 0a 0a 2f 2a 20 43 72 65 61 74 65 20 74  rs"../* Create t
147b0 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20 75 73  he TEMP table us
147c0 65 64 20 74 6f 20 73 74 6f 72 65 20 70 61 72 61  ed to store para
147d0 6d 65 74 65 72 20 62 69 6e 64 69 6e 67 73 20 2a  meter bindings *
147e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 69  /.static void bi
147f0 6e 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28 53 68  nd_table_init(Sh
14800 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
14810 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
14820 64 62 2c 0a 20 20 20 20 22 43 52 45 41 54 45 20  db,.    "CREATE 
14830 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
14840 53 54 53 20 74 65 6d 70 2e 5b 22 20 42 49 4e 44  STS temp.[" BIND
14850 5f 50 41 52 41 4d 5f 54 41 42 4c 45 20 22 5d 28  _PARAM_TABLE "](
14860 5c 6e 22 0a 20 20 20 20 22 20 20 6b 65 79 20 54  \n".    "  key T
14870 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14880 5c 6e 22 0a 20 20 20 20 22 20 20 76 61 6c 75 65  \n".    "  value
14890 20 41 4e 59 5c 6e 22 0a 20 20 20 20 22 29 20 57   ANY\n".    ") W
148a0 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 2c 0a  ITHOUT ROWID;",.
148b0 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a      0, 0, 0);.}.
148c0 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 70 61 72 61  ./*.** Bind para
148d0 6d 65 74 65 72 73 20 6f 6e 20 61 20 70 72 65 70  meters on a prep
148e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
148f0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
14900 62 69 6e 64 69 6e 67 73 20 61 72 65 20 74 61 6b  bindings are tak
14910 65 6e 20 66 72 6f 6d 20 61 20 54 45 4d 50 20 74  en from a TEMP t
14920 61 62 6c 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  able of the form
14930 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
14940 45 20 54 45 4d 50 20 54 41 42 4c 45 20 22 24 50  E TEMP TABLE "$P
14950 61 72 61 6d 65 74 65 72 73 22 28 6b 65 79 20 54  arameters"(key T
14960 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
14970 20 76 61 6c 75 65 29 0a 2a 2a 20 20 20 20 57 49   value).**    WI
14980 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 2a 2a 0a  THOUT ROWID;.**.
14990 2a 2a 20 4e 6f 20 62 69 6e 64 69 6e 67 73 20 6f  ** No bindings o
149a0 63 63 75 72 20 69 66 20 74 68 69 73 20 74 61 62  ccur if this tab
149b0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
149c0 74 2e 20 20 54 68 65 20 73 70 65 63 69 61 6c 20  t.  The special 
149d0 63 68 61 72 61 63 74 65 72 20 27 24 27 0a 2a 2a  character '$'.**
149e0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
149f0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
14a00 6f 20 68 65 6c 70 20 70 72 65 76 65 6e 74 20 63  o help prevent c
14a10 6f 6c 6c 69 73 69 6f 6e 73 20 77 69 74 68 20 61  ollisions with a
14a20 63 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2a  ctual tables..**
14a30 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   The table must 
14a40 62 65 20 69 6e 20 74 68 65 20 54 45 4d 50 20 73  be in the TEMP s
14a50 63 68 65 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  chema..*/.static
14a60 20 76 6f 69 64 20 62 69 6e 64 5f 70 72 65 70 61   void bind_prepa
14a70 72 65 64 5f 73 74 6d 74 28 53 68 65 6c 6c 53 74  red_stmt(ShellSt
14a80 61 74 65 20 2a 70 41 72 67 2c 20 73 71 6c 69 74  ate *pArg, sqlit
14a90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
14aa0 0a 20 20 69 6e 74 20 6e 56 61 72 3b 0a 20 20 69  .  int nVar;.  i
14ab0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
14ac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
14ad0 70 51 20 3d 20 30 3b 0a 0a 20 20 6e 56 61 72 20  pQ = 0;..  nVar 
14ae0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  = sqlite3_bind_p
14af0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70  arameter_count(p
14b00 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 56 61  Stmt);.  if( nVa
14b10 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20  r==0 ) return;  
14b20 2f 2a 20 4e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* Nothing to do
14b30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
14b40 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14b50 65 74 61 64 61 74 61 28 70 41 72 67 2d 3e 64 62  etadata(pArg->db
14b60 2c 20 22 54 45 4d 50 22 2c 20 42 49 4e 44 5f 50  , "TEMP", BIND_P
14b70 41 52 41 4d 5f 54 41 42 4c 45 2c 0a 20 20 20 20  ARAM_TABLE,.    
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 22 6b 65 79 22 2c 20 30 2c 20 30 2c 20 30 2c 20  "key", 0, 0, 0, 
14bb0 30 2c 20 30 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  0, 0)!=SQLITE_OK
14bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
14bd0 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 74 61 62  /* Parameter tab
14be0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
14bf0 74 20 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20  t */.  }.  rc = 
14c00 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
14c10 76 32 28 70 41 72 67 2d 3e 64 62 2c 0a 20 20 20  v2(pArg->db,.   
14c20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76         "SELECT v
14c30 61 6c 75 65 20 46 52 4f 4d 20 74 65 6d 70 2e 5c  alue FROM temp.\
14c40 22 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f 54 41  "" BIND_PARAM_TA
14c50 42 4c 45 20 22 5c 22 22 0a 20 20 20 20 20 20 20  BLE "\"".       
14c60 20 20 20 22 20 57 48 45 52 45 20 6b 65 79 3d 3f     " WHERE key=?
14c70 31 22 2c 20 2d 31 2c 20 26 70 51 2c 20 30 29 3b  1", -1, &pQ, 0);
14c80 0a 20 20 69 66 28 20 72 63 20 7c 7c 20 70 51 3d  .  if( rc || pQ=
14c90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
14ca0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 56 61 72 3b  or(i=1; i<=nVar;
14cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
14cc0 7a 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 63 6f  zNum[30];.    co
14cd0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 72 20 3d  nst char *zVar =
14ce0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
14cf0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
14d00 6d 74 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  mt, i);.    if( 
14d10 7a 56 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zVar==0 ){.     
14d20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14d30 66 28 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2c 7a  f(sizeof(zNum),z
14d40 4e 75 6d 2c 22 3f 25 64 22 2c 69 29 3b 0a 20 20  Num,"?%d",i);.  
14d50 20 20 20 20 7a 56 61 72 20 3d 20 7a 4e 75 6d 3b      zVar = zNum;
14d60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14d70 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 51 2c  e3_bind_text(pQ,
14d80 20 31 2c 20 7a 56 61 72 2c 20 2d 31 2c 20 53 51   1, zVar, -1, SQ
14d90 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
14db0 65 70 28 70 51 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(pQ)==SQLITE_R
14dc0 4f 57 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OW ){.      sqli
14dd0 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
14de0 53 74 6d 74 2c 20 69 2c 20 73 71 6c 69 74 65 33  Stmt, i, sqlite3
14df0 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 51  _column_value(pQ
14e00 2c 20 30 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , 0));.    }else
14e10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14e20 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
14e30 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   i);.    }.    s
14e40 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 51 29  qlite3_reset(pQ)
14e50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14e60 66 69 6e 61 6c 69 7a 65 28 70 51 29 3b 0a 7d 0a  finalize(pQ);.}.
14e70 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
14e80 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
14e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
14ea0 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
14eb0 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
14ec0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14ef0 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
14f00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
14f10 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20 20   *pStmt         
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
14f40 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20   to run */.){.  
14f50 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
14f60 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
14f70 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
14f80 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
14f90 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
14fa0 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
14fb0 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
14fc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
14fd0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
14fe0 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
14ff0 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
15000 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
15010 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
15020 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
15030 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d  pace for col nam
15040 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72  e ptr, value ptr
15050 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20  , and type */.  
15060 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
15070 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
15080 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76 6f  t(pStmt);.    vo
15090 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
150a0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
150b0 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
150c0 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
150d0 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
150e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
150f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
15100 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
15110 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
15120 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
15130 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
15140 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
15150 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
15160 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
15170 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
15180 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
15190 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20  *aiTypes = (int 
151a0 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b  *)&azVals[nCol];
151b0 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73   /* Result types
151c0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   */.      int i,
151d0 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   x;.      assert
151e0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
151f0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
15200 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f  .      /* save o
15210 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
15220 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
15230 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15240 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15250 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
15260 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
15270 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
15280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15290 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   do{.        /* 
152a0 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74 61  extract the data
152b0 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73 20   and data types 
152c0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
152d0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
152e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54 79  {.          aiTy
152f0 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
15300 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
15310 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
15320 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
15330 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
15340 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
15350 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
15360 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
15370 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20  ls[i] = "";.    
15380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15390 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
153a0 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
153b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
153c0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
153d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
153e0 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20   if( !azVals[i] 
153f0 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d  && (aiTypes[i]!=
15400 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
15410 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15420 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15430 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15440 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
15450 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15460 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f       } /* end fo
15470 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r */..        /*
15480 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
15490 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
154a0 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
154b0 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
154c0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
154d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
154e0 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
154f0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
15500 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
15510 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
15520 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  ( shell_callback
15530 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
15540 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
15550 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
15560 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15570 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
15580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
155a0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
155b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68 69     }.      } whi
155d0 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
155e0 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  = rc );.      sq
155f0 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
15600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
15610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15620 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15640 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15650 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
15660 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
15670 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
15680 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
15690 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
156a0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
156b0 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
156c0 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
156d0 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
156e0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
156f0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
15700 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15710 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
15720 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
15730 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
15740 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
15750 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15760 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15770 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15780 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
15790 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
157a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
157b0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
157c0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
157d0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
157e0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
157f0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15800 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
15810 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
15820 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
15830 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
15840 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
15850 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
15860 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15870 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
15880 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
15890 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
158a0 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
158b0 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
158c0 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
158d0 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
158e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
158f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
15900 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
15910 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
15920 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
15930 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
15940 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
15950 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
15960 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
15970 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
15980 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
15990 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
159a0 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
159b0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
159c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
159d0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
159e0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
159f0 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
15a00 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
15a10 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
15a20 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15a30 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
15a40 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
15a50 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
15a60 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15a70 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
15a80 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
15a90 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
15aa0 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
15ab0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
15ac0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
15ad0 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
15ae0 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
15af0 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
15b00 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15b10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15b20 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
15b30 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
15b40 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
15b50 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
15b60 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
15b70 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
15b80 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
15b90 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
15ba0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
15bb0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
15bc0 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
15bd0 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
15be0 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
15bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
15c00 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
15c10 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
15c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15c30 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
15c40 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
15c50 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
15c60 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
15c70 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
15c80 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15c90 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
15ca0 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
15cb0 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
15cc0 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
15cd0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15ce0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
15cf0 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
15d20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15d30 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
15d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
15d60 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
15d70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15d80 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
15d90 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
15da0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
15db0 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
15dc0 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
15dd0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
15de0 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15df0 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
15e00 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
15e10 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
15e20 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15e30 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15e40 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
15e50 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
15e60 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
15e70 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
15e80 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
15e90 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
15ea0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
15eb0 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
15ec0 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
15ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ee0 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
15ef0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15f00 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
15f10 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
15f20 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15f30 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15f40 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
15f50 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15f60 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
15f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15f80 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
15f90 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
15fa0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
15fb0 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
15fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15fd0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
15fe0 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
15ff0 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
16000 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
16010 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
16020 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16040 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
16050 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
16060 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16080 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
16090 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
160a0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
160b0 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
160e0 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
160f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
16110 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
16120 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
16130 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
16140 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
16150 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
16160 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
16170 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
16180 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
16190 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
161a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
161b0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
161c0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
161d0 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
161e0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
161f0 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
16200 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
16210 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
16220 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
16230 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
16240 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
16250 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
16260 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
16270 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
16280 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
16290 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
162a0 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
162b0 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
162c0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
162d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
162e0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
162f0 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
16300 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
16310 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
16320 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16330 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
16340 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
16350 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
16360 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
16370 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
16380 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
16390 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
163a0 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
163b0 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
163c0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
163d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
163e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
163f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16400 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
16410 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
16420 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
16430 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
16440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16450 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
16460 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
16470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
16480 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
16490 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
164a0 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
164b0 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
164c0 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
164d0 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
164e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
164f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
16500 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
16510 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
16520 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16530 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
16540 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
16550 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
16560 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
16570 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
16580 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
16590 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
165a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
165b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
165c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
165d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165e0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
165f0 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
16600 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 65   statement or se
16610 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 2e  t of statements.
16620 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20 72    Print.** any r
16630 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75 6d  esult rows/colum
16640 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ns depending on 
16650 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64 65  the current mode
16660 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65 20  .** set via the 
16670 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
16680 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  k..**.** This is
16690 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74 6f   very similar to
166a0 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74 2d   SQLite's built-
166b0 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  in sqlite3_exec(
166c0 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65 78  ).** function ex
166d0 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61 20  cept it takes a 
166e0 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
166f0 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 61  nt callback.** a
16700 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  nd callback data
16710 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
16720 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 65  atic int shell_e
16730 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  xec(.  ShellStat
16740 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
16770 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63  hellState */.  c
16780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
167b0 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
167c0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
167d0 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
167f0 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69 74  * Error msg writ
16800 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
16810 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16820 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  Stmt = NULL;    
16830 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f   /* Statement to
16840 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20 69   execute. */.  i
16850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16860 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
16870 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
16880 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63 6f  .  int rc2;.  co
16890 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f  nst char *zLefto
168a0 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ver;          /*
168b0 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63 65   Tail of unproce
168c0 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20 73 71  ssed SQL */.  sq
168d0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41 72 67  lite3 *db = pArg
168e0 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 7a 45  ->db;..  if( pzE
168f0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a  rrMsg ){.    *pz
16900 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20  ErrMsg = NULL;. 
16910 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16920 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16930 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72 67 2d  ABLE.  if( pArg-
16940 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
16950 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78 70 65  ){.    rc = expe
16960 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41 72 67  rtHandleSQL(pArg
16970 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67  , zSql, pzErrMsg
16980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 78  );.    return ex
16990 70 65 72 74 46 69 6e 69 73 68 28 70 41 72 67 2c  pertFinish(pArg,
169a0 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc!=SQLITE_OK)
169b0 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , pzErrMsg);.  }
169c0 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69 6c 65  .#endif..  while
169d0 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
169e0 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
169f0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
16a00 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
16a10 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
16a20 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
16a30 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
16a40 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
16a50 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
16a60 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
16a70 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
16a80 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
16a90 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
16aa0 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
16ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16ac0 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
16ae0 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
16af0 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
16b00 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
16b10 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
16b20 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
16b30 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
16b40 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
16b50 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16b60 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
16b70 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
16b80 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
16b90 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
16ba0 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
16bb0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
16bc0 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
16bd0 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
16be0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
16bf0 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
16c00 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
16c10 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
16c20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
16c30 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
16c40 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
16c50 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
16c60 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
16c70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16c80 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
16c90 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
16ca0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
16cb0 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
16cc0 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
16cd0 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
16ce0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
16cf0 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
16d00 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
16d10 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
16d20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16d30 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
16d40 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
16d50 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
16d60 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
16d70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
16d80 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
16d90 78 70 6c 61 69 6e 28 70 53 74 6d 74 29 3d 3d 30  xplain(pStmt)==0
16da0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16db0 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
16dc0 69 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  in;.        char
16dd0 20 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20   *zEQP;.        
16de0 69 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d  int triggerEQP =
16df0 20 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61   0;.        disa
16e00 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ble_debug_trace_
16e10 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20  modes();.       
16e20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
16e30 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  ig(db, SQLITE_DB
16e40 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45  CONFIG_TRIGGER_E
16e50 51 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72  QP, -1, &trigger
16e60 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
16e70 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
16e80 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16ea0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
16eb0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
16ec0 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
16ed0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
16ee0 7d 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d  }.        zEQP =
16ef0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16f00 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
16f10 50 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53  PLAN %s", zStmtS
16f20 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ql);.        rc 
16f30 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
16f40 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
16f50 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
16f60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16f80 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16f90 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
16fa0 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52  plain)==SQLITE_R
16fb0 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OW ){.          
16fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
16fd0 51 50 4c 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20  QPLine = (const 
16fe0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
16ff0 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
17000 69 6e 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 20  in,3);.         
17010 20 20 20 69 6e 74 20 69 45 71 70 49 64 20 3d 20     int iEqpId = 
17020 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17030 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  nt(pExplain, 0);
17040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
17050 20 69 50 61 72 65 6e 74 49 64 20 3d 20 73 71 6c   iParentId = sql
17060 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
17070 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
17080 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 45            if( zE
17090 51 50 4c 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29  QPLine[0]=='-' )
170a0 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
170b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
170c0 71 70 5f 61 70 70 65 6e 64 28 70 41 72 67 2c 20  qp_append(pArg, 
170d0 69 45 71 70 49 64 2c 20 69 50 61 72 65 6e 74 49  iEqpId, iParentI
170e0 64 2c 20 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20  d, zEQPLine);.  
170f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17100 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28 70      eqp_render(p
17110 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
17120 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17130 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
17140 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
17150 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
17160 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
17170 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
17180 51 50 5f 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20  QP_full ){.     
17190 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20       /* Also do 
171a0 61 6e 20 45 58 50 4c 41 49 4e 20 66 6f 72 20 22  an EXPLAIN for "
171b0 2e 65 71 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20  .eqp full" mode 
171c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45 51  */.          zEQ
171d0 50 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  P = sqlite3_mpri
171e0 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 25 73 22  ntf("EXPLAIN %s"
171f0 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
17200 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17210 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
17220 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45  b, zEQP, -1, &pE
17230 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
17240 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17260 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f         pArg->cMo
17270 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
17280 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  n;.            e
17290 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
172a0 61 72 65 28 70 41 72 67 2c 20 70 45 78 70 6c 61  are(pArg, pExpla
172b0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
172c0 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
172d0 74 6d 74 28 70 41 72 67 2c 20 70 45 78 70 6c 61  tmt(pArg, pExpla
172e0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  in);.           
172f0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65   explain_data_de
17300 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20 20  lete(pArg);.    
17310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17320 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
17330 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
17340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17350 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20  free(zEQP);.    
17360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17370 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
17380 3d 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72  =AUTOEQP_trigger
17390 20 26 26 20 74 72 69 67 67 65 72 45 51 50 3d 3d   && triggerEQP==
173a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
173b0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
173c0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
173d0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
173e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
173f0 20 20 20 2f 2a 20 52 65 70 72 65 70 61 72 65 20     /* Reprepare 
17400 70 53 74 6d 74 20 62 65 66 6f 72 65 20 72 65 61  pStmt before rea
17410 63 74 69 76 69 6e 67 20 74 72 61 63 65 20 6d 6f  ctiving trace mo
17420 64 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  des */.         
17430 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
17440 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
17450 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
17460 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
17470 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
17480 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17490 41 72 67 20 29 20 70 41 72 67 2d 3e 70 53 74 6d  Arg ) pArg->pStm
174a0 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
174b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73     }.        res
174c0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
174d0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
174e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
174f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
17500 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
17510 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
17520 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
17530 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lain ){.        
17540 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
17550 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53 74  mt_isexplain(pSt
17560 6d 74 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  mt)==1 ){.      
17570 20 20 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64        pArg->cMod
17580 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  e = MODE_Explain
17590 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
175a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
175b0 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
175c0 69 6e 28 70 53 74 6d 74 29 3d 3d 32 20 29 7b 0a  in(pStmt)==2 ){.
175d0 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
175e0 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
175f0 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  QP;.          }.
17600 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17610 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65     /* If the she
17620 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ll is currently 
17630 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  in ".explain" mo
17640 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65  de, gather the e
17650 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  xtra.        ** 
17660 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
17670 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
17680 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
17690 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
176a0 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
176b0 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
176c0 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
176d0 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d  epare(pArg, pStm
176e0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
176f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 69 6e      }..      bin
17700 64 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  d_prepared_stmt(
17710 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
17720 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
17730 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74  d_stmt(pArg, pSt
17740 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mt);.      expla
17750 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
17760 41 72 67 29 3b 0a 20 20 20 20 20 20 65 71 70 5f  Arg);.      eqp_
17770 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a 0a 20  render(pArg);.. 
17780 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75 73       /* print us
17790 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74 61  age stats if sta
177a0 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ts on */.      i
177b0 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
177c0 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  >statsOn ){.    
177d0 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61 74      display_stat
177e0 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b 0a  s(db, pArg, 0);.
177f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
17800 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f 75  * print loop-cou
17810 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72 65  nters if require
17820 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  d */.      if( p
17830 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63 61  Arg && pArg->sca
17840 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20 20  nstatsOn ){.    
17850 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61 6e      display_scan
17860 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29 3b  stats(db, pArg);
17870 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17880 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
17890 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20 65  statement just e
178a0 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69 73  xecuted. If this
178b0 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a 20   fails, save a. 
178c0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
178d0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
178e0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  e. Otherwise, se
178f0 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74 20  t zSql to point 
17900 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
17910 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
17920 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
17930 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
17940 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
17950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17960 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
17970 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
17980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 71  K ){.        zSq
179a0 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a 20  l = zLeftover;. 
179b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
179c0 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20 29  Space(zSql[0]) )
179d0 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d   zSql++;.      }
179e0 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d 73  else if( pzErrMs
179f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
17a00 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
17a10 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
17a20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c 65   }..      /* cle
17a30 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68 61  ar saved stmt ha
17a40 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndle */.      if
17a50 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
17a60 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
17a70 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NULL;.      }.  
17a80 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20 77    }.  } /* end w
17a90 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72  hile */..  retur
17aa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17ab0 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70 72  elease memory pr
17ac0 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
17ad0 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75 6d  ed by tableColum
17ae0 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  nList()..*/.stat
17af0 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c 75  ic void freeColu
17b00 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61 7a  mnList(char **az
17b10 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
17b20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
17b30 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  i]; i++){.    sq
17b40 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f 6c  lite3_free(azCol
17b50 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 61  [i]);.  }.  /* a
17b60 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74 61  zCol[0] is a sta
17b70 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  tic string */.  
17b80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
17b90 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ol);.}../*.** Re
17ba0 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  turn a list of p
17bb0 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e  ointers to strin
17bc0 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  gs which are the
17bd0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a 2a   names of all.**
17be0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c   columns in tabl
17bf0 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d 65  e zTab.   The me
17c00 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
17c10 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d 69   names is dynami
17c20 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
17c30 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72  ed and must be r
17c40 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 63  eleased by the c
17c50 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73 75  aller using a su
17c60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
17c70 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69   to freeColumnLi
17c80 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  st()..**.** The 
17c90 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20 69  azCol[0] entry i
17ca0 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e 20  s usually NULL. 
17cb0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54 61   However, if zTa
17cc0 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f 77  b contains a row
17cd0 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61 74  id.** value that
17ce0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
17cf0 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a 43  served, then azC
17d00 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64 20  ol[0] is filled 
17d10 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  in with the.** n
17d20 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ame of the rowid
17d30 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54   column..**.** T
17d40 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61 72  he first regular
17d50 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
17d60 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31 5d  able is azCol[1]
17d70 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20 74  .  The list is t
17d80 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79 20  erminated.** by 
17d90 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 7a  an entry with az
17da0 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73 74  Col[i]==0..*/.st
17db0 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62 6c  atic char **tabl
17dc0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65 6c  eColumnList(Shel
17dd0 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
17de0 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
17df0 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20 30  char **azCol = 0
17e00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
17e10 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *pStmt;.  char 
17e20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f  *zSql;.  int nCo
17e30 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41 6c  l = 0;.  int nAl
17e40 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  loc = 0;.  int n
17e50 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  PK = 0;       /*
17e60 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d 41   Number of PRIMA
17e70 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 73  RY KEY columns s
17e80 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  een */.  int isI
17e90 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  PK = 0;     /* T
17ea0 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d 41  rue if one PRIMA
17eb0 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f 66  RY KEY column of
17ec0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a 2f   type INTEGER */
17ed0 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65 52  .  int preserveR
17ee0 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73 46  owid = ShellHasF
17ef0 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72 65  lag(p, SHFLG_Pre
17f00 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20 69  serveRowid);.  i
17f10 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20 3d  nt rc;..  zSql =
17f20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17f30 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69  ("PRAGMA table_i
17f40 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b 0a  nfo=%Q", zTab);.
17f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
17f60 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
17f70 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
17f80 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
17f90 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
17fa0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30  f( rc ) return 0
17fb0 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
17fc0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
17fd0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
17fe0 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c 6c    if( nCol>=nAll
17ff0 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e 41  oc-2 ){.      nA
18000 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20  lloc = nAlloc*2 
18010 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20 20  + nCol + 10;.   
18020 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69 74     azCol = sqlit
18030 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f 6c  e3_realloc(azCol
18040 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
18050 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  azCol[0]));.    
18060 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29    if( azCol==0 )
18070 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
18080 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20 20  mory();.    }.  
18090 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20    azCol[++nCol] 
180a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
180b0 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
180c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
180d0 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20  t, 1));.    if( 
180e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
180f0 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a  nt(pStmt, 5) ){.
18100 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20        nPK++;.   
18110 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20     if( nPK==1.  
18120 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f       && sqlite3_
18130 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20 63  stricmp((const c
18140 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
18150 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
18160 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
18180 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20  TEGER")==0.     
18190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50   ){.        isIP
181a0 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  K = 1;.      }el
181b0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49 50  se{.        isIP
181c0 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  K = 0;.      }. 
181d0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
181e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
181f0 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  t);.  if( azCol=
18200 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18210 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20   azCol[0] = 0;. 
18220 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d   azCol[nCol+1] =
18230 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65   0;..  /* The de
18240 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68 65  cision of whethe
18250 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69 64  r or not a rowid
18260 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f   really needs to
18270 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20 20   be preserved.  
18280 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20 57  ** is tricky.  W
18290 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  e never need to 
182a0 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69 64  preserve a rowid
182b0 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
182c0 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20  OWID table.  ** 
182d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
182e0 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
182f0 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65 20  RY KEY.  We are 
18300 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65 72  unable to preser
18310 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f  ve.  ** rowids o
18320 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20 74  n tables where t
18330 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61 63  he rowid is inac
18340 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73 65  cessible because
18350 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
18360 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e  .  ** columns in
18370 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64   the table named
18380 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69   "rowid", "_rowi
18390 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a  d_", and "oid"..
183a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73 65    */.  if( prese
183b0 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49 50  rveRowid && isIP
183c0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
183d0 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59 20   single PRIMARY 
183e0 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  KEY column with 
183f0 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61 73  type INTEGER was
18400 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20   seen, then it. 
18410 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 61     ** might be a
18420 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65 20  n alise for the 
18430 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20 6d  ROWID.  But it m
18440 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20 57  ight also be a W
18450 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20  ITHOUT ROWID.   
18460 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20 49   ** table or a I
18470 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
18480 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20  EY DESC column, 
18490 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
184a0 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49   are.    ** ROWI
184b0 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20 64  D aliases.  To d
184c0 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73 65  istinguish these
184d0 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74 6f   cases, check to
184e0 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 74   see if.    ** t
184f0 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20 65  here is a "pk" e
18500 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41 20  ntry in "PRAGMA 
18510 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54 68  index_list".  Th
18520 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ere will be.    
18530 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78  ** no "pk" index
18540 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   if the PRIMARY 
18550 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  KEY really is an
18560 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
18570 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  OWID..    */.   
18580 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
18590 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
185a0 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e  1 FROM pragma_in
185b0 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20 20  dex_list(%Q)".  
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
185e0 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a   origin='pk'", z
185f0 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Tab);.    rc = s
18600 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18610 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
18620 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
18630 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18640 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
18650 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 43  c ){.      freeC
18660 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
18670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
18680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18690 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
186a0 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
186b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
186c0 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65 52  );.    preserveR
186d0 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54  owid = rc==SQLIT
186e0 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  E_ROW;.  }.  if(
186f0 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 29   preserveRowid )
18700 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72  {.    /* Only pr
18710 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69 64  eserve the rowid
18720 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64 20   if we can find 
18730 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66 6f  a name to use fo
18740 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77  r the.    ** row
18750 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  id */.    static
18760 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d   char *azRowid[]
18770 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f   = { "rowid", "_
18780 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d  rowid_", "oid" }
18790 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ;.    int i, j;.
187a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
187b0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; j++){.      fo
187c0 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20  r(i=1; i<=nCol; 
187d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
187e0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
187f0 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43  p(azRowid[j],azC
18800 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65 61  ol[i])==0 ) brea
18810 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18820 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20   if( i>nCol ){. 
18830 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
18840 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77  s point, we know
18850 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d   that azRowid[j]
18860 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
18870 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20 20   of any.        
18880 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75  ** ordinary colu
18890 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  mn in the table.
188a0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61 7a    Verify that az
188b0 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76 61  Rowid[j] is a va
188c0 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  lid.        ** n
188d0 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69  ame for the rowi
188e0 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67 20  d before adding 
188f0 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20  it to azCol[0]. 
18900 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
18910 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73         ** tables
18920 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73 20   will fail this 
18930 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20  last check */.  
18940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18950 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
18960 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 30  metadata(p->db,0
18970 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d  ,zTab,azRowid[j]
18980 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
18990 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
189a0 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30  ITE_OK ) azCol[0
189b0 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a  ] = azRowid[j];.
189c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
189e0 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b  .  return azCol;
189f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65  .}../*.** Toggle
18a00 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e 6f   the reverse_uno
18a10 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20 73  rdered_selects s
18a20 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  etting..*/.stati
18a30 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c  c void toggleSel
18a40 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65 33  ectOrder(sqlite3
18a50 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   *db){.  sqlite3
18a60 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18a70 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e 67  ;.  int iSetting
18a80 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53 74   = 0;.  char zSt
18a90 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74  mt[100];.  sqlit
18aa0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
18ab0 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72 73  , "PRAGMA revers
18ac0 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65  e_unordered_sele
18ad0 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  cts", -1, &pStmt
18ae0 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
18af0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
18b00 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
18b10 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73 71     iSetting = sq
18b20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
18b30 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a  (pStmt, 0);.  }.
18b40 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
18b50 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  ze(pStmt);.  sql
18b60 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
18b70 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74  zeof(zStmt), zSt
18b80 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41 47  mt,.       "PRAG
18b90 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
18ba0 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64 29  ered_selects(%d)
18bb0 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a 20  ", !iSetting);. 
18bc0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
18bd0 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30  , zStmt, 0, 0, 0
18be0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
18bf0 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74 20   is a different 
18c00 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
18c10 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69 6e   used for dumpin
18c20 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
18c30 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63 65  ** Each row rece
18c40 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61 6c  ived by this cal
18c50 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
18c60 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a  f a table name,.
18c70 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79 70  ** the table typ
18c80 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22 74  e ("index" or "t
18c90 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20 74  able") and SQL t
18ca0 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62  o create the tab
18cb0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  le..** This rout
18cc0 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e 74  ine should print
18cd0 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e 74   text sufficient
18ce0 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65   to recreate the
18cf0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
18d00 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62  c int dump_callb
18d10 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ack(void *pArg, 
18d20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a  int nArg, char *
18d30 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  *azArg, char **a
18d40 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e 74  zNotUsed){.  int
18d50 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
18d60 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e  r *zTable;.  con
18d70 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
18d80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
18d90 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ql;.  ShellState
18da0 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
18db0 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55  e *)pArg;..  UNU
18dc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 7a  SED_PARAMETER(az
18dd0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
18de0 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67  nArg!=3 || azArg
18df0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18e00 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67    zTable = azArg
18e10 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61  [0];.  zType = a
18e20 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20  zArg[1];.  zSql 
18e30 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69  = azArg[2];..  i
18e40 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65  f( strcmp(zTable
18e50 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
18e60 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ce")==0 ){.    r
18e70 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
18e80 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  , "DELETE FROM s
18e90 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c  qlite_sequence;\
18ea0 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
18eb0 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
18ec0 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c  ("sqlite_stat?",
18ed0 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20   zTable)==0 ){. 
18ee0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
18ef0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
18f00 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
18f10 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
18f20 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  trncmp(zTable, "
18f30 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
18f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
18f50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
18f60 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45 41  ncmp(zSql, "CREA
18f70 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
18f80 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 20)==0 ){.   
18f90 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20   char *zIns;.   
18fa0 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62 6c   if( !p->writabl
18fb0 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
18fc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
18fd0 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
18fe0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c  able_schema=ON;\
18ff0 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72  n");.      p->wr
19000 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 31  itableSchema = 1
19010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73  ;.    }.    zIns
19020 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
19030 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45  tf(.       "INSE
19040 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d  RT INTO sqlite_m
19050 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c  aster(type,name,
19060 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67  tbl_name,rootpag
19070 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20 22  e,sql)".       "
19080 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c 27  VALUES('table','
19090 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27 29  %q','%q',0,'%q')
190a0 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62 6c  ;",.       zTabl
190b0 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29  e, zTable, zSql)
190c0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
190d0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
190e0 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c  , zIns);.    sql
190f0 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b  ite3_free(zIns);
19100 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e   }else{.    prin
19120 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
19130 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29  ut, zSql, ";\n")
19140 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72  ;.  }..  if( str
19150 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62 6c  cmp(zType, "tabl
19160 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68  e")==0 ){.    Sh
19170 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74 3b  ellText sSelect;
19180 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
19190 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72 20  Table;.    char 
191a0 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  **azCol;.    int
191b0 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 61   i;.    char *sa
191c0 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  vedDestTable;.  
191d0 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b    int savedMode;
191e0 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61  ..    azCol = ta
191f0 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c  bleColumnList(p,
19200 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
19210 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  ( azCol==0 ){.  
19220 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20      p->nErr++;. 
19230 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77     }..    /* Alw
19250 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74 61  ays quote the ta
19260 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69  ble name, even i
19270 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f 20  f it appears to 
19280 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a 20  be pure ascii,. 
19290 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69 74     ** in case it
192a0 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20 45   is a keyword. E
192b0 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  x:  INSERT INTO 
192c0 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20  "table" ... */. 
192d0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54 61     initText(&sTa
192e0 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ble);.    append
192f0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a 54  Text(&sTable, zT
19300 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28  able, quoteChar(
19310 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a  zTable));.    /*
19320 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20 74   If preserving t
19330 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61 20  he rowid, add a 
19340 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74 65  column list afte
19350 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  r the table name
19360 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65  ..    ** In othe
19370 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45 52  r words:  "INSER
19380 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69 64  T INTO tab(rowid
19390 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55  ,a,b,c,...) VALU
193a0 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ES(...)".    ** 
193b0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
193c0 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  sual "INSERT INT
193d0 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e  O tab VALUES(...
193e0 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  )"..    */.    i
193f0 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20  f( azCol[0] ){. 
19400 20 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 22 28 22 2c 20 30 29  &sTable, "(", 0)
19420 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
19430 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
19440 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
19450 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
19460 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
19470 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
19480 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ble, ",", 0);.  
19490 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
194a0 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b  (&sTable, azCol[
194b0 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a  i], quoteChar(az
194c0 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20  Col[i]));.      
194d0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
194e0 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22 2c  xt(&sTable, ")",
194f0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
19500 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70 72  /* Build an appr
19510 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20 73  opriate SELECT s
19520 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
19530 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65 63  initText(&sSelec
19540 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  t);.    appendTe
19550 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
19560 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20 20  LECT ", 0);.    
19570 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
19580 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19590 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
195a0 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  [0], 0);.      a
195b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
195c0 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ct, ",", 0);.   
195d0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20   }.    for(i=1; 
195e0 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  azCol[i]; i++){.
195f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
19600 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c  (&sSelect, azCol
19610 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
19620 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
19630 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20   if( azCol[i+1] 
19640 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
19650 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
19660 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ",", 0);.      }
19670 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 43  .    }.    freeC
19680 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29  olumnList(azCol)
19690 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
196a0 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52 4f  (&sSelect, " FRO
196b0 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70 70  M ", 0);.    app
196c0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
196d0 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43  , zTable, quoteC
196e0 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20  har(zTable));.. 
196f0 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62 6c     savedDestTabl
19700 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c  e = p->zDestTabl
19710 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64 65  e;.    savedMode
19720 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
19730 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  p->zDestTable = 
19740 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d  sTable.z;.    p-
19750 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65  >mode = p->cMode
19760 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
19770 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65      rc = shell_e
19780 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e 7a  xec(p, sSelect.z
19790 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
197a0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
197b0 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  CORRUPT ){.     
197c0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
197d0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
197e0 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
197f0 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
19800 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72    toggleSelectOr
19810 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  der(p->db);.    
19820 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
19830 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20  sSelect.z, 0);. 
19840 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63       toggleSelec
19850 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20  tOrder(p->db);. 
19860 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73     }.    p->zDes
19870 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65  tTable = savedDe
19880 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e  stTable;.    p->
19890 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65  mode = savedMode
198a0 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
198b0 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65  sTable);.    fre
198c0 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
198d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d  .    if( rc ) p-
198e0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nErr++;.  }.  r
198f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
19900 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55  * Run zQuery.  U
19910 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  se dump_callback
19920 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61  () as the callba
19930 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ck routine so th
19940 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  at.** the conten
19950 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ts of the query 
19960 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51  are output as SQ
19970 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
19980 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20  .** If we get a 
19990 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
199a0 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20  rror, rerun the 
199b0 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65  query after appe
199c0 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20  nding.** "ORDER 
199d0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74  BY rowid DESC" t
199e0 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74  o the end..*/.st
199f0 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68  atic int run_sch
19a00 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ema_dump_query(.
19a10 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
19a20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19a30 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72  Query.){.  int r
19a40 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
19a50 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
19a60 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
19a70 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c  zQuery, dump_cal
19a80 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
19a90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19aa0 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20  TE_CORRUPT ){.  
19ab0 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20    char *zQ2;.   
19ac0 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
19ad0 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  n30(zQuery);.   
19ae0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
19af0 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52  ut, "/****** COR
19b00 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a  RUPTION ERROR **
19b10 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  *****/\n");.    
19b20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
19b30 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
19b40 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25  >out, "/****** %
19b50 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45  s ******/\n", zE
19b60 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rr);.      sqlit
19b70 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
19b80 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20       zErr = 0;. 
19b90 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d     }.    zQ2 = m
19ba0 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29  alloc( len+100 )
19bb0 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30  ;.    if( zQ2==0
19bc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19bd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
19be0 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c  tf(len+100, zQ2,
19bf0 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f   "%s ORDER BY ro
19c00 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72  wid DESC", zQuer
19c10 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y);.    rc = sql
19c20 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
19c30 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62   zQ2, dump_callb
19c40 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a  ack, p, &zErr);.
19c50 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19c60 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
19c70 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
19c80 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a   ERROR: %s *****
19c90 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
19ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19cb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
19cc0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
19cd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
19ce0 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b  ;.    free(zQ2);
19cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20  ;.}../*.** Text 
19d10 6f 66 20 68 65 6c 70 20 6d 65 73 73 61 67 65 73  of help messages
19d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 65 6c 70  ..**.** The help
19d30 20 74 65 78 74 20 66 6f 72 20 65 61 63 68 20 69   text for each i
19d40 6e 64 69 76 69 64 75 61 6c 20 63 6f 6d 6d 61 6e  ndividual comman
19d50 64 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  d begins with a 
19d60 6c 69 6e 65 20 74 68 61 74 20 73 74 61 72 74 73  line that starts
19d70 0a 2a 2a 20 77 69 74 68 20 22 2e 22 2e 20 20 53  .** with ".".  S
19d80 75 62 73 65 71 75 65 6e 74 20 6c 69 6e 65 73 20  ubsequent lines 
19d90 61 72 65 20 73 75 70 70 6c 69 6d 65 6e 74 61 6c  are supplimental
19da0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
19db0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
19dc0 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 70  e two or more sp
19dd0 61 63 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  aces between the
19de0 20 65 6e 64 20 6f 66 20 74 68 65 20 63 6f 6d 6d   end of the comm
19df0 61 6e 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 73  and and the.** s
19e00 74 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63  tart of the desc
19e10 72 69 70 74 69 6f 6e 20 6f 66 20 77 68 61 74 20  ription of what 
19e20 74 68 61 74 20 63 6f 6d 6d 61 6e 64 20 64 6f 65  that command doe
19e30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
19e40 73 74 20 63 68 61 72 20 2a 28 61 7a 48 65 6c 70  st char *(azHelp
19e50 5b 5d 29 20 3d 20 7b 0a 23 69 66 20 64 65 66 69  []) = {.#if defi
19e60 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
19e70 5a 4c 49 42 29 20 26 26 20 21 64 65 66 69 6e 65  ZLIB) && !define
19e80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
19e90 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 22 2e  RTUALTABLE).  ".
19ea0 61 72 63 68 69 76 65 20 2e 2e 2e 20 20 20 20 20  archive ...     
19eb0 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65 20 53          Manage S
19ec0 51 4c 20 61 72 63 68 69 76 65 73 22 2c 0a 20 20  QL archives",.  
19ed0 22 20 20 20 45 61 63 68 20 63 6f 6d 6d 61 6e 64  "   Each command
19ee0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
19ef0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  ly one of the fo
19f00 6c 6c 6f 77 69 6e 67 20 6f 70 74 69 6f 6e 73 3a  llowing options:
19f10 22 2c 0a 20 20 22 20 20 20 20 20 2d 63 2c 20 2d  ",.  "     -c, -
19f20 2d 63 72 65 61 74 65 20 20 20 20 20 20 20 20 20  -create         
19f30 20 20 20 20 20 20 43 72 65 61 74 65 20 61 20 6e        Create a n
19f40 65 77 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  ew archive",.  "
19f50 20 20 20 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74       -u, --updat
19f60 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
19f70 55 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69  Update or add fi
19f80 6c 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69  les to an existi
19f90 6e 67 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22  ng archive",.  "
19fa0 20 20 20 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20       -t, --list 
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  List contents of
19fd0 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
19fe0 20 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63 74     -x, --extract
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1a000 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d  tract files from
1a010 20 61 72 63 68 69 76 65 22 2c 0a 20 20 22 20 20   archive",.  "  
1a020 20 4f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   Optional argume
1a030 6e 74 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d  nts:",.  "     -
1a040 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20 20 20  v, --verbose    
1a050 20 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20            Print 
1a060 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20 61 73  each filename as
1a070 20 69 74 20 69 73 20 70 72 6f 63 65 73 73 65 64   it is processed
1a080 22 2c 0a 20 20 22 20 20 20 20 20 2d 66 20 46 49  ",.  "     -f FI
1a090 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20  LE, --file FILE 
1a0a0 20 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e        Operate on
1a0b0 20 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64   archive FILE (d
1a0c0 65 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e  efault is curren
1a0d0 74 20 64 62 29 22 2c 0a 20 20 22 20 20 20 20 20  t db)",.  "     
1a0e0 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e  -a FILE, --appen
1a0f0 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61  d FILE     Opera
1a100 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65  te on FILE opene
1a110 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64  d using the apnd
1a120 76 66 73 20 56 46 53 22 2c 0a 20 20 22 20 20 20  vfs VFS",.  "   
1a130 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64 69 72 65    -C DIR, --dire
1a140 63 74 6f 72 79 20 44 49 52 20 20 20 20 43 68 61  ctory DIR    Cha
1a150 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
1a160 20 44 49 52 20 74 6f 20 72 65 61 64 2f 65 78 74   DIR to read/ext
1a170 72 61 63 74 20 66 69 6c 65 73 22 2c 0a 20 20 22  ract files",.  "
1a180 20 20 20 20 20 2d 6e 2c 20 2d 2d 64 72 79 72 75       -n, --dryru
1a190 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1a1a0 53 68 6f 77 20 74 68 65 20 53 51 4c 20 74 68 61  Show the SQL tha
1a1b0 74 20 77 6f 75 6c 64 20 68 61 76 65 20 6f 63 63  t would have occ
1a1c0 75 72 72 65 64 22 2c 0a 20 20 22 20 20 20 45 78  urred",.  "   Ex
1a1d0 61 6d 70 6c 65 73 3a 22 2c 0a 20 20 22 20 20 20  amples:",.  "   
1a1e0 20 20 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76    .ar -cf archiv
1a1f0 65 2e 73 61 72 20 66 6f 6f 20 62 61 72 20 20 23  e.sar foo bar  #
1a200 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e   Create archive.
1a210 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  sar from files f
1a220 6f 6f 20 61 6e 64 20 62 61 72 22 2c 0a 20 20 22  oo and bar",.  "
1a230 20 20 20 20 20 2e 61 72 20 2d 74 66 20 61 72 63       .ar -tf arc
1a240 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
1a250 20 20 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73    # List members
1a260 20 6f 66 20 61 72 63 68 69 76 65 2e 73 61 72 22   of archive.sar"
1a270 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d 78  ,.  "     .ar -x
1a280 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  vf archive.sar  
1a290 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73 65         # Verbose
1a2a0 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65 73  ly extract files
1a2b0 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73 61   from archive.sa
1a2c0 72 22 2c 0a 20 20 22 20 20 20 53 65 65 20 61 6c  r",.  "   See al
1a2d0 73 6f 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 68  so:",.  "      h
1a2e0 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
1a2f0 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72 5f  /cli.html#sqlar_
1a300 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74 22  archive_support"
1a310 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
1a320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a330 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
1a340 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
1a350 20 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68         Show auth
1a360 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73  orizer callbacks
1a370 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  ",.#endif.  ".ba
1a380 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
1a390 20 20 20 20 20 20 42 61 63 6b 75 70 20 44 42 20        Backup DB 
1a3a0 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
1a3b0 22 29 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20 22  ") to FILE",.  "
1a3c0 20 20 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20         --append 
1a3d0 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74             Use t
1a3e0 68 65 20 61 70 70 65 6e 64 76 66 73 22 2c 0a 20  he appendvfs",. 
1a3f0 20 22 20 20 20 20 20 20 20 2d 2d 61 73 79 6e 63   "       --async
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
1a410 74 65 20 74 6f 20 46 49 4c 45 20 77 69 74 68 6f  te to FILE witho
1a420 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ut a journal and
1a430 20 77 69 74 68 6f 75 74 20 66 73 79 6e 63 28 29   without fsync()
1a440 22 2c 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f  ",.  ".bail on|o
1a450 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ff             S
1a460 74 6f 70 20 61 66 74 65 72 20 68 69 74 74 69 6e  top after hittin
1a470 67 20 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66  g an error.  Def
1a480 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22 2e 62  ault OFF",.  ".b
1a490 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20  inary on|off    
1a4a0 20 20 20 20 20 20 20 54 75 72 6e 20 62 69 6e 61         Turn bina
1a4b0 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20  ry output on or 
1a4c0 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  off.  Default OF
1a4d0 46 22 2c 0a 20 20 22 2e 63 64 20 44 49 52 45 43  F",.  ".cd DIREC
1a4e0 54 4f 52 59 20 20 20 20 20 20 20 20 20 20 20 20  TORY            
1a4f0 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b 69  Change the worki
1a500 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  ng directory to 
1a510 44 49 52 45 43 54 4f 52 59 22 2c 0a 20 20 22 2e  DIRECTORY",.  ".
1a520 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20  changes on|off  
1a530 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d          Show num
1a540 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e  ber of rows chan
1a550 67 65 64 20 62 79 20 53 51 4c 22 2c 0a 20 20 22  ged by SQL",.  "
1a560 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20 20  .check GLOB     
1a570 20 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66           Fail if
1a580 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74   output since .t
1a590 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  estcase does not
1a5a0 20 6d 61 74 63 68 22 2c 0a 20 20 22 2e 63 6c 6f   match",.  ".clo
1a5b0 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20  ne NEWDB        
1a5c0 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20       Clone data 
1a5d0 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20  into NEWDB from 
1a5e0 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  the existing dat
1a5f0 61 62 61 73 65 22 2c 0a 20 20 22 2e 64 61 74 61  abase",.  ".data
1a600 62 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20  bases           
1a610 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
1a620 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
1a630 63 68 65 64 20 64 61 74 61 62 61 73 65 73 22 2c  ched databases",
1a640 0a 20 20 22 2e 64 62 63 6f 6e 66 69 67 20 3f 6f  .  ".dbconfig ?o
1a650 70 3f 20 3f 76 61 6c 3f 20 20 20 20 20 4c 69 73  p? ?val?     Lis
1a660 74 20 6f 72 20 63 68 61 6e 67 65 20 73 71 6c 69  t or change sqli
1a670 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20  te3_db_config() 
1a680 6f 70 74 69 6f 6e 73 22 2c 0a 20 20 22 2e 64 62  options",.  ".db
1a690 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20  info ?DB?       
1a6a0 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74 75        Show statu
1a6b0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  s information ab
1a6c0 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
1a6d0 22 2c 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42  ",.  ".dump ?TAB
1a6e0 4c 45 3f 20 2e 2e 2e 20 20 20 20 20 20 20 20 52  LE? ...        R
1a6f0 65 6e 64 65 72 20 61 6c 6c 20 64 61 74 61 62 61  ender all databa
1a700 73 65 20 63 6f 6e 74 65 6e 74 20 61 73 20 53 51  se content as SQ
1a710 4c 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e  L",.  "   Option
1a720 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 2d 2d 70  s:",.  "     --p
1a730 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 20  reserve-rowids  
1a740 20 20 20 20 49 6e 63 6c 75 64 65 20 52 4f 57 49      Include ROWI
1a750 44 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  D values in the 
1a760 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1a770 20 2d 2d 6e 65 77 6c 69 6e 65 73 20 20 20 20 20   --newlines     
1a780 20 20 20 20 20 20 20 20 41 6c 6c 6f 77 20 75 6e          Allow un
1a790 65 73 63 61 70 65 64 20 6e 65 77 6c 69 6e 65 20  escaped newline 
1a7a0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 6f 75  characters in ou
1a7b0 74 70 75 74 22 2c 0a 20 20 22 20 20 20 54 41 42  tput",.  "   TAB
1a7c0 4c 45 20 69 73 20 4c 49 4b 45 20 70 61 74 74 65  LE is LIKE patte
1a7d0 72 6e 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  rn for the table
1a7e0 73 20 74 6f 20 64 75 6d 70 22 2c 0a 20 20 22 2e  s to dump",.  ".
1a7f0 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20  echo on|off     
1a800 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d          Turn com
1a810 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20  mand echo on or 
1a820 6f 66 66 22 2c 0a 20 20 22 2e 65 71 70 20 6f 6e  off",.  ".eqp on
1a830 7c 6f 66 66 7c 66 75 6c 6c 7c 2e 2e 2e 20 20 20  |off|full|...   
1a840 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61    Enable or disa
1a850 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58  ble automatic EX
1a860 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1a870 22 2c 0a 20 20 22 20 20 20 4f 74 68 65 72 20 4d  ",.  "   Other M
1a880 6f 64 65 73 3a 22 2c 0a 23 69 66 64 65 66 20 53  odes:",.#ifdef S
1a890 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 22 20  QLITE_DEBUG.  " 
1a8a0 20 20 20 20 20 74 65 73 74 20 20 20 20 20 20 20       test       
1a8b0 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1a8c0 72 61 77 20 45 58 50 4c 41 49 4e 20 51 55 45 52  raw EXPLAIN QUER
1a8d0 59 20 50 4c 41 4e 20 6f 75 74 70 75 74 22 2c 0a  Y PLAN output",.
1a8e0 20 20 22 20 20 20 20 20 20 74 72 61 63 65 20 20    "      trace  
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
1a900 69 6b 65 20 5c 22 66 75 6c 6c 5c 22 20 62 75 74  ike \"full\" but
1a910 20 61 6c 73 6f 20 65 6e 61 62 6c 65 20 5c 22 50   also enable \"P
1a920 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65  RAGMA vdbe_trace
1a930 5c 22 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20  \"",.#endif.  " 
1a940 20 20 20 20 20 74 72 69 67 67 65 72 20 20 20 20       trigger    
1a950 20 20 20 20 20 20 20 20 20 20 20 4c 69 6b 65 20             Like 
1a960 5c 22 66 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73  \"full\" but als
1a970 6f 20 73 68 6f 77 20 74 72 69 67 67 65 72 20 62  o show trigger b
1a980 79 74 65 63 6f 64 65 22 2c 0a 20 20 22 2e 65 78  ytecode",.  ".ex
1a990 63 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  cel             
1a9a0 20 20 20 20 20 20 44 69 73 70 6c 61 79 20 74 68        Display th
1a9b0 65 20 6f 75 74 70 75 74 20 6f 66 20 6e 65 78 74  e output of next
1a9c0 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 61 20 73 70   command in a sp
1a9d0 72 65 61 64 73 68 65 65 74 22 2c 0a 20 20 22 2e  readsheet",.  ".
1a9e0 65 78 69 74 20 3f 43 4f 44 45 3f 20 20 20 20 20  exit ?CODE?     
1a9f0 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69          Exit thi
1aa00 73 20 70 72 6f 67 72 61 6d 20 77 69 74 68 20 72  s program with r
1aa10 65 74 75 72 6e 2d 63 6f 64 65 20 43 4f 44 45 22  eturn-code CODE"
1aa20 2c 0a 20 20 22 2e 65 78 70 65 72 74 20 20 20 20  ,.  ".expert    
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
1aa40 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67  PERIMENTAL. Sugg
1aa50 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20  est indexes for 
1aa60 73 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65  specified querie
1aa70 73 22 2c 0a 2f 2a 20 42 65 63 61 75 73 65 20 65  s",./* Because e
1aa80 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65  xplain mode come
1aa90 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  s on automatical
1aaa0 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78  ly now, the ".ex
1aab0 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69  plain" mode.** i
1aac0 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1aad0 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e 20  he help screen. 
1aae0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75 70   It is still sup
1aaf0 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61 63  ported for legac
1ab00 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a  y, however */./*
1ab10 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66  ".explain ?on|of
1ab20 66 7c 61 75 74 6f 3f 20 20 20 54 75 72 6e 20 45  f|auto?   Turn E
1ab30 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f  XPLAIN output mo
1ab40 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20  de on or off or 
1ab50 74 6f 20 61 75 74 6f 6d 61 74 69 63 22 2c 2a 2f  to automatic",*/
1ab60 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20  .  ".fullschema 
1ab70 3f 2d 2d 69 6e 64 65 6e 74 3f 20 20 20 53 68 6f  ?--indent?   Sho
1ab80 77 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65  w schema and the
1ab90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69   content of sqli
1aba0 74 65 5f 73 74 61 74 20 74 61 62 6c 65 73 22 2c  te_stat tables",
1abb0 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c  .  ".headers on|
1abc0 6f 66 66 20 20 20 20 20 20 20 20 20 20 54 75 72  off          Tur
1abd0 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61  n display of hea
1abe0 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c  ders on or off",
1abf0 0a 20 20 22 2e 68 65 6c 70 20 3f 2d 61 6c 6c 3f  .  ".help ?-all?
1ac00 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 53 68 6f   ?PATTERN?   Sho
1ac10 77 20 68 65 6c 70 20 74 65 78 74 20 66 6f 72 20  w help text for 
1ac20 50 41 54 54 45 52 4e 22 2c 0a 20 20 22 2e 69 6d  PATTERN",.  ".im
1ac30 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20  port FILE TABLE 
1ac40 20 20 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74        Import dat
1ac50 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f  a from FILE into
1ac60 20 54 41 42 4c 45 22 2c 0a 23 69 66 6e 64 65 66   TABLE",.#ifndef
1ac70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53   SQLITE_OMIT_TES
1ac80 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d  T_CONTROL.  ".im
1ac90 70 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42  poster INDEX TAB
1aca0 4c 45 20 20 20 20 43 72 65 61 74 65 20 69 6d 70  LE    Create imp
1acb0 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42 4c  oster table TABL
1acc0 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45 58  E on index INDEX
1acd0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e  ",.#endif.  ".in
1ace0 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20  dexes ?TABLE?   
1acf0 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
1ad00 20 6f 66 20 69 6e 64 65 78 65 73 22 2c 0a 20 20   of indexes",.  
1ad10 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
1ad30 41 42 4c 45 20 69 73 20 73 70 65 63 69 66 69 65  ABLE is specifie
1ad40 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
1ad50 65 78 65 73 20 66 6f 72 22 2c 0a 20 20 22 20 20  exes for",.  "  
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 73 20           tables 
1ad80 6d 61 74 63 68 69 6e 67 20 54 41 42 4c 45 20 75  matching TABLE u
1ad90 73 69 6e 67 20 74 68 65 20 4c 49 4b 45 20 6f 70  sing the LIKE op
1ada0 65 72 61 74 6f 72 2e 22 2c 0a 23 69 66 64 65 66  erator.",.#ifdef
1adb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
1adc0 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72 61  OTRACE.  ".iotra
1add0 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ce FILE         
1ade0 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69     Enable I/O di
1adf0 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67  agnostic logging
1ae00 20 74 6f 20 46 49 4c 45 22 2c 0a 23 65 6e 64 69   to FILE",.#endi
1ae10 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d  f.  ".limit ?LIM
1ae20 49 54 3f 20 3f 56 41 4c 3f 20 20 20 20 20 44 69  IT? ?VAL?     Di
1ae30 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20  splay or change 
1ae40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20  the value of an 
1ae50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 22 2c 0a 20  SQLITE_LIMIT",. 
1ae60 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20   ".lint OPTIONS 
1ae70 20 20 20 20 20 20 20 20 20 20 20 52 65 70 6f 72             Repor
1ae80 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68 65  t potential sche
1ae90 6d 61 20 69 73 73 75 65 73 2e 22 2c 0a 20 20 22  ma issues.",.  "
1aea0 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a       Options:",.
1aeb0 20 20 22 20 20 20 20 20 20 20 20 66 6b 65 79 2d    "        fkey-
1aec0 69 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64  indexes     Find
1aed0 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e   missing foreign
1aee0 20 6b 65 79 20 69 6e 64 65 78 65 73 22 2c 0a 23   key indexes",.#
1aef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1af00 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
1af10 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20  N.  ".load FILE 
1af20 3f 45 4e 54 52 59 3f 20 20 20 20 20 20 20 4c 6f  ?ENTRY?       Lo
1af30 61 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20  ad an extension 
1af40 6c 69 62 72 61 72 79 22 2c 0a 23 65 6e 64 69 66  library",.#endif
1af50 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66  .  ".log FILE|of
1af60 66 20 20 20 20 20 20 20 20 20 20 20 20 54 75 72  f            Tur
1af70 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20  n logging on or 
1af80 6f 66 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62  off.  FILE can b
1af90 65 20 73 74 64 65 72 72 2f 73 74 64 6f 75 74 22  e stderr/stdout"
1afa0 2c 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20  ,.  ".mode MODE 
1afb0 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 65  ?TABLE?       Se
1afc0 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 22 2c 0a  t output mode",.
1afd0 20 20 22 20 20 20 4d 4f 44 45 20 69 73 20 6f 6e    "   MODE is on
1afe0 65 20 6f 66 3a 22 2c 0a 20 20 22 20 20 20 20 20  e of:",.  "     
1aff0 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73  ascii    Columns
1b000 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20  /rows delimited 
1b010 62 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45  by 0x1F and 0x1E
1b020 22 2c 0a 20 20 22 20 20 20 20 20 63 73 76 20 20  ",.  "     csv  
1b030 20 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61      Comma-separa
1b040 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ted values",.  "
1b050 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65       column   Le
1b060 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d  ft-aligned colum
1b070 6e 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68  ns.  (See .width
1b080 29 22 2c 0a 20 20 22 20 20 20 20 20 68 74 6d 6c  )",.  "     html
1b090 20 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65       HTML <table
1b0a0 3e 20 63 6f 64 65 22 2c 0a 20 20 22 20 20 20 20  > code",.  "    
1b0b0 20 69 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e   insert   SQL in
1b0c0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1b0d0 66 6f 72 20 54 41 42 4c 45 22 2c 0a 20 20 22 20  for TABLE",.  " 
1b0e0 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65      line     One
1b0f0 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 22   value per line"
1b100 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20  ,.  "     list  
1b110 20 20 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69     Values delimi
1b120 74 65 64 20 62 79 20 5c 22 7c 5c 22 22 2c 0a 20  ted by \"|\"",. 
1b130 20 22 20 20 20 20 20 71 75 6f 74 65 20 20 20 20   "     quote    
1b140 45 73 63 61 70 65 20 61 6e 73 77 65 72 73 20 61  Escape answers a
1b150 73 20 66 6f 72 20 53 51 4c 22 2c 0a 20 20 22 20  s for SQL",.  " 
1b160 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61 62      tabs     Tab
1b170 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75 65  -separated value
1b180 73 22 2c 0a 20 20 22 20 20 20 20 20 74 63 6c 20  s",.  "     tcl 
1b190 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20 65 6c       TCL list el
1b1a0 65 6d 65 6e 74 73 22 2c 0a 20 20 22 2e 6e 75 6c  ements",.  ".nul
1b1b0 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20  lvalue STRING   
1b1c0 20 20 20 20 20 55 73 65 20 53 54 52 49 4e 47 20       Use STRING 
1b1d0 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c 4c  in place of NULL
1b1e0 20 76 61 6c 75 65 73 22 2c 0a 20 20 22 2e 6f 6e   values",.  ".on
1b1f0 63 65 20 28 2d 65 7c 2d 78 7c 46 49 4c 45 29 20  ce (-e|-x|FILE) 
1b200 20 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72        Output for
1b210 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f   the next SQL co
1b220 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49  mmand only to FI
1b230 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 49 66 20  LE",.  "     If 
1b240 46 49 4c 45 20 62 65 67 69 6e 73 20 77 69 74 68  FILE begins with
1b250 20 27 7c 27 20 74 68 65 6e 20 6f 70 65 6e 20 61   '|' then open a
1b260 73 20 61 20 70 69 70 65 22 2c 0a 20 20 22 20 20  s a pipe",.  "  
1b270 20 20 20 4f 74 68 65 72 20 6f 70 74 69 6f 6e 73     Other options
1b280 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 65  :",.  "       -e
1b290 20 20 20 20 49 6e 76 6f 6b 65 20 73 79 73 74 65      Invoke syste
1b2a0 6d 20 74 65 78 74 20 65 64 69 74 6f 72 22 2c 0a  m text editor",.
1b2b0 20 20 22 20 20 20 20 20 20 20 2d 78 20 20 20 20    "       -x    
1b2c0 4f 70 65 6e 20 69 6e 20 61 20 73 70 72 65 61 64  Open in a spread
1b2d0 73 68 65 65 74 22 2c 0a 20 20 22 2e 6f 70 65 6e  sheet",.  ".open
1b2e0 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45   ?OPTIONS? ?FILE
1b2f0 3f 20 20 20 43 6c 6f 73 65 20 65 78 69 73 74 69  ?   Close existi
1b300 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ng database and 
1b310 72 65 6f 70 65 6e 20 46 49 4c 45 22 2c 0a 20 20  reopen FILE",.  
1b320 22 20 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c  "     Options:",
1b330 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d 61 70  .  "        --ap
1b340 70 65 6e 64 20 20 20 20 20 20 20 20 55 73 65 20  pend        Use 
1b350 61 70 70 65 6e 64 76 66 73 20 74 6f 20 61 70 70  appendvfs to app
1b360 65 6e 64 20 64 61 74 61 62 61 73 65 20 74 6f 20  end database to 
1b370 74 68 65 20 65 6e 64 20 6f 66 20 46 49 4c 45 22  the end of FILE"
1b380 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
1b390 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
1b3a0 5a 45 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ZE.  "        --
1b3b0 64 65 73 65 72 69 61 6c 69 7a 65 20 20 20 4c 6f  deserialize   Lo
1b3c0 61 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 75  ad into memory u
1b3d0 73 65 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65  seing sqlite3_de
1b3e0 73 65 72 69 61 6c 69 7a 65 28 29 22 2c 0a 20 20  serialize()",.  
1b3f0 22 20 20 20 20 20 20 20 20 2d 2d 68 65 78 64 62  "        --hexdb
1b400 20 20 20 20 20 20 20 20 20 4c 6f 61 64 20 74 68           Load th
1b410 65 20 6f 75 74 70 75 74 20 6f 66 20 5c 22 64 62  e output of \"db
1b420 74 6f 74 78 74 5c 22 20 61 73 20 61 6e 20 69 6e  totxt\" as an in
1b430 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1b440 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 2d 2d  ",.  "        --
1b450 6d 61 78 73 69 7a 65 20 4e 20 20 20 20 20 4d 61  maxsize N     Ma
1b460 78 69 6d 75 6d 20 73 69 7a 65 20 66 6f 72 20 2d  ximum size for -
1b470 2d 68 65 78 64 62 20 6f 72 20 2d 2d 64 65 73 65  -hexdb or --dese
1b480 72 69 61 6c 69 7a 65 64 20 64 61 74 61 62 61 73  rialized databas
1b490 65 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20 20  e",.#endif.  "  
1b4a0 20 20 20 20 20 20 2d 2d 6e 65 77 20 20 20 20 20        --new     
1b4b0 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
1b4c0 20 46 49 4c 45 20 74 6f 20 61 6e 20 65 6d 70 74   FILE to an empt
1b4d0 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22  y database",.  "
1b4e0 20 20 20 20 20 20 20 20 2d 2d 72 65 61 64 6f 6e          --readon
1b4f0 6c 79 20 20 20 20 20 20 4f 70 65 6e 20 46 49 4c  ly      Open FIL
1b500 45 20 72 65 61 64 6f 6e 6c 79 22 2c 0a 20 20 22  E readonly",.  "
1b510 20 20 20 20 20 20 20 20 2d 2d 7a 69 70 20 20 20          --zip   
1b520 20 20 20 20 20 20 20 20 46 49 4c 45 20 69 73 20          FILE is 
1b530 61 20 5a 49 50 20 61 72 63 68 69 76 65 22 2c 0a  a ZIP archive",.
1b540 20 20 22 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45    ".output ?FILE
1b550 3f 20 20 20 20 20 20 20 20 20 20 20 53 65 6e 64  ?           Send
1b560 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45 20   output to FILE 
1b570 6f 72 20 73 74 64 6f 75 74 20 69 66 20 46 49 4c  or stdout if FIL
1b580 45 20 69 73 20 6f 6d 69 74 74 65 64 22 2c 0a 20  E is omitted",. 
1b590 20 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62   "     If FILE b
1b5a0 65 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74  egins with '|' t
1b5b0 68 65 6e 20 6f 70 65 6e 20 69 74 20 61 73 20 61  hen open it as a
1b5c0 20 70 69 70 65 2e 22 2c 0a 20 20 22 2e 70 61 72   pipe.",.  ".par
1b5d0 61 6d 65 74 65 72 20 43 4d 44 20 2e 2e 2e 20 20  ameter CMD ...  
1b5e0 20 20 20 20 20 4d 61 6e 61 67 65 20 53 51 4c 20       Manage SQL 
1b5f0 70 61 72 61 6d 65 74 65 72 20 62 69 6e 64 69 6e  parameter bindin
1b600 67 73 22 2c 0a 20 20 22 20 20 20 63 6c 65 61 72  gs",.  "   clear
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 20 20 20 45 72 61 73 65 20 61 6c 6c 20 62 69 6e     Erase all bin
1b630 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20 69 6e  dings",.  "   in
1b640 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1b650 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
1b660 20 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 20   the TEMP table 
1b670 74 68 61 74 20 68 6f 6c 64 73 20 62 69 6e 64 69  that holds bindi
1b680 6e 67 73 22 2c 0a 20 20 22 20 20 20 6c 69 73 74  ngs",.  "   list
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 4c 69 73 74 20 74 68 65 20 63 75 72      List the cur
1b6b0 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 62  rent parameter b
1b6c0 69 6e 64 69 6e 67 73 22 2c 0a 20 20 22 20 20 20  indings",.  "   
1b6d0 73 65 74 20 50 41 52 41 4d 45 54 45 52 20 56 41  set PARAMETER VA
1b6e0 4c 55 45 20 20 20 20 20 47 69 76 65 6e 20 53 51  LUE     Given SQ
1b6f0 4c 20 70 61 72 61 6d 65 74 65 72 20 50 41 52 41  L parameter PARA
1b700 4d 45 54 45 52 20 61 20 76 61 6c 75 65 20 6f 66  METER a value of
1b710 20 56 41 4c 55 45 22 2c 0a 20 20 22 20 20 20 20   VALUE",.  "    
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 50 41 52 41 4d 45 54 45 52         PARAMETER
1b740 20 73 68 6f 75 6c 64 20 73 74 61 72 74 20 77 69   should start wi
1b750 74 68 20 27 24 27 2c 20 27 3a 27 2c 20 27 40 27  th '$', ':', '@'
1b760 2c 20 6f 72 20 27 3f 27 22 2c 0a 20 20 22 20 20  , or '?'",.  "  
1b770 20 75 6e 73 65 74 20 50 41 52 41 4d 45 54 45 52   unset PARAMETER
1b780 20 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20           Remove 
1b790 50 41 52 41 4d 45 54 45 52 20 66 72 6f 6d 20 74  PARAMETER from t
1b7a0 68 65 20 62 69 6e 64 69 6e 67 20 74 61 62 6c 65  he binding table
1b7b0 22 2c 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  ",.  ".print STR
1b7c0 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50  ING...         P
1b7d0 72 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52  rint literal STR
1b7e0 49 4e 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51  ING",.#ifndef SQ
1b7f0 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
1b800 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e  SS_CALLBACK.  ".
1b810 70 72 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20  progress N      
1b820 20 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70          Invoke p
1b830 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20  rogress handler 
1b840 61 66 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70  after every N op
1b850 63 6f 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d  codes",.  "   --
1b860 6c 69 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20  limit N         
1b870 20 20 20 20 20 20 20 20 49 6e 74 65 72 72 75 70          Interrup
1b880 74 20 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65  t after N progre
1b890 73 73 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20  ss callbacks",. 
1b8a0 20 22 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20   "   --once     
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1b8c0 6f 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  o no more than o
1b8d0 6e 65 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65  ne progress inte
1b8e0 72 72 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d  rrupt",.  "   --
1b8f0 71 75 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20  quiet|-q        
1b900 20 20 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75          No outpu
1b910 74 20 65 78 63 65 70 74 20 61 74 20 69 6e 74 65  t except at inte
1b920 72 72 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d  rrupts",.  "   -
1b930 2d 72 65 73 65 74 20 20 20 20 20 20 20 20 20 20  -reset          
1b940 20 20 20 20 20 20 20 20 20 52 65 73 65 74 20 74           Reset t
1b950 68 65 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63  he count for eac
1b960 68 20 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65  h input and inte
1b970 72 72 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20  rrupt",.#endif. 
1b980 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43   ".prompt MAIN C
1b990 4f 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61  ONTINUE    Repla
1b9a0 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
1b9b0 70 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75  prompts",.  ".qu
1b9c0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1b9d0 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
1b9e0 70 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65  program",.  ".re
1b9f0 61 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  ad FILE         
1ba00 20 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74        Read input
1ba10 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22   from FILE",.  "
1ba20 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
1ba30 4c 45 20 20 20 20 20 20 20 52 65 73 74 6f 72 65  LE       Restore
1ba40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
1ba50 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
1ba60 29 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20  ) from FILE",.  
1ba70 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20  ".save FILE     
1ba80 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
1ba90 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1baa0 73 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20  se into FILE",. 
1bab0 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
1bac0 6f 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20  off        Turn 
1bad0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
1bae0 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63  nstatus() metric
1baf0 73 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20  s on or off",.  
1bb00 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52  ".schema ?PATTER
1bb10 4e 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74  N?        Show t
1bb20 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
1bb30 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41  ents matching PA
1bb40 54 54 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20  TTERN",.  "     
1bb50 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20  Options:",.  "  
1bb60 20 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20         --indent 
1bb70 20 20 20 20 20 20 20 20 20 20 20 54 72 79 20 74             Try t
1bb80 6f 20 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74  o pretty-print t
1bb90 68 65 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e  he schema",.  ".
1bba0 73 65 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e  selftest ?OPTION
1bbb0 53 3f 20 20 20 20 20 20 52 75 6e 20 74 65 73 74  S?      Run test
1bbc0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  s defined in the
1bbd0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22   SELFTEST table"
1bbe0 2c 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73  ,.  "    Options
1bbf0 3a 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d  :",.  "       --
1bc00 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
1bc10 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
1bc20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c  SELFTEST table",
1bc30 0a 20 20 22 20 20 20 20 20 20 20 2d 76 20 20 20  .  "       -v   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c  Verbose output",
1bc60 0a 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43  .  ".separator C
1bc70 4f 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61  OL ?ROW?     Cha
1bc80 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  nge the column a
1bc90 6e 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  nd row separator
1bca0 73 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s",.#if defined(
1bcb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
1bcc0 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69  SSION).  ".sessi
1bcd0 6f 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e  on ?NAME? CMD ..
1bce0 2e 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e  .  Create or con
1bcf0 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a  trol sessions",.
1bd00 20 20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64    "   Subcommand
1bd10 73 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74  s:",.  "     att
1bd20 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
1bd30 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
1bd40 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61  LE",.  "     cha
1bd50 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20  ngeset FILE     
1bd60 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68        Write a ch
1bd70 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c  angeset into FIL
1bd80 45 22 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73  E",.  "     clos
1bd90 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1bda0 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73       Close one s
1bdb0 65 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20  ession",.  "    
1bdc0 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e   enable ?BOOLEAN
1bdd0 3f 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72  ?         Set or
1bde0 20 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c   query the enabl
1bdf0 65 20 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20  e bit",.  "     
1be00 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20  filter GLOB...  
1be10 20 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20           Reject 
1be20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20  tables matching 
1be30 47 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20  GLOBs",.  "     
1be40 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
1be50 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
1be60 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
1be70 65 63 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22  ect status",.  "
1be80 20 20 20 20 20 69 73 65 6d 70 74 79 20 20 20 20       isempty    
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
1bea0 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
1beb0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
1bec0 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20  ",.  "     list 
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74      List current
1bef0 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20  ly open session 
1bf00 6e 61 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20  names",.  "     
1bf10 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20  open DB NAME    
1bf20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20           Open a 
1bf30 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44  new session on D
1bf40 42 22 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63  B",.  "     patc
1bf50 68 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20  hset FILE       
1bf60 20 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74       Write a pat
1bf70 63 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22  chset into FILE"
1bf80 2c 0a 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45  ,.  "   If ?NAME
1bf90 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
1bfa0 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
1bfb0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
1bfc0 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68  ",.#endif.  ".sh
1bfd0 61 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20  a3sum ...       
1bfe0 20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20        Compute a 
1bff0 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
1c000 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a  abase content",.
1c010 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22    "    Options:"
1c020 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68  ,.  "      --sch
1c030 65 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20  ema             
1c040 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
1c050 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1c060 6c 65 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d  le",.  "      --
1c070 73 68 61 33 2d 32 32 34 20 20 20 20 20 20 20 20  sha3-224        
1c080 20 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33      Use the sha3
1c090 2d 32 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c  -224 algorithm",
1c0a0 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33  .  "      --sha3
1c0b0 2d 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20  -256            
1c0c0 55 73 65 20 74 68 65 20 73 68 61 33 2d 32 35 36  Use the sha3-256
1c0d0 20 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69   algorithm.  Thi
1c0e0 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
1c0f0 2e 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  .",.  "      --s
1c100 68 61 33 2d 33 38 34 20 20 20 20 20 20 20 20 20  ha3-384         
1c110 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1c120 33 38 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  384 algorithm",.
1c130 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d    "      --sha3-
1c140 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 55  512            U
1c150 73 65 20 74 68 65 20 73 68 61 33 2d 35 31 32 20  se the sha3-512 
1c160 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20  algorithm",.  " 
1c170 20 20 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67     Any other arg
1c180 75 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20  ument is a LIKE 
1c190 70 61 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c  pattern for tabl
1c1a0 65 73 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66  es to hash",.#if
1c1b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1c1c0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68  VE_SYSTEM.  ".sh
1c1d0 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
1c1e0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1c1f0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1c200 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1c210 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20  .  ".show       
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
1c230 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
1c240 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
1c250 20 73 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e   settings",.  ".
1c260 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20  stats ?on|off?  
1c270 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
1c280 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
1c290 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66   on or off",.#if
1c2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1c2b0 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79  VE_SYSTEM.  ".sy
1c2c0 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e  stem CMD ARGS...
1c2d0 20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52        Run CMD AR
1c2e0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
1c2f0 6d 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66  m shell",.#endif
1c300 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42  .  ".tables ?TAB
1c310 4c 45 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73  LE?          Lis
1c320 74 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65  t names of table
1c330 73 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20  s matching LIKE 
1c340 70 61 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a  pattern TABLE",.
1c350 20 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d    ".testcase NAM
1c360 45 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  E           Begi
1c370 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75  n redirecting ou
1c380 74 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73  tput to 'testcas
1c390 65 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22  e-out.txt'",.  "
1c3a0 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20  .timeout MS     
1c3b0 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
1c3c0 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
1c3d0 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
1c3e0 65 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d  econds",.  ".tim
1c3f0 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  er on|off       
1c400 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
1c410 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a  mer on or off",.
1c420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c430 4d 49 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72  MIT_TRACE.  ".tr
1c440 61 63 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20  ace ?OPTIONS?   
1c450 20 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63        Output eac
1c460 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
1c470 61 73 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20  as it is run",. 
1c480 20 22 20 20 20 20 46 49 4c 45 20 20 20 20 20 20   "    FILE      
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
1c4a0 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
1c4b0 45 22 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75  E",.  "    stdou
1c4c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1c4d0 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
1c4e0 6f 20 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20  o stdout",.  "  
1c4f0 20 20 73 74 64 65 72 72 20 20 20 20 20 20 20 20    stderr        
1c500 20 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f            Send o
1c510 75 74 70 75 74 20 74 6f 20 73 74 64 65 72 72 22  utput to stderr"
1c520 2c 0a 20 20 22 20 20 20 20 6f 66 66 20 20 20 20  ,.  "    off    
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 44 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67   Disable tracing
1c550 22 2c 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61  ",.  "    --expa
1c560 6e 64 65 64 20 20 20 20 20 20 20 20 20 20 20 20  nded            
1c570 20 20 45 78 70 61 6e 64 20 71 75 65 72 79 20 70    Expand query p
1c580 61 72 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64  arameters",.#ifd
1c590 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c5a0 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20  _NORMALIZE.  "  
1c5b0 20 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20    --normalized  
1c5c0 20 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c            Normal
1c5d0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
1c5e0 6e 74 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22  nts",.#endif.  "
1c5f0 20 20 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20      --plain     
1c600 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1c610 20 53 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e   SQL as it is in
1c620 70 75 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73  put",.  "    --s
1c630 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20  tmt             
1c640 20 20 20 20 20 54 72 61 63 65 20 73 74 61 74 65       Trace state
1c650 6d 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28  ment execution (
1c660 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d  SQLITE_TRACE_STM
1c670 54 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72  T)",.  "    --pr
1c680 6f 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  ofile           
1c690 20 20 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74      Profile stat
1c6a0 65 6d 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54  ements (SQLITE_T
1c6b0 52 41 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a  RACE_PROFILE)",.
1c6c0 20 20 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20    "    --row    
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1c6e0 72 61 63 65 20 65 61 63 68 20 72 6f 77 20 28 53  race each row (S
1c6f0 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29  QLITE_TRACE_ROW)
1c700 22 2c 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73  ",.  "    --clos
1c710 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1c720 20 20 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69    Trace connecti
1c730 6f 6e 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45  on close (SQLITE
1c740 5f 54 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a  _TRACE_CLOSE)",.
1c750 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c760 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20  _OMIT_TRACE */. 
1c770 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f   ".vfsinfo ?AUX?
1c780 20 20 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72             Infor
1c790 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1c7a0 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c   top-level VFS",
1c7b0 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20  .  ".vfslist    
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1c7d0 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  t all available 
1c7e0 56 46 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e  VFSes",.  ".vfsn
1c7f0 61 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20  ame ?AUX?       
1c800 20 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61      Print the na
1c810 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74  me of the VFS st
1c820 61 63 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20  ack",.  ".width 
1c830 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20  NUM1 NUM2 ...   
1c840 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64    Set column wid
1c850 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e  ths for \"column
1c860 5c 22 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20  \" mode",.  "   
1c870 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65    Negative value
1c880 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22  s right-justify"
1c890 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  ,.};../*.** Outp
1c8a0 75 74 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a  ut help text..**
1c8b0 0a 2a 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73  .** zPattern des
1c8c0 63 72 69 62 65 73 20 74 68 65 20 73 65 74 20 6f  cribes the set o
1c8d0 66 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77  f commands for w
1c8e0 68 69 63 68 20 68 65 6c 70 20 74 65 78 74 20 69  hich help text i
1c8f0 73 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49  s provided..** I
1c900 66 20 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55  f zPattern is NU
1c910 4c 4c 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c  LL, then show al
1c920 6c 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20  l commands, but 
1c930 6f 6e 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d  only give a one-
1c940 6c 69 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  line.** descript
1c950 69 6f 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a  ion of each..**.
1c960 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1c970 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e  mber of matches.
1c980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c990 68 6f 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75  howHelp(FILE *ou
1c9a0 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1c9b0 50 61 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20  Pattern){.  int 
1c9c0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d  i = 0;.  int j =
1c9d0 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   0;.  int n = 0;
1c9e0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20  .  char *zPat;. 
1c9f0 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30   if( zPattern==0
1ca00 0a 20 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b  .   || zPattern[
1ca10 30 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74  0]=='0'.   || st
1ca20 72 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d  rcmp(zPattern,"-
1ca30 61 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72  a")==0.   || str
1ca40 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61  cmp(zPattern,"-a
1ca50 6c 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20  ll")==0.  ){.   
1ca60 20 2f 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d   /* Show all com
1ca70 6d 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20  mands, but only 
1ca80 6f 6e 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d  one line per com
1ca90 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  mand */.    if( 
1caa0 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50  zPattern==0 ) zP
1cab0 61 74 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20  attern = "";.   
1cac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
1cad0 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69  ySize(azHelp); i
1cae0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
1caf0 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27  zHelp[i][0]=='.'
1cb00 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20   || zPattern[0] 
1cb10 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
1cb20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
1cb30 6e 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a  n", azHelp[i]);.
1cb40 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
1cb50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1cb60 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  se{.    /* Look 
1cb70 66 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61  for commands tha
1cb80 74 20 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74  t for which zPat
1cb90 74 65 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74  tern is an exact
1cba0 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a   prefix */.    z
1cbb0 50 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Pat = sqlite3_mp
1cbc0 72 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50  rintf(".%s*", zP
1cbd0 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72  attern);.    for
1cbe0 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
1cbf0 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b  e(azHelp); i++){
1cc00 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1cc10 65 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c  e3_strglob(zPat,
1cc20 20 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29   azHelp[i])==0 )
1cc30 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1cc40 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1cc50 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20  ", azHelp[i]);. 
1cc60 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a         j = i+1;.
1cc70 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
1cc80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1cc90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1cca0 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a  );.    if( n ){.
1ccb0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29        if( n==1 )
1ccc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65  {.        /* whe
1ccd0 6e 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20  n zPattern is a 
1cce0 70 72 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c  prefix of exactl
1ccf0 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74  y one command, t
1cd00 68 65 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a  hen include the.
1cd10 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69          ** detai
1cd20 6c 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61  ls of that comma
1cd30 6e 64 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  nd, which should
1cd40 20 62 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74   begin at offset
1cd50 20 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68   j */.        wh
1cd60 69 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65  ile( j<ArraySize
1cd70 28 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a  (azHelp)-1 && az
1cd80 48 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20  Help[j][0]!='.' 
1cd90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
1cda0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
1cdb0 73 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29  s\n", azHelp[j])
1cdc0 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
1cdd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cde0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1cdf0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  n;.    }.    /* 
1ce00 4c 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64  Look for command
1ce10 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a  s that contain z
1ce20 50 61 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65  Pattern anywhere
1ce30 2e 20 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  .  Show the comp
1ce40 6c 65 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74  lete.    ** text
1ce50 20 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73   of all commands
1ce60 20 74 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a   that match. */.
1ce70 20 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74      zPat = sqlit
1ce80 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73  e3_mprintf("%%%s
1ce90 25 25 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a  %%", zPattern);.
1cea0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
1ceb0 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1cec0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1ced0 28 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d  ( azHelp[i][0]==
1cee0 27 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20  '.' ) j = i;.   
1cef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
1cf00 74 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48  trlike(zPat, azH
1cf10 65 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b  elp[i], 0)==0 ){
1cf20 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1cf30 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1cf40 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20  , azHelp[j]);.  
1cf50 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41        while( j<A
1cf60 72 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29  rraySize(azHelp)
1cf70 2d 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31  -1 && azHelp[j+1
1cf80 5d 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20  ][0]!='.' ){.   
1cf90 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
1cfa0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1cfb0 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61  f(out, "%s\n", a
1cfc0 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20  zHelp[j]);.     
1cfd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d     }.        i =
1cfe0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b   j;.        n++;
1cff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d010 7a 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zPat);.  }.  ret
1d020 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn n;.}../* For
1d030 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
1d040 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1d050 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c  cess_input(Shell
1d060 53 74 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a  State *p);../*.*
1d070 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1d080 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65  nt of file zName
1d090 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
1d0a0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1d0b0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a  e3_malloc64().**
1d0c0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
1d0d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66  inter to the buf
1d0e0 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  fer. The caller 
1d0f0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1d100 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68  or freeing.** th
1d110 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  e memory..**.** 
1d120 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42  If parameter pnB
1d130 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  yte is not NULL,
1d140 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65   (*pnByte) is se
1d150 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1d160 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
1d170 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76  ..**.** For conv
1d180 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74  enience, a nul-t
1d190 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
1d1a0 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65  s always appende
1d1b0 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65  d to the data re
1d1c0 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ad.** from the f
1d1d0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  ile before the b
1d1e0 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65  uffer is returne
1d1f0 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
1d200 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  not included in.
1d210 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c  ** the final val
1d220 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c  ue of (*pnByte),
1d230 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a   if applicable..
1d240 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  **.** NULL is re
1d250 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72  turned if any er
1d260 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1d270 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  ed. The final va
1d280 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a  lue of *pnByte.*
1d290 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
1d2a0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
1d2b0 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
1d2c0 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  dFile(const char
1d2d0 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e   *zName, int *pn
1d2e0 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  Byte){.  FILE *i
1d2f0 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  n = fopen(zName,
1d300 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e   "rb");.  long n
1d310 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65  In;.  size_t nRe
1d320 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66  ad;.  char *pBuf
1d330 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
1d340 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65  return 0;.  fsee
1d350 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
1d360 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c  D);.  nIn = ftel
1d370 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
1d380 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  in);.  pBuf = sq
1d390 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
1d3a0 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  nIn+1 );.  if( p
1d3b0 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65  Buf==0 ){ fclose
1d3c0 28 69 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20  (in); return 0; 
1d3d0 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61  }.  nRead = frea
1d3e0 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20  d(pBuf, nIn, 1, 
1d3f0 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e  in);.  fclose(in
1d400 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d  );.  if( nRead!=
1d410 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1d420 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20  _free(pBuf);.   
1d430 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d440 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a   pBuf[nIn] = 0;.
1d450 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1d460 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20  pnByte = nIn;.  
1d470 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
1d480 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1d490 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
1d4a0 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  N)./*.** Close a
1d4b0 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73   single OpenSess
1d4c0 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  ion object and r
1d4d0 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74  elease all of it
1d4e0 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
1d4f0 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74  resources..*/.st
1d500 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
1d510 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73  n_close(OpenSess
1d520 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a  ion *pSession){.
1d530 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
1d540 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65  e3session_delete
1d550 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20  (pSession->p);. 
1d560 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1d570 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a  ession->zName);.
1d580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65    for(i=0; i<pSe
1d590 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20  ssion->nFilter; 
1d5a0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1d5b0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
1d5c0 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20  >azFilter[i]);. 
1d5d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1d5e0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  e(pSession->azFi
1d5f0 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  lter);.  memset(
1d600 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a  pSession, 0, siz
1d610 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29  eof(OpenSession)
1d620 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
1d630 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65  ** Close all Ope
1d640 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73  nSession objects
1d650 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
1d660 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f   associated reso
1d670 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65  urces..*/.#if de
1d680 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1d690 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
1d6a0 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1d6b0 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c  _close_all(Shell
1d6c0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74  State *p){.  int
1d6d0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1d6e0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b  <p->nSession; i+
1d6f0 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  +){.    session_
1d700 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69  close(&p->aSessi
1d710 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d  on[i]);.  }.  p-
1d720 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d  >nSession = 0;.}
1d730 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1d740 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
1d750 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  l(X).#endif../*.
1d760 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1d770 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  n of the xFilter
1d780 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
1d790 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20   open session.  
1d7a0 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c  Omit.** any tabl
1d7b0 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65  es named by ".se
1d7c0 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75  ssion filter" bu
1d7d0 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20  t let all other 
1d7e0 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a  table through..*
1d7f0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1d800 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
1d810 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20  ION).static int 
1d820 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76  session_filter(v
1d830 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
1d840 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20   char *zTab){.  
1d850 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
1d860 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73  ssion = (OpenSes
1d870 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e  sion*)pCtx;.  in
1d880 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1d890 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c  i<pSession->nFil
1d8a0 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ter; i++){.    i
1d8b0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
1d8c0 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ob(pSession->azF
1d8d0 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d  ilter[i], zTab)=
1d8e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d8f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
1d900 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d910 72 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65  ry to deduce the
1d920 20 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f   type of file fo
1d930 72 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e  r zName based on
1d940 20 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52   its content.  R
1d950 65 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20  eturn.** one of 
1d960 74 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a  the SHELL_OPEN_*
1d970 20 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a   constants..**.*
1d980 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * If the file do
1d990 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1d9a0 69 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73  is empty but its
1d9b0 20 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65   name looks like
1d9c0 20 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76   a ZIP.** archiv
1d9d0 65 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69  e and the dfltZi
1d9e0 70 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  p flag is true, 
1d9f0 74 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69  then assume it i
1da00 73 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e  s a ZIP archive.
1da10 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1da20 73 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72  ssume an ordinar
1da30 79 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72  y database regar
1da40 64 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c  dless of the fil
1da50 65 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20  ename if.** the 
1da60 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64  type cannot be d
1da70 65 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63  etermined from c
1da80 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ontent..*/.int d
1da90 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
1daa0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
1dab0 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70  ame, int dfltZip
1dac0 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66  ){.  FILE *f = f
1dad0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
1dae0 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  );.  size_t n;. 
1daf0 20 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f   int rc = SHELL_
1db00 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63  OPEN_UNSPEC;.  c
1db10 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
1db20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1db30 20 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20   if( dfltZip && 
1db40 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
1db50 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29  "%.zip",zName,0)
1db60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65  ==0 ){.       re
1db70 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  turn SHELL_OPEN_
1db80 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c  ZIPFILE;.    }el
1db90 73 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72  se{.       retur
1dba0 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  n SHELL_OPEN_NOR
1dbb0 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MAL;.    }.  }. 
1dbc0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1dbd0 20 31 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   16, 1, f);.  if
1dbe0 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
1dbf0 28 7a 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66  (zBuf, "SQLite f
1dc00 6f 72 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30  ormat 3", 16)==0
1dc10 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66   ){.    fclose(f
1dc20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48  );.    return SH
1dc30 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b  ELL_OPEN_NORMAL;
1dc40 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20  .  }.  fseek(f, 
1dc50 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  -25, SEEK_END);.
1dc60 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
1dc70 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69  , 25, 1, f);.  i
1dc80 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d  f( n==1 && memcm
1dc90 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f  p(zBuf, "Start-O
1dca0 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29  f-SQLite3-", 17)
1dcb0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1dcc0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
1dcd0 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DVFS;.  }else{. 
1dce0 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c     fseek(f, -22,
1dcf0 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20   SEEK_END);.    
1dd00 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1dd10 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69  22, 1, f);.    i
1dd20 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b  f( n==1 && zBuf[
1dd30 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66  0]==0x50 && zBuf
1dd40 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75  [1]==0x4b && zBu
1dd50 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20  f[2]==0x05.     
1dd60 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78    && zBuf[3]==0x
1dd70 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  06 ){.      rc =
1dd80 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1dd90 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ILE;.    }else i
1dda0 66 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a  f( n==0 && dfltZ
1ddb0 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ip && sqlite3_st
1ddc0 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e  rlike("%.zip",zN
1ddd0 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ame,0)==0 ){.   
1dde0 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
1ddf0 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
1de00 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  }.  }.  fclose(f
1de10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
1de20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   .}..#ifdef SQLI
1de30 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
1de40 41 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ALIZE./*.** Reco
1de50 6e 73 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65  nstruct an in-me
1de60 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 75 73  mory database us
1de70 69 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 66  ing the output f
1de80 72 6f 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74  rom the "dbtotxt
1de90 22 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52  ".** program.  R
1dea0 65 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ead content from
1deb0 20 74 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e   the file in p->
1dec0 7a 44 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66  zDbFilename.  If
1ded0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a   p->zDbFilename.
1dee0 2a 2a 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65  ** is 0, then re
1def0 61 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64  ad from standard
1df00 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69   input..*/.stati
1df10 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
1df20 2a 72 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c  *readHexDb(Shell
1df30 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70  State *p, int *p
1df40 6e 44 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e  nData){.  unsign
1df50 65 64 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a  ed char *a = 0;.
1df60 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69    int nLine;.  i
1df70 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
1df80 70 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pgsz = 0;.  int 
1df90 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69  iOffset = 0;.  i
1dfa0 6e 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72  nt j, k;.  int r
1dfb0 63 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  c;.  FILE *in;. 
1dfc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78   unsigned char x
1dfd0 5b 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69  [16];.  char zLi
1dfe0 6e 65 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20  ne[1000];.  if( 
1dff0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29  p->zDbFilename )
1e000 7b 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  {.    in = fopen
1e010 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
1e020 20 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69   "r");.    if( i
1e030 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  n==0 ){.      ut
1e040 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e050 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  , "cannot open \
1e060 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e  "%s\" for readin
1e070 67 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65  g\n", p->zDbFile
1e080 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1e090 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1e0a0 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65   nLine = 0;.  }e
1e0b0 6c 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d  lse{.    in = p-
1e0c0 3e 69 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d  >in;.    nLine =
1e0d0 20 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 7d 0a   p->lineno;.  }.
1e0e0 20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 20    *pnData = 0;. 
1e0f0 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 69 66 28 20   nLine++;.  if( 
1e100 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a  fgets(zLine, siz
1e110 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 3d  eof(zLine), in)=
1e120 3d 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65  =0 ) goto readHe
1e130 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20  xDb_error;.  rc 
1e140 3d 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20  = sscanf(zLine, 
1e150 22 7c 20 73 69 7a 65 20 25 64 20 70 61 67 65 73  "| size %d pages
1e160 69 7a 65 20 25 64 22 2c 20 26 6e 2c 20 26 70 67  ize %d", &n, &pg
1e170 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 32  sz);.  if( rc!=2
1e180 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44   ) goto readHexD
1e190 62 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 6e  b_error;.  if( n
1e1a0 3c 3d 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48  <=0 ) goto readH
1e1b0 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 61 20  exDb_error;.  a 
1e1c0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1e1d0 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d  ( n );.  if( a==
1e1e0 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
1e1f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75  intf(stderr, "Ou
1e200 74 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29  t of memory!\n")
1e210 3b 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48  ;.    goto readH
1e220 65 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  exDb_error;.  }.
1e230 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e    memset(a, 0, n
1e240 29 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31  );.  if( pgsz<51
1e250 32 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20  2 || pgsz>65536 
1e260 7c 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a  || (pgsz & (pgsz
1e270 2d 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75  -1))!=0 ){.    u
1e280 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e290 72 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  r, "invalid page
1e2a0 73 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f  size\n");.    go
1e2b0 74 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72  to readHexDb_err
1e2c0 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c  or;.  }.  for(nL
1e2d0 69 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a 4c 69  ine++; fgets(zLi
1e2e0 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ne, sizeof(zLine
1e2f0 29 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65  ), in)!=0; nLine
1e300 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73  ++){.    rc = ss
1e310 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70  canf(zLine, "| p
1e320 61 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64  age %d offset %d
1e330 22 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20  ", &j, &k);.    
1e340 69 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20  if( rc==2 ){.   
1e350 20 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a     iOffset = k;.
1e360 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1e370 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
1e380 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20  rncmp(zLine, "| 
1e390 65 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a  end ", 6)==0 ){.
1e3a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e3b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61   }.    rc = ssca
1e3c0 6e 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20  nf(zLine,"| %d: 
1e3d0 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25  %hhx %hhx %hhx %
1e3e0 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68  hhx %hhx %hhx %h
1e3f0 68 78 20 25 68 68 78 22 0a 20 20 20 20 20 20 20  hx %hhx".       
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1e410 20 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78    %hhx %hhx %hhx
1e420 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20   %hhx %hhx %hhx 
1e430 25 68 68 78 20 25 68 68 78 22 2c 0a 20 20 20 20  %hhx %hhx",.    
1e440 20 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20              &j, 
1e450 26 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78  &x[0], &x[1], &x
1e460 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34  [2], &x[3], &x[4
1e470 5d 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c  ], &x[5], &x[6],
1e480 20 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20   &x[7],.        
1e490 20 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26          &x[8], &
1e4a0 78 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78  x[9], &x[10], &x
1e4b0 5b 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78  [11], &x[12], &x
1e4c0 5b 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78  [13], &x[14], &x
1e4d0 5b 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  [15]);.    if( r
1e4e0 63 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b  c==17 ){.      k
1e4f0 20 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20   = iOffset+j;.  
1e500 20 20 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20      if( k+16<=n 
1e510 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1e520 79 28 61 2b 6b 2c 20 78 2c 20 31 36 29 3b 0a 20  y(a+k, x, 16);. 
1e530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e540 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b 0a  .  *pnData = n;.
1e550 20 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20    if( in!=p->in 
1e560 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
1e570 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e580 70 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e  p->lineno = nLin
1e590 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
1e5a0 61 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72  a;..readHexDb_er
1e5b0 72 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 73  ror:.  if( in!=s
1e5c0 74 64 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f  tdin ){.    fclo
1e5d0 73 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  se(in);.  }else{
1e5e0 0a 20 20 20 20 77 68 69 6c 65 28 20 66 67 65 74  .    while( fget
1e5f0 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28  s(zLine, sizeof(
1e600 7a 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21 3d  zLine), p->in)!=
1e610 30 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65  0 ){.      nLine
1e620 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74 72  ++;.      if(str
1e630 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65  ncmp(zLine, "| e
1e640 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62 72  nd ", 6)==0 ) br
1e650 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
1e660 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65  ->lineno = nLine
1e670 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e680 66 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38 5f  free(a);.  utf8_
1e690 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1e6a0 72 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64 20  rror on line %d 
1e6b0 6f 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75 74  of --hexdb input
1e6c0 5c 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 72  \n", nLine);.  r
1e6d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1e6e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1e6f0 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a  LE_DESERIALIZE *
1e700 2f 0a 0a 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20  /../* Flags for 
1e710 6f 70 65 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a  open_db()..**.**
1e720 20 54 68 65 20 64 65 66 61 75 6c 74 20 62 65 68   The default beh
1e730 61 76 69 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62  avior of open_db
1e740 28 29 20 69 73 20 74 6f 20 65 78 69 74 28 31 29  () is to exit(1)
1e750 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e760 20 66 61 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65   fails to.** ope
1e770 6e 2e 20 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f  n.  The OPEN_DB_
1e780 4b 45 45 50 41 4c 49 56 45 20 66 6c 61 67 20 63  KEEPALIVE flag c
1e790 68 61 6e 67 65 73 20 74 68 61 74 20 73 6f 20 74  hanges that so t
1e7a0 68 61 74 20 69 74 20 70 72 69 6e 74 73 20 61 6e  hat it prints an
1e7b0 20 65 72 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74   error.** but st
1e7c0 69 6c 6c 20 72 65 74 75 72 6e 73 20 77 69 74 68  ill returns with
1e7d0 6f 75 74 20 63 61 6c 6c 69 6e 67 20 65 78 69 74  out calling exit
1e7e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e  ..**.** The OPEN
1e7f0 5f 44 42 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67  _DB_ZIPFILE flag
1e800 20 63 61 75 73 65 73 20 6f 70 65 6e 5f 64 62 28   causes open_db(
1e810 29 20 74 6f 20 70 72 65 66 65 72 20 74 6f 20 6f  ) to prefer to o
1e820 70 65 6e 20 66 69 6c 65 73 20 61 73 20 61 0a 2a  pen files as a.*
1e830 2a 20 5a 49 50 20 61 72 63 68 69 76 65 20 69 66  * ZIP archive if
1e840 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1e850 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 65  ot exist or is e
1e860 6d 70 74 79 20 61 6e 64 20 69 74 73 20 6e 61 6d  mpty and its nam
1e870 65 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65  e matches.** the
1e880 20 2a 2e 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a   *.zip pattern..
1e890 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f  */.#define OPEN_
1e8a0 44 42 5f 4b 45 45 50 41 4c 49 56 45 20 20 20 30  DB_KEEPALIVE   0
1e8b0 78 30 30 31 20 20 20 2f 2a 20 52 65 74 75 72 6e  x001   /* Return
1e8c0 20 61 66 74 65 72 20 65 72 72 6f 72 20 69 66 20   after error if 
1e8d0 74 72 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  true */.#define 
1e8e0 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20  OPEN_DB_ZIPFILE 
1e8f0 20 20 20 20 30 78 30 30 32 20 20 20 2f 2a 20 4f      0x002   /* O
1e900 70 65 6e 20 61 73 20 5a 49 50 20 69 66 20 6e 61  pen as ZIP if na
1e910 6d 65 20 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70  me matches *.zip
1e920 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   */../*.** Make 
1e930 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1e940 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69  e is open.  If i
1e950 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f  t is not, then o
1e960 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  pen it.  If.** t
1e970 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c  he database fail
1e980 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74  s to open, print
1e990 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
1e9a0 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73  e and exit..*/.s
1e9b0 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f  tatic void open_
1e9c0 64 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  db(ShellState *p
1e9d0 2c 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29  , int openFlags)
1e9e0 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
1e9f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   ){.    if( p->o
1ea00 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
1ea10 50 45 4e 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20  PEN_UNSPEC ){.  
1ea20 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69      if( p->zDbFi
1ea30 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e  lename==0 || p->
1ea40 7a 44 62 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  zDbFilename[0]==
1ea50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1ea60 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c  openMode = SHELL
1ea70 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _OPEN_NORMAL;.  
1ea80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea90 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
1eaa0 20 28 75 38 29 64 65 64 75 63 65 44 61 74 61 62   (u8)deduceDatab
1eab0 61 73 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69  aseType(p->zDbFi
1eac0 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  lename, .       
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 28 6f 70 65 6e 46 6c 61 67 73        (openFlags
1eaf0 20 26 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49   & OPEN_DB_ZIPFI
1eb00 4c 45 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d  LE)!=0);.      }
1eb10 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
1eb20 68 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29  h( p->openMode )
1eb30 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  {.      case SHE
1eb40 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
1eb50 53 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  S: {.        sql
1eb60 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e  ite3_open_v2(p->
1eb70 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d  zDbFilename, &p-
1eb80 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >db, .          
1eb90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1eba0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1ebb0 45 4e 5f 43 52 45 41 54 45 2c 20 22 61 70 6e 64  EN_CREATE, "apnd
1ebc0 76 66 73 22 29 3b 0a 20 20 20 20 20 20 20 20 62  vfs");.        b
1ebd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ebe0 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
1ebf0 50 45 4e 5f 48 45 58 44 42 3a 0a 20 20 20 20 20  PEN_HEXDB:.     
1ec00 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1ec10 5f 44 45 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a  _DESERIALIZE: {.
1ec20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ec30 6f 70 65 6e 28 30 2c 20 26 70 2d 3e 64 62 29 3b  open(0, &p->db);
1ec40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ec50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1ec60 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49  se SHELL_OPEN_ZI
1ec70 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20  PFILE: {.       
1ec80 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a   sqlite3_open(":
1ec90 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62  memory:", &p->db
1eca0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1ecb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ecc0 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ecd0 52 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20  READONLY: {.    
1ece0 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
1ecf0 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  _v2(p->zDbFilena
1ed00 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49  me, &p->db, SQLI
1ed10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1ed20 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
1ed30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ed40 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
1ed50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20  EN_UNSPEC:.     
1ed60 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1ed70 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20  _NORMAL: {.     
1ed80 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
1ed90 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1eda0 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
1edb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1edc0 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c      }.    global
1edd0 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  Db = p->db;.    
1ede0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  if( p->db==0 || 
1edf0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1ee00 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
1ee10 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
1ee20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
1ee30 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20  rror: unable to 
1ee40 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22  open database \"
1ee50 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  %s\": %s\n",.   
1ee60 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c         p->zDbFil
1ee70 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  ename, sqlite3_e
1ee80 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
1ee90 20 20 20 20 20 69 66 28 20 6f 70 65 6e 46 6c 61       if( openFla
1eea0 67 73 20 26 20 4f 50 45 4e 5f 44 42 5f 4b 45 45  gs & OPEN_DB_KEE
1eeb0 50 41 4c 49 56 45 20 29 7b 0a 20 20 20 20 20 20  PALIVE ){.      
1eec0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22    sqlite3_open("
1eed0 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64  :memory:", &p->d
1eee0 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  b);.        retu
1eef0 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
1ef00 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
1ef10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ef20 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1ef30 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ION.    sqlite3_
1ef40 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
1ef50 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b  nsion(p->db, 1);
1ef60 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
1ef70 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
1ef80 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1ef90 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72    sqlite3_shathr
1efa0 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ee_init(p->db, 0
1efb0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1efc0 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69  3_completion_ini
1efd0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1efe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1eff0 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69  VE_ZLIB.    sqli
1f000 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74  te3_zipfile_init
1f010 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1f020 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72     sqlite3_sqlar
1f030 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
1f040 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
1f050 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1f060 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1f070 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22  hell_add_schema"
1f080 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 3, SQLITE_UTF8
1f090 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e   shellAddSchemaN
1f0c0 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ame, 0, 0);.    
1f0d0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1f0e0 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1f0f0 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
1f100 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ema", 1, SQLITE_
1f110 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65       shellModule
1f140 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20  Schema, 0, 0);. 
1f150 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1f160 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1f170 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
1f180 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
1f190 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , p,.           
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
1f1c0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
1f1d0 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1f1e0 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  TEM.    sqlite3_
1f1f0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1f200 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31  p->db, "edit", 1
1f210 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1f220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
1f240 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  itFunc, 0, 0);. 
1f250 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1f260 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1f270 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c  , "edit", 2, SQL
1f280 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e           editFun
1f2b0 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  c, 0, 0);.#endif
1f2c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1f2d0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1f2e0 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
1f2f0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
1f300 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1f310 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
1f320 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
1f330 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
1f340 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
1f350 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
1f360 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1f370 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
1f380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f390 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
1f3a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f3b0 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c  _ENABLE_DESERIAL
1f3c0 49 5a 45 0a 20 20 20 20 65 6c 73 65 0a 20 20 20  IZE.    else.   
1f3d0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
1f3e0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53  ==SHELL_OPEN_DES
1f3f0 45 52 49 41 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f  ERIALIZE || p->o
1f400 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
1f410 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20  PEN_HEXDB ){.   
1f420 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1f430 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 30 3b 0a   int nData = 0;.
1f440 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1f450 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 20 20  har *aData;.    
1f460 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
1f470 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45  e==SHELL_OPEN_DE
1f480 53 45 52 49 41 4c 49 5a 45 20 29 7b 0a 20 20 20  SERIALIZE ){.   
1f490 20 20 20 20 20 61 44 61 74 61 20 3d 20 28 75 6e       aData = (un
1f4a0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 72 65 61  signed char*)rea
1f4b0 64 46 69 6c 65 28 70 2d 3e 7a 44 62 46 69 6c 65  dFile(p->zDbFile
1f4c0 6e 61 6d 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20  name, &nData);. 
1f4d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f4e0 20 20 20 20 61 44 61 74 61 20 3d 20 72 65 61 64      aData = read
1f4f0 48 65 78 44 62 28 70 2c 20 26 6e 44 61 74 61 29  HexDb(p, &nData)
1f500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  ;.        if( aD
1f510 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
1f520 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1f530 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69  stderr, "Error i
1f540 6e 20 68 65 78 64 62 20 69 6e 70 75 74 5c 6e 22  n hexdb input\n"
1f550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1f560 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
1f570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1f580 3d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69  = sqlite3_deseri
1f590 61 6c 69 7a 65 28 70 2d 3e 64 62 2c 20 22 6d 61  alize(p->db, "ma
1f5a0 69 6e 22 2c 20 61 44 61 74 61 2c 20 6e 44 61 74  in", aData, nDat
1f5b0 61 2c 20 6e 44 61 74 61 2c 0a 20 20 20 20 20 20  a, nData,.      
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1f5d0 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f  ITE_DESERIALIZE_
1f5e0 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20 20 20  RESIZEABLE |.   
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49  SQLITE_DESERIALI
1f610 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45 29 3b  ZE_FREEONCLOSE);
1f620 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1f630 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1f640 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1f650 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 64 65 73  ror: sqlite3_des
1f660 65 72 69 61 6c 69 7a 65 28 29 20 72 65 74 75 72  erialize() retur
1f670 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
1f680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f690 20 70 2d 3e 73 7a 4d 61 78 3e 30 20 29 7b 0a 20   p->szMax>0 ){. 
1f6a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1f6b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
1f6c0 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54  b, "main", SQLIT
1f6d0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 4c 49 4d  E_FCNTL_SIZE_LIM
1f6e0 49 54 2c 20 26 70 2d 3e 73 7a 4d 61 78 29 3b 0a  IT, &p->szMax);.
1f6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1f700 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
1f710 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  * Attempt to clo
1f720 73 65 20 74 68 65 20 64 61 74 61 62 61 65 73 20  se the databaes 
1f730 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 52 65 70  connection.  Rep
1f740 6f 72 74 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76  ort errors..*/.v
1f750 6f 69 64 20 63 6c 6f 73 65 5f 64 62 28 73 71 6c  oid close_db(sql
1f760 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
1f770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c   rc = sqlite3_cl
1f780 6f 73 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ose(db);.  if( r
1f790 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1f7a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1f7b0 72 6f 72 3a 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ror: sqlite3_clo
1f7c0 73 65 28 29 20 72 65 74 75 72 6e 73 20 25 64 3a  se() returns %d:
1f7d0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1f7e0 72 63 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  rc, sqlite3_errm
1f7f0 73 67 28 64 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a  sg(db));.  } .}.
1f800 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49  .#if HAVE_READLI
1f810 4e 45 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c  NE || HAVE_EDITL
1f820 49 4e 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69  INE./*.** Readli
1f830 6e 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61  ne completion ca
1f840 6c 6c 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  llbacks.*/.stati
1f850 63 20 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65  c char *readline
1f860 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65  _completion_gene
1f870 72 61 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  rator(const char
1f880 20 2a 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74   *text, int stat
1f890 65 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  e){.  static sql
1f8a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1f8b0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 0;.  char *zR
1f8c0 65 74 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d  et;.  if( state=
1f8d0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
1f8e0 7a 53 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  zSql;.    sqlite
1f8f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1f900 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  );.    zSql = sq
1f910 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1f920 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 63  ELECT DISTINCT c
1f930 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45  andidate COLLATE
1f940 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20   nocase".       
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70      "  FROM comp
1f970 6c 65 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52  letion(%Q) ORDER
1f980 20 42 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20   BY 1", text);. 
1f990 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
1f9a0 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20  re_v2(globalDb, 
1f9b0 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1f9c0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f9d0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
1f9e0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
1f9f0 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
1fa00 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a  ITE_ROW ){.    z
1fa10 52 65 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f  Ret = strdup((co
1fa20 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1fa30 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
1fa40 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73  tmt, 0));.  }els
1fa50 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
1fa60 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1fa70 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
1fa80 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d     zRet = 0;.  }
1fa90 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
1faa0 7d 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  }.static char **
1fab0 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1fac0 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ion(const char *
1fad0 7a 54 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72  zText, int iStar
1fae0 74 2c 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20  t, int iEnd){.  
1faf0 72 6c 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d  rl_attempted_com
1fb00 70 6c 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31  pletion_over = 1
1fb10 3b 0a 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f  ;.  return rl_co
1fb20 6d 70 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73  mpletion_matches
1fb30 28 7a 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65  (zText, readline
1fb40 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65  _completion_gene
1fb50 72 61 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66  rator);.}..#elif
1fb60 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a   HAVE_LINENOISE.
1fb70 2f 2a 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20  /*.** Linenoise 
1fb80 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62  completion callb
1fb90 61 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ack.*/.static vo
1fba0 69 64 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d  id linenoise_com
1fbb0 70 6c 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68  pletion(const ch
1fbc0 61 72 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e  ar *zLine, linen
1fbd0 6f 69 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20  oiseCompletions 
1fbe0 2a 6c 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e  *lc){.  int nLin
1fbf0 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 4c 69  e = strlen30(zLi
1fc00 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53  ne);.  int i, iS
1fc10 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tart;.  sqlite3_
1fc20 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1fc30 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1fc40 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
1fc50 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73  ;..  if( nLine>s
1fc60 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29  izeof(zBuf)-30 )
1fc70 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a   return;.  if( z
1fc80 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20  Line[0]=='.' || 
1fc90 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 23 27 29 20 72  zLine[0]=='#') r
1fca0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e  eturn;.  for(i=n
1fcb0 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20  Line-1; i>=0 && 
1fcc0 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69  (isalnum(zLine[i
1fcd0 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d  ]) || zLine[i]==
1fce0 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  '_'); i--){}.  i
1fcf0 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20  f( i==nLine-1 ) 
1fd00 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74  return;.  iStart
1fd10 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79   = i+1;.  memcpy
1fd20 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53  (zBuf, zLine, iS
1fd30 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  tart);.  zSql = 
1fd40 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1fd50 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
1fd60 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41   candidate COLLA
1fd70 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20  TE nocase".     
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70      "  FROM comp
1fda0 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52  letion(%Q,%Q) OR
1fdb0 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20  DER BY 1",.     
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdd0 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72      &zLine[iStar
1fde0 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71  t], zLine);.  sq
1fdf0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1fe00 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c  (globalDb, zSql,
1fe10 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
1fe20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1fe30 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
1fe40 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20  _exec(globalDb, 
1fe50 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75  "PRAGMA page_cou
1fe60 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f  nt", 0, 0, 0); /
1fe70 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  * Load the schem
1fe80 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71  a */.  while( sq
1fe90 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1fea0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1feb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1fec0 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28  *zCompletion = (
1fed0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1fee0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1fef0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
1ff00 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d  nt nCompletion =
1ff10 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ff20 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
1ff30 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b  .    if( iStart+
1ff40 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69  nCompletion < si
1ff50 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a  zeof(zBuf)-1 ){.
1ff60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
1ff70 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c  f+iStart, zCompl
1ff80 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69  etion, nCompleti
1ff90 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e  on+1);.      lin
1ffa0 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74  enoiseAddComplet
1ffb0 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20  ion(lc, zBuf);. 
1ffc0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ffd0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1ffe0 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
1fff0 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
20000 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
20010 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20  g..**.**    \a  
20020 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20    -> alarm.**   
20030 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70   \b    -> backsp
20040 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20  ace.**    \t    
20050 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20  -> tab.**    \n 
20060 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a     -> newline.**
20070 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72      \v    -> ver
20080 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20  tical tab.**    
20090 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65  \f    -> form fe
200a0 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d  ed.**    \r    -
200b0 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72  > carriage retur
200c0 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e  n.**    \s    ->
200d0 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20   space.**    \" 
200e0 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27     -> ".**    \'
200f0 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c      -> '.**    \
20100 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73  \    -> backslas
20110 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e  h.**    \NNN  ->
20120 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72   ascii character
20130 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f   NNN in octal.*/
20140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
20150 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
20160 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74  (char *z){.  int
20170 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b   i, j;.  char c;
20180 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20  .  while( *z && 
20190 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a  *z!='\\' ) z++;.
201a0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
201b0 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
201c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
201d0 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d  =='\\' && z[i+1]
201e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  !=0 ){.      c =
201f0 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
20200 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20  f( c=='a' ){.   
20210 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20       c = '\a';. 
20220 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
20230 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20  =='b' ){.       
20240 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20   c = '\b';.     
20250 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74   }else if( c=='t
20260 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
20270 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\t';.      }el
20280 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b  se if( c=='n' ){
20290 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e  .        c = '\n
202a0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
202b0 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20  f( c=='v' ){.   
202c0 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20       c = '\v';. 
202d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
202e0 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20  =='f' ){.       
202f0 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20   c = '\f';.     
20300 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
20310 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
20320 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
20330 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
20340 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27  .        c = '"'
20350 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
20360 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
20370 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20       c = '\'';. 
20380 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
20390 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
203a0 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20    c = '\\';.    
203b0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27    }else if( c>='
203c0 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a  0' && c<='7' ){.
203d0 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27          c -= '0'
203e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
203f0 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69  i+1]>='0' && z[i
20400 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  +1]<='7' ){.    
20410 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
20420 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
20430 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
20440 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
20450 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
20460 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
20470 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
20480 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33         c = (c<<3
20490 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a  ) + z[i] - '0';.
204a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
204b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
204c0 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63    }.    z[j] = c
204d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20  ;.  }.  if( j<i 
204e0 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  ) z[j] = 0;.}../
204f0 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a  *.** Interpret z
20500 41 72 67 20 61 73 20 65 69 74 68 65 72 20 61 6e  Arg as either an
20510 20 69 6e 74 65 67 65 72 20 6f 72 20 61 20 62 6f   integer or a bo
20520 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20 52 65  olean value.  Re
20530 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a 2a 20 66  turn 1 or 0.** f
20540 6f 72 20 54 52 55 45 20 61 6e 64 20 46 41 4c 53  or TRUE and FALS
20550 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  E.  Return the i
20560 6e 74 65 67 65 72 20 76 61 6c 75 65 20 69 66 20  nteger value if 
20570 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
20580 73 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65  static int boole
20590 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68  anValue(const ch
205a0 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 6e 74  ar *zArg){.  int
205b0 20 69 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b 30   i;.  if( zArg[0
205c0 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31  ]=='0' && zArg[1
205d0 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 66 6f  ]=='x' ){.    fo
205e0 72 28 69 3d 32 3b 20 68 65 78 44 69 67 69 74 56  r(i=2; hexDigitV
205f0 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29 3e 3d 30  alue(zArg[i])>=0
20600 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65  ; i++){}.  }else
20610 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  {.    for(i=0; z
20620 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  Arg[i]>='0' && z
20630 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b  Arg[i]<='9'; i++
20640 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e  ){}.  }.  if( i>
20650 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20  0 && zArg[i]==0 
20660 29 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69  ) return (int)(i
20670 6e 74 65 67 65 72 56 61 6c 75 65 28 7a 41 72 67  ntegerValue(zArg
20680 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  ) & 0xffffffff);
20690 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
206a0 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e  tricmp(zArg, "on
206b0 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
206c0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79  _stricmp(zArg,"y
206d0 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  es")==0 ){.    r
206e0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
206f0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
20700 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d  mp(zArg, "off")=
20710 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
20720 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29  ricmp(zArg,"no")
20730 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
20740 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74 66 38 5f  n 0;.  }.  utf8_
20750 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20760 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20 62 6f 6f  ERROR: Not a boo
20770 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c 22 25 73  lean value: \"%s
20780 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20 5c 22 6e  \". Assuming \"n
20790 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o\".\n",.       
207a0 20 20 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75     zArg);.  retu
207b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
207c0 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 73 68  et or clear a sh
207d0 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f 72 64 69  ell flag accordi
207e0 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20  ng to a boolean 
207f0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
20800 20 76 6f 69 64 20 73 65 74 4f 72 43 6c 65 61 72   void setOrClear
20810 46 6c 61 67 28 53 68 65 6c 6c 53 74 61 74 65 20  Flag(ShellState 
20820 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c  *p, unsigned mFl
20830 61 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ag, const char *
20840 7a 41 72 67 29 7b 0a 20 20 69 66 28 20 62 6f 6f  zArg){.  if( boo
20850 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72 67 29 20  leanValue(zArg) 
20860 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 65 74 46  ){.    ShellSetF
20870 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20  lag(p, mFlag);. 
20880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 68 65 6c   }else{.    Shel
20890 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 6d 46  lClearFlag(p, mF
208a0 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  lag);.  }.}../*.
208b0 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 75 74 70  ** Close an outp
208c0 75 74 20 66 69 6c 65 2c 20 61 73 73 75 6d 69 6e  ut file, assumin
208d0 67 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 65  g it is not stde
208e0 72 72 20 6f 72 20 73 74 64 6f 75 74 0a 2a 2f 0a  rr or stdout.*/.
208f0 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
20900 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 46 49  ut_file_close(FI
20910 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28 20 66 20  LE *f){.  if( f 
20920 26 26 20 66 21 3d 73 74 64 6f 75 74 20 26 26 20  && f!=stdout && 
20930 66 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f  f!=stderr ) fclo
20940 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(f);.}../*.** 
20950 54 72 79 20 74 6f 20 6f 70 65 6e 20 61 6e 20 6f  Try to open an o
20960 75 74 70 75 74 20 66 69 6c 65 2e 20 20 20 54 68  utput file.   Th
20970 65 20 6e 61 6d 65 73 20 22 73 74 64 6f 75 74 22  e names "stdout"
20980 20 61 6e 64 20 22 73 74 64 65 72 72 22 20 61 72   and "stderr" ar
20990 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  e.** recognized 
209a0 61 6e 64 20 64 6f 20 74 68 65 20 72 69 67 68 74  and do the right
209b0 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c 20 69 73   thing.  NULL is
209c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
209d0 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69 6c 65 6e   output.** filen
209e0 61 6d 65 20 69 73 20 22 6f 66 66 22 2e 0a 2a 2f  ame is "off"..*/
209f0 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 6f 75  .static FILE *ou
20a00 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 63  tput_file_open(c
20a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
20a20 2c 20 69 6e 74 20 62 54 65 78 74 4d 6f 64 65 29  , int bTextMode)
20a30 7b 0a 20 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69  {.  FILE *f;.  i
20a40 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
20a50 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a  "stdout")==0 ){.
20a60 20 20 20 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a      f = stdout;.
20a70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
20a80 6d 70 28 7a 46 69 6c 65 2c 20 22 73 74 64 65 72  mp(zFile, "stder
20a90 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  r")==0 ){.    f 
20aa0 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73  = stderr;.  }els
20ab0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
20ac0 6c 65 2c 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b  le, "off")==0 ){
20ad0 0a 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65  .    f = 0;.  }e
20ae0 6c 73 65 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70  lse{.    f = fop
20af0 65 6e 28 7a 46 69 6c 65 2c 20 62 54 65 78 74 4d  en(zFile, bTextM
20b00 6f 64 65 20 3f 20 22 77 22 20 3a 20 22 77 62 22  ode ? "w" : "wb"
20b10 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d 30 20  );.    if( f==0 
20b20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
20b30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
20b40 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
20b50 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
20b60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
20b70 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66  return f;.}..#if
20b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b90 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 41 20 72  _TRACE./*.** A r
20ba0 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c  outine for handl
20bb0 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  ing output from 
20bc0 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e  sqlite3_trace().
20bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
20be0 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63  ql_trace_callbac
20bf0 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  k(.  unsigned mT
20c00 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
20c10 54 68 65 20 74 72 61 63 65 20 74 79 70 65 20 2a  The trace type *
20c20 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20  /.  void *pArg, 
20c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c40 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 70 6f  he ShellState po
20c50 69 6e 74 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20  inter */.  void 
20c60 2a 70 50 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pP,            
20c70 20 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 61 20     /* Usually a 
20c80 70 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  pointer to sqlit
20c90 65 5f 73 74 6d 74 20 2a 2f 0a 20 20 76 6f 69 64  e_stmt */.  void
20ca0 20 2a 70 58 20 20 20 20 20 20 20 20 20 20 20 20   *pX            
20cb0 20 20 20 20 2f 2a 20 41 75 78 69 6c 69 61 72 79      /* Auxiliary
20cc0 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20   output */.){.  
20cd0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
20ce0 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72  (ShellState*)pAr
20cf0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  g;.  sqlite3_stm
20d00 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 6f 6e 73  t *pStmt;.  cons
20d10 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
20d20 69 6e 74 20 6e 53 71 6c 3b 0a 20 20 69 66 28 20  int nSql;.  if( 
20d30 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30 20 29  p->traceOut==0 )
20d40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
20d50 20 6d 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54   mType==SQLITE_T
20d60 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20  RACE_CLOSE ){.  
20d70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
20d80 3e 74 72 61 63 65 4f 75 74 2c 20 22 2d 2d 20 63  >traceOut, "-- c
20d90 6c 6f 73 69 6e 67 20 64 61 74 61 62 61 73 65 20  losing database 
20da0 63 6f 6e 6e 65 63 74 69 6f 6e 5c 6e 22 29 3b 0a  connection\n");.
20db0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20dc0 7d 0a 20 20 69 66 28 20 6d 54 79 70 65 21 3d 53  }.  if( mType!=S
20dd0 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 20  QLITE_TRACE_ROW 
20de0 26 26 20 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  && ((const char*
20df0 29 70 58 29 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  )pX)[0]=='-' ){.
20e00 20 20 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73      zSql = (cons
20e10 74 20 63 68 61 72 2a 29 70 58 3b 0a 20 20 7d 65  t char*)pX;.  }e
20e20 6c 73 65 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d  lse{.    pStmt =
20e30 20 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29   (sqlite3_stmt*)
20e40 70 50 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  pP;.    switch( 
20e50 70 2d 3e 65 54 72 61 63 65 54 79 70 65 20 29 7b  p->eTraceType ){
20e60 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
20e70 4c 5f 54 52 41 43 45 5f 45 58 50 41 4e 44 45 44  L_TRACE_EXPANDED
20e80 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c  : {.        zSql
20e90 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61 6e   = sqlite3_expan
20ea0 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  ded_sql(pStmt);.
20eb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20ec0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
20ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
20ee0 41 4c 49 5a 45 0a 20 20 20 20 20 20 63 61 73 65  ALIZE.      case
20ef0 20 53 48 45 4c 4c 5f 54 52 41 43 45 5f 4e 4f 52   SHELL_TRACE_NOR
20f00 4d 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  MALIZED: {.     
20f10 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
20f20 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73 71 6c  3_normalized_sql
20f30 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
20f40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
20f50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 65 66  #endif.      def
20f60 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
20f70 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
20f80 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
20f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20fa0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
20fb0 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
20fc0 72 6e 20 30 3b 0a 20 20 6e 53 71 6c 20 3d 20 73  rn 0;.  nSql = s
20fd0 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20  trlen30(zSql);. 
20fe0 20 77 68 69 6c 65 28 20 6e 53 71 6c 3e 30 20 26   while( nSql>0 &
20ff0 26 20 7a 53 71 6c 5b 6e 53 71 6c 2d 31 5d 3d 3d  & zSql[nSql-1]==
21000 27 3b 27 20 29 7b 20 6e 53 71 6c 2d 2d 3b 20 7d  ';' ){ nSql--; }
21010 0a 20 20 73 77 69 74 63 68 28 20 6d 54 79 70 65  .  switch( mType
21020 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
21030 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 3a 0a 20  ITE_TRACE_ROW:. 
21040 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21050 52 41 43 45 5f 53 54 4d 54 3a 20 7b 0a 20 20 20  RACE_STMT: {.   
21060 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
21070 2d 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e 2a  ->traceOut, "%.*
21080 73 3b 5c 6e 22 2c 20 6e 53 71 6c 2c 20 7a 53 71  s;\n", nSql, zSq
21090 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
210a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
210b0 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 50 52 4f  SQLITE_TRACE_PRO
210c0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  FILE: {.      sq
210d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 61 6e  lite3_int64 nNan
210e0 6f 73 65 63 20 3d 20 2a 28 73 71 6c 69 74 65 33  osec = *(sqlite3
210f0 5f 69 6e 74 36 34 2a 29 70 58 3b 0a 20 20 20 20  _int64*)pX;.    
21100 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
21110 3e 74 72 61 63 65 4f 75 74 2c 20 22 25 2e 2a 73  >traceOut, "%.*s
21120 3b 20 2d 2d 20 25 6c 6c 64 20 6e 73 5c 6e 22 2c  ; -- %lld ns\n",
21130 20 6e 53 71 6c 2c 20 7a 53 71 6c 2c 20 6e 4e 61   nSql, zSql, nNa
21140 6e 6f 73 65 63 29 3b 0a 20 20 20 20 20 20 62 72  nosec);.      br
21150 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
21160 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
21170 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d  dif../*.** A no-
21180 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  op routine that 
21190 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e  runs with the ".
211a0 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d  breakpoint" doc-
211b0 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69  command.  This i
211c0 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70  s.** a useful sp
211d0 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62 75  ot to set a debu
211e0 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e  gger breakpoint.
211f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21200 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
21210 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
21220 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20  int nCall = 0;. 
21230 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a   nCall++;.}../*.
21240 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65  ** An object use
21250 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56 20  d to read a CSV 
21260 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20  and other files 
21270 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74  for import..*/.t
21280 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6d  ypedef struct Im
21290 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74  portCtx ImportCt
212a0 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74  x;.struct Import
212b0 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx {.  const ch
212c0 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e  ar *zFile;  /* N
212d0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
212e0 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20   file */.  FILE 
212f0 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *in;           /
21300 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20 74  * Read the CSV t
21310 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e  ext from this in
21320 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20  put stream */.  
21330 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
21340 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74      /* Accumulat
21350 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66 69  ed text for a fi
21360 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  eld */.  int n; 
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21380 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
21390 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  in z */.  int nA
213a0 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  lloc;         /*
213b0 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
213c0 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e   for z[] */.  in
213d0 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20  t nLine;        
213e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e    /* Current lin
213f0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
21400 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20  t bNotFirst;    
21410 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65    /* True if one
21420 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61   or more bytes a
21430 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20  lready read */. 
21440 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20   int cTerm;     
21450 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65       /* Characte
21460 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  r that terminate
21470 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  d the most recen
21480 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  t field */.  int
21490 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20   cColSep;       
214a0 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73   /* The column s
214b0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
214c0 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c  er.  (Usually ",
214d0 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77  ") */.  int cRow
214e0 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  Sep;        /* T
214f0 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  he row separator
21500 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73   character.  (Us
21510 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d  ually "\n") */.}
21520 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73  ;../* Append a s
21530 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b  ingle byte to z[
21540 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ] */.static void
21550 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
21560 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70  har(ImportCtx *p
21570 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20  , int c){.  if( 
21580 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f  p->n+1>=p->nAllo
21590 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
215a0 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20  oc += p->nAlloc 
215b0 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20  + 100;.    p->z 
215c0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
215d0 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  c64(p->z, p->nAl
215e0 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
215f0 3e 7a 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75  >z==0 ) shell_ou
21600 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
21610 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b   }.  p->z[p->n++
21620 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a  ] = (char)c;.}..
21630 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
21640 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65   field of CSV te
21650 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20  xt.  Compatible 
21660 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e 64  with rfc4180 and
21670 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74   extended.** wit
21680 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20  h the option of 
21690 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61 74  having a separat
216a0 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c  or other than ",
216b0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  "..**.**   +  In
216c0 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
216d0 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
216e0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
216f0 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
21700 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
21710 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
21720 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
21730 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
21740 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
21750 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
21760 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
21770 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e   default is ",".
21780 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
21790 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
217a0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
217b0 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e  default is "\n".
217c0 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
217d0 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
217e0 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69  number in p->nLi
217f0 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  ne..**   +  Stor
21800 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  e the character 
21810 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
21820 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e  the field in p->
21830 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a  cTerm.  Store.**
21840 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64        EOF on end
21850 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b  -of-file..**   +
21860 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20    Report syntax 
21870 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72  errors on stderr
21880 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
21890 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73  *SQLITE_CDECL cs
218a0 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
218b0 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a  (ImportCtx *p){.
218c0 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63    int c;.  int c
218d0 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70  Sep = p->cColSep
218e0 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70  ;.  int rSep = p
218f0 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e  ->cRowSep;.  p->
21900 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65  n = 0;.  c = fge
21910 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28  tc(p->in);.  if(
21920 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49   c==EOF || seenI
21930 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
21940 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a  p->cTerm = EOF;.
21950 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21960 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29  }.  if( c=='"' )
21970 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70  {.    int pc, pp
21980 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  c;.    int start
21990 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b  Line = p->nLine;
219a0 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20  .    int cQuote 
219b0 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70  = c;.    pc = pp
219c0 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  c = 0;.    while
219d0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  ( 1 ){.      c =
219e0 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
219f0 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70       if( c==rSep
21a00 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20   ) p->nLine++;. 
21a10 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f       if( c==cQuo
21a20 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
21a30 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  ( pc==cQuote ){.
21a40 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30            pc = 0
21a50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
21a60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
21a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21a80 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63  ( (c==cSep && pc
21a90 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
21aa0 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20   || (c==rSep && 
21ab0 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
21ac0 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26     || (c==rSep &
21ad0 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70  & pc=='\r' && pp
21ae0 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
21af0 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20    || (c==EOF && 
21b00 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
21b10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b    ){.        do{
21b20 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28   p->n--; }while(
21b30 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75   p->z[p->n]!=cQu
21b40 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ote );.        p
21b50 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20  ->cTerm = c;.   
21b60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21b70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63    }.      if( pc
21b80 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27  ==cQuote && c!='
21b90 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75  \r' ){.        u
21ba0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
21bb0 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63  r, "%s:%d: unesc
21bc0 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65  aped %c characte
21bd0 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
21be0 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20        p->zFile, 
21bf0 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65  p->nLine, cQuote
21c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21c10 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20   if( c==EOF ){. 
21c20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
21c30 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
21c40 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  d: unterminated 
21c50 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c  %c-quoted field\
21c60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21c70 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74      p->zFile, st
21c80 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  artLine, cQuote)
21c90 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65  ;.        p->cTe
21ca0 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  rm = c;.        
21cb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21cc0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
21cd0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
21ce0 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20       ppc = pc;. 
21cf0 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
21d00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21d10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
21d20 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62 65  e first field be
21d30 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20 69  ing parsed and i
21d40 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  t begins with th
21d50 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42  e.    ** UTF-8 B
21d60 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46 29  OM  (0xEF BB BF)
21d70 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42   then skip the B
21d80 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63  OM */.    if( (c
21d90 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20  &0xff)==0xef && 
21da0 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20  p->bNotFirst==0 
21db0 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
21dc0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
21dd0 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
21de0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
21df0 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
21e00 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  xbb ){.        i
21e10 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
21e20 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20  r(p, c);.       
21e30 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
21e40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
21e50 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b  c&0xff)==0xbf ){
21e60 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e  .          p->bN
21e70 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  otFirst = 1;.   
21e80 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b         p->n = 0;
21e90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21ea0 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  n csv_read_one_f
21eb0 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20  ield(p);.       
21ec0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
21ed0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45  .    while( c!=E
21ee0 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26  OF && c!=cSep &&
21ef0 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c!=rSep ){.    
21f00 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
21f10 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
21f20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
21f30 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
21f40 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
21f50 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20     p->nLine++;. 
21f60 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20       if( p->n>0 
21f70 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d  && p->z[p->n-1]=
21f80 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a  ='\r' ) p->n--;.
21f90 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65      }.    p->cTe
21fa0 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  rm = c;.  }.  if
21fb0 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d  ( p->z ) p->z[p-
21fc0 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e  >n] = 0;.  p->bN
21fd0 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72  otFirst = 1;.  r
21fe0 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
21ff0 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
22000 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64  field of ASCII d
22010 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a  elimited text..*
22020 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20  *.**   +  Input 
22030 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e  comes from p->in
22040 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
22050 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20  results in p->z 
22060 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20  of length p->n. 
22070 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70   Space to hold p
22080 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  ->z comes.**    
22090 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d    from sqlite3_m
220a0 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20  alloc64()..**   
220b0 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61  +  Use p->cSep a
220c0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  s the column sep
220d0 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
220e0 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a  ault is "\x1F"..
220f0 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72  **   +  Use p->r
22100 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73  Sep as the row s
22110 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
22120 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22  efault is "\x1E"
22130 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
22140 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20  rack of the row 
22150 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69  number in p->nLi
22160 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  ne..**   +  Stor
22170 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  e the character 
22180 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
22190 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e  the field in p->
221a0 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a  cTerm.  Store.**
221b0 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64        EOF on end
221c0 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b  -of-file..**   +
221d0 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20    Report syntax 
221e0 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72  errors on stderr
221f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
22200 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73  *SQLITE_CDECL as
22210 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  cii_read_one_fie
22220 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29  ld(ImportCtx *p)
22230 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
22240 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53   cSep = p->cColS
22250 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d  ep;.  int rSep =
22260 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70   p->cRowSep;.  p
22270 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66  ->n = 0;.  c = f
22280 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69  getc(p->in);.  i
22290 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65  f( c==EOF || see
222a0 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  nInterrupt ){.  
222b0 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46    p->cTerm = EOF
222c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
222d0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d    }.  while( c!=
222e0 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
222f0 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
22300 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
22310 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63  har(p, c);.    c
22320 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
22330 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53  .  }.  if( c==rS
22340 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69  ep ){.    p->nLi
22350 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ne++;.  }.  p->c
22360 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20  Term = c;.  if( 
22370 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e  p->z ) p->z[p->n
22380 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
22390 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  p->z;.}../*.** T
223a0 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64  ry to transfer d
223b0 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54  ata for table zT
223c0 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72  able.  If an err
223d0 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65  or is seen while
223e0 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  .** moving forwa
223f0 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61  rd, try to go ba
22400 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62 61  ckwards.  The ba
22410 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74  ckwards movement
22420 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66   won't.** work f
22430 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
22440 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
22450 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f  ic void tryToClo
22460 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53  neData(.  ShellS
22470 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74  tate *p,.  sqlit
22480 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e  e3 *newDb,.  con
22490 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a  st char *zTable.
224a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
224b0 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20  t *pQuery = 0;. 
224c0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
224d0 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68  Insert = 0;.  ch
224e0 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a  ar *zQuery = 0;.
224f0 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20    char *zInsert 
22500 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
22510 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
22520 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72  int nTable = str
22530 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20  len30(zTable);. 
22540 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e   int k = 0;.  in
22550 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  t cnt = 0;.  con
22560 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20  st int spinRate 
22570 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65  = 10000;..  zQue
22580 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
22590 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
225a0 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61  ROM \"%w\"", zTa
225b0 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ble);.  rc = sql
225c0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
225d0 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
225e0 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
225f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22600 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
22610 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
22620 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
22630 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22640 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
22650 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
22660 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
22670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  ,.            zQ
22680 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
22690 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
226a0 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33   }.  n = sqlite3
226b0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51  _column_count(pQ
226c0 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74  uery);.  zInsert
226d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
226e0 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65  c64(200 + nTable
226f0 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a   + n*3);.  if( z
22700 49 6e 73 65 72 74 3d 3d 30 20 29 20 73 68 65 6c  Insert==0 ) shel
22710 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28  l_out_of_memory(
22720 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
22730 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65  rintf(200+nTable
22740 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20  ,zInsert,.      
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
22760 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
22770 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45  NTO \"%s\" VALUE
22780 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
22790 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49   i = strlen30(zI
227a0 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d  nsert);.  for(j=
227b0 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<n; j++){.  
227c0 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
227d0 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20  +i, ",?", 2);.  
227e0 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20    i += 2;.  }.  
227f0 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
22800 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63  , ");", 3);.  rc
22810 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
22820 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e  re_v2(newDb, zIn
22830 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65  sert, -1, &pInse
22840 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  rt, 0);.  if( rc
22850 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
22860 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
22870 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
22880 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
22890 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
228a0 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
228b0 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
228c0 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20  g(newDb),.      
228d0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
228e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
228f0 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72  _xfer;.  }.  for
22900 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b  (k=0; k<2; k++){
22910 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
22920 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
22930 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
22940 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ROW ){.      for
22950 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
22960 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
22970 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22980 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20  type(pQuery, i) 
22990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
229a0 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
229b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
229c0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
229d0 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20  Insert, i+1);.  
229e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
229f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22a00 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
22a10 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
22a20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22a30 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e  3_bind_int64(pIn
22a40 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
22a50 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
22a60 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
22a70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22a80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22a90 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
22aa0 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
22ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
22ac0 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72  nd_double(pInser
22ad0 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
22ae0 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51  column_double(pQ
22af0 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
22b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22b20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
22b30 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  EXT: {.         
22b40 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
22b50 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b  text(pInsert, i+
22b60 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
22b90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
22ba0 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c           -1, SQL
22bd0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
22be0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22c00 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
22c10 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
22c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
22c30 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c  nd_blob(pInsert,
22c40 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
22c50 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79  lumn_blob(pQuery
22c60 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
22ca0 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c  bytes(pQuery,i),
22cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
22ce0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
22cf0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22d00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22d10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
22d20 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20   End for */.    
22d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
22d40 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
22d50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22d60 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
22d70 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53  ITE_ROW && rc!=S
22d80 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
22d90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
22da0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
22db0 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69   %d: %s\n", sqli
22dc0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
22dd0 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20  code(newDb),.   
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
22e00 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20  msg(newDb));.   
22e10 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
22e20 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
22e30 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  );.      cnt++;.
22e40 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73        if( (cnt%s
22e50 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20  pinRate)==0 ){. 
22e60 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
22e70 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63  c\b", "|/-\\"[(c
22e80 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29  nt/spinRate)%4])
22e90 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
22ea0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
22eb0 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77  }.    } /* End w
22ec0 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  hile */.    if( 
22ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
22ee0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
22ef0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
22f00 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
22f10 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
22f20 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
22f30 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
22f40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
22f50 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77  w\" ORDER BY row
22f60 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20  id DESC;",.     
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b          zTable);
22f90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22fa0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
22fb0 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
22fc0 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
22fd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22fe0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22ff0 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63  err, "Warning: c
23000 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c  annot step \"%s\
23010 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54  " backwards", zT
23020 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
23030 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a  ak;.    }.  } /*
23040 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29   End for(k=0...)
23050 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66   */..end_data_xf
23060 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er:.  sqlite3_fi
23070 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
23080 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
23090 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73  ze(pInsert);.  s
230a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
230b0 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
230c0 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a  ree(zInsert);.}.
230d0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74  ../*.** Try to t
230e0 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73  ransfer all rows
230f0 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74   of the schema t
23100 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65  hat match zWhere
23110 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72  .  For.** each r
23120 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45  ow, invoke xForE
23130 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a  ach() on the obj
23140 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74  ect defined by t
23150 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61  hat row..** If a
23160 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
23170 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76  ntered while mov
23180 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f  ing forward thro
23190 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ugh the.** sqlit
231a0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20  e_master table, 
231b0 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67  try again moving
231c0 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73   backwards..*/.s
231d0 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
231e0 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53  CloneSchema(.  S
231f0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20  hellState *p,.  
23200 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a  sqlite3 *newDb,.
23210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
23220 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78  here,.  void (*x
23230 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74  ForEach)(ShellSt
23240 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f  ate*,sqlite3*,co
23250 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
23260 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
23270 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
23280 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *zQuery = 0;.  
23290 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
232a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
232b0 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Name;.  const un
232c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71  signed char *zSq
232d0 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  l;.  char *zErrM
232e0 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72  sg = 0;..  zQuer
232f0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
23300 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
23310 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
23320 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22       " WHERE %s"
23350 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20  , zWhere);.  rc 
23360 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
23370 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
23380 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
23390 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
233a0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
233b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
233c0 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d   (%d) %s on [%s]
233d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
233e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
233f0 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
23400 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
23410 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
23420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23430 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
23440 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d    goto end_schem
23450 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68  a_xfer;.  }.  wh
23460 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
23470 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
23480 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
23490 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
234a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
234b0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
234c0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zSql = sqlite3_c
234d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
234e0 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74  y, 1);.    print
234f0 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d  f("%s... ", zNam
23500 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75  e); fflush(stdou
23510 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
23520 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e  exec(newDb, (con
23530 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30  st char*)zSql, 0
23540 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
23550 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
23560 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
23570 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
23580 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25  ror: %s\nSQL: [%
23590 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20  s]\n", zErrMsg, 
235a0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
235b0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
235c0 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73  g);.      zErrMs
235d0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
235e0 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b   if( xForEach ){
235f0 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28  .      xForEach(
23600 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  p, newDb, (const
23610 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20   char*)zName);. 
23620 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
23630 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20  "done\n");.  }. 
23640 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23650 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
23660 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
23670 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
23680 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
23690 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
236a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
236b0 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
236c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
236d0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  " WHERE %s ORDER
23700 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
23710 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63   zWhere);.    rc
23720 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
23730 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
23740 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
23750 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
23760 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
23770 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
23780 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
23790 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
237c0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
237d0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
237e0 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51                zQ
23800 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74  uery);.      got
23810 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  o end_schema_xfe
23820 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  r;.    }.    whi
23830 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
23840 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
23850 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
23860 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
23870 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
23880 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
23890 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
238a0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
238b0 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  uery, 1);.      
238c0 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
238d0 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
238e0 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73  stdout);.      s
238f0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
23900 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
23910 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
23920 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
23930 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
23940 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
23950 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
23960 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  %s\nSQL: [%s]\n"
23970 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29  , zErrMsg, zSql)
23980 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23990 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
239a0 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67  .        zErrMsg
239b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
239c0 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68      if( xForEach
239d0 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72   ){.        xFor
239e0 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28  Each(p, newDb, (
239f0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d  const char*)zNam
23a00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
23a10 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e    printf("done\n
23a20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ");.    }.  }.en
23a30 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20  d_schema_xfer:. 
23a40 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
23a50 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(pQuery);.  sql
23a60 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
23a70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
23a80 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
23a90 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77  file named "zNew
23aa0 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63  Db".  Try to rec
23ab0 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66  over as much inf
23ac0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70  ormation.** as p
23ad0 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74  ossible out of t
23ae0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
23af0 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65   (which might be
23b00 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72   corrupt) and wr
23b10 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a  ite it.** into z
23b20 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  NewDb..*/.static
23b30 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65   void tryToClone
23b40 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
23b50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
23b60 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Db){.  int rc;. 
23b70 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20   sqlite3 *newDb 
23b80 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73  = 0;.  if( acces
23b90 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29  s(zNewDb,0)==0 )
23ba0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
23bb0 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20  f(stderr, "File 
23bc0 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65  \"%s\" already e
23bd0 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44  xists.\n", zNewD
23be0 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  b);.    return;.
23bf0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
23c00 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20  e3_open(zNewDb, 
23c10 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72  &newDb);.  if( r
23c20 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
23c30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61  intf(stderr, "Ca
23c40 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70  nnot create outp
23c50 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c  ut database: %s\
23c60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23c70 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e  sqlite3_errmsg(n
23c80 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ewDb));.  }else{
23c90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
23ca0 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
23cb0 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
23cc0 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  =ON;", 0, 0, 0);
23cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
23ce0 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20  c(newDb, "BEGIN 
23cf0 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20  EXCLUSIVE;", 0, 
23d00 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f  0, 0);.    tryTo
23d10 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
23d20 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62  ewDb, "type='tab
23d30 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65  le'", tryToClone
23d40 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f  Data);.    tryTo
23d50 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
23d60 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61  ewDb, "type!='ta
23d70 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73  ble'", 0);.    s
23d80 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
23d90 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c  b, "COMMIT;", 0,
23da0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
23db0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
23dc0 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
23dd0 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
23de0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63  , 0, 0);.  }.  c
23df0 6c 6f 73 65 5f 64 62 28 6e 65 77 44 62 29 3b 0a  lose_db(newDb);.
23e00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
23e10 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 20  the output file 
23e20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75 74 2e 0a  back to stdout..
23e30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e  **.** If the p->
23e40 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61 67 20 69  doXdgOpen flag i
23e50 73 20 73 65 74 2c 20 74 68 61 74 20 6d 65 61 6e  s set, that mean
23e60 73 20 74 68 65 20 6f 75 74 70 75 74 20 77 61 73  s the output was
23e70 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64 69 72 65   being.** redire
23e80 63 74 65 64 20 74 6f 20 61 20 74 65 6d 70 6f 72  cted to a tempor
23e90 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 62  ary file named b
23ea0 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2e 20  y p->zTempFile. 
23eb0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 0a 2a   In that case,.*
23ec0 2a 20 6c 61 75 6e 63 68 20 73 74 61 72 74 2f 6f  * launch start/o
23ed0 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20 6f 6e 20  pen/xdg-open on 
23ee0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 66  that temporary f
23ef0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
23f00 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
23f10 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
23f20 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
23f30 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
23f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23f50 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73  _POPEN.    pclos
23f60 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  e(p->out);.#endi
23f70 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  f.  }else{.    o
23f80 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
23f90 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66 6e 64 65  (p->out);.#ifnde
23fa0 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  f SQLITE_NOHAVE_
23fb0 53 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20 70  SYSTEM.    if( p
23fc0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 7b 0a 20  ->doXdgOpen ){. 
23fd0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23fe0 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20 3d 0a 23  *zXdgOpenCmd =.#
23ff0 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
24000 32 29 0a 20 20 20 20 20 20 22 73 74 61 72 74 22  2).      "start"
24010 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
24020 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 20  __APPLE__).     
24030 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73 65 0a 20   "open";.#else. 
24040 20 20 20 20 20 22 78 64 67 2d 6f 70 65 6e 22 3b       "xdg-open";
24050 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68  .#endif.      ch
24060 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 20 20  ar *zCmd;.      
24070 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zCmd = sqlite3_m
24080 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c 20  printf("%s %s", 
24090 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e  zXdgOpenCmd, p->
240a0 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  zTempFile);.    
240b0 20 20 69 66 28 20 73 79 73 74 65 6d 28 7a 43 6d    if( system(zCm
240c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  d) ){.        ut
240d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
240e0 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25 73 5d 5c  , "Failed: [%s]\
240f0 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20  n", zCmd);.     
24100 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24110 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 20  _free(zCmd);.   
24120 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70     outputModePop
24130 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 6f  (p);.      p->do
24140 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  XdgOpen = 0;.   
24150 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
24160 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48  fined(SQLITE_NOH
24170 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 20  AVE_SYSTEM) */. 
24180 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69 6c 65 5b   }.  p->outfile[
24190 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6f 75 74  0] = 0;.  p->out
241a0 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a   = stdout;.}../*
241b0 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51 4c 20 63  .** Run an SQL c
241c0 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74 75 72  ommand and retur
241d0 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 69 6e 74  n the single int
241e0 65 67 65 72 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  eger result..*/.
241f0 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 69 6e  static int db_in
24200 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  t(ShellState *p,
24210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
24220 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l){.  sqlite3_st
24230 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
24240 20 72 65 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69   res = 0;.  sqli
24250 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
24260 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
24270 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
24280 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74  ( pStmt && sqlit
24290 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
242a0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
242b0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
242c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
242d0 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ,0);.  }.  sqlit
242e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
242f0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  t);.  return res
24300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
24310 72 74 20 61 20 32 2d 62 79 74 65 20 6f 72 20 34  rt a 2-byte or 4
24320 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
24330 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
24340 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
24350 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
24360 64 20 69 6e 74 20 67 65 74 32 62 79 74 65 49 6e  d int get2byteIn
24370 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t(unsigned char 
24380 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  *a){.  return (a
24390 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a  [0]<<8) + a[1];.
243a0 7d 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  }.static unsigne
243b0 64 20 69 6e 74 20 67 65 74 34 62 79 74 65 49 6e  d int get4byteIn
243c0 74 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t(unsigned char 
243d0 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  *a){.  return (a
243e0 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61 5b 31 5d  [0]<<24) + (a[1]
243f0 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d 3c 3c 38  <<16) + (a[2]<<8
24400 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a  ) + a[3];.}../*.
24410 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
24420 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e 66 6f 22  n of the ".info"
24430 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
24440 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f  Return 1 on erro
24450 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e  r, 2 to exit, an
24460 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  d 0 otherwise..*
24470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
24480 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e  ll_dbinfo_comman
24490 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  d(ShellState *p,
244a0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
244b0 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73 74 61 74  **azArg){.  stat
244c0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
244d0 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
244e0 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74 3b 20 7d  ame; int ofst; }
244f0 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20   aField[] = {.  
24500 20 20 20 7b 20 22 66 69 6c 65 20 63 68 61 6e 67     { "file chang
24510 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20 20 32 34  e counter:",  24
24520 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74    },.     { "dat
24530 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
24540 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20 20 20 20  :",  28  },.    
24550 20 7b 20 22 66 72 65 65 6c 69 73 74 20 70 61 67   { "freelist pag
24560 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33 36 20 20  e count:",  36  
24570 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d  },.     { "schem
24580 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20 20 20 20  a cookie:",     
24590 20 20 20 34 30 20 20 7d 2c 0a 20 20 20 20 20 7b     40  },.     {
245a0 20 22 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 3a   "schema format:
245b0 22 2c 20 20 20 20 20 20 20 20 34 34 20 20 7d 2c  ",        44  },
245c0 0a 20 20 20 20 20 7b 20 22 64 65 66 61 75 6c 74  .     { "default
245d0 20 63 61 63 68 65 20 73 69 7a 65 3a 22 2c 20 20   cache size:",  
245e0 20 34 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   48  },.     { "
245f0 61 75 74 6f 76 61 63 75 75 6d 20 74 6f 70 20 72  autovacuum top r
24600 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d 2c 0a 20  oot:",  52  },. 
24610 20 20 20 20 7b 20 22 69 6e 63 72 65 6d 65 6e 74      { "increment
24620 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20 20 20 36  al vacuum:",   6
24630 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65  4  },.     { "te
24640 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22 2c 20 20  xt encoding:",  
24650 20 20 20 20 20 20 35 36 20 20 7d 2c 0a 20 20 20        56  },.   
24660 20 20 7b 20 22 75 73 65 72 20 76 65 72 73 69 6f    { "user versio
24670 6e 3a 22 2c 20 20 20 20 20 20 20 20 20 36 30 20  n:",         60 
24680 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 70 70 6c   },.     { "appl
24690 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c 20 20 20  ication id:",   
246a0 20 20 20 20 36 38 20 20 7d 2c 0a 20 20 20 20 20      68  },.     
246b0 7b 20 22 73 6f 66 74 77 61 72 65 20 76 65 72 73  { "software vers
246c0 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36 20 20 7d  ion:",     96  }
246d0 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
246e0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63  const struct { c
246f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24700 3b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  ; const char *zS
24710 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b 5d 20 3d  ql; } aQuery[] =
24720 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65   {.     { "numbe
24730 72 20 6f 66 20 74 61 62 6c 65 73 3a 22 2c 0a 20  r of tables:",. 
24740 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
24750 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
24760 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
24770 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
24780 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 65 73 3a  mber of indexes:
24790 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
247a0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
247b0 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 69  %s WHERE type='i
247c0 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20 20 20 7b  ndex'" },.     {
247d0 20 22 6e 75 6d 62 65 72 20 6f 66 20 74 72 69 67   "number of trig
247e0 67 65 72 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  gers:",.       "
247f0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
24800 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
24810 70 65 3d 27 74 72 69 67 67 65 72 27 22 20 7d 2c  pe='trigger'" },
24820 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
24830 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20 20 20 20  of views:",.    
24840 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
24850 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
24860 45 20 74 79 70 65 3d 27 76 69 65 77 27 22 20 7d  E type='view'" }
24870 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65 6d 61  ,.     { "schema
24880 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20 20 20 20   size:",.       
24890 22 53 45 4c 45 43 54 20 74 6f 74 61 6c 28 6c 65  "SELECT total(le
248a0 6e 67 74 68 28 73 71 6c 29 29 20 46 52 4f 4d 20  ngth(sql)) FROM 
248b0 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  %s" },.  };.  in
248c0 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
248d0 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 20 20  iDataVersion;.  
248e0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61 62  char *zSchemaTab
248f0 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  ;.  char *zDb = 
24900 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b  nArg>=2 ? azArg[
24910 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20 73  1] : "main";.  s
24920 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
24930 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  mt = 0;.  unsign
24940 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30 30  ed char aHdr[100
24950 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  ];.  open_db(p, 
24960 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d  0);.  if( p->db=
24970 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
24980 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
24990 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45 43  _v2(p->db,"SELEC
249a0 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c 69  T data FROM sqli
249b0 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57 48  te_dbpage(?1) WH
249c0 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20 20  ERE pgno=1",.   
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
249f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
24a00 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20  _text(pStmt, 1, 
24a10 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zDb, -1, SQLITE_
24a20 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 73  STATIC);.  if( s
24a30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
24a40 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a 20  t)==SQLITE_ROW. 
24a50 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
24a60 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
24a70 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20 20  0)>100.  ){.    
24a80 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71 6c  memcpy(aHdr, sql
24a90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
24aa0 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29 3b  (pStmt,0), 100);
24ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
24ac0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
24ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
24ae0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
24af0 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64 61  nable to read da
24b00 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e 22  tabase header\n"
24b10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24b20 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
24b30 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24b40 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65  }.  i = get2byte
24b50 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20 20  Int(aHdr+16);.  
24b60 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20 36  if( i==1 ) i = 6
24b70 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72 69  5536;.  utf8_pri
24b80 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
24b90 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61 62  0s %d\n", "datab
24ba0 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22 2c  ase page size:",
24bb0 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e   i);.  utf8_prin
24bc0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
24bd0 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65 20  s %d\n", "write 
24be0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
24bf0 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  8]);.  utf8_prin
24c00 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
24c10 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20 66  s %d\n", "read f
24c20 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31 39  ormat:", aHdr[19
24c30 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  ]);.  utf8_print
24c40 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
24c50 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76 65   %d\n", "reserve
24c60 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72 5b  d bytes:", aHdr[
24c70 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  20]);.  for(i=0;
24c80 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 69   i<ArraySize(aFi
24c90 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  eld); i++){.    
24ca0 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65 6c  int ofst = aFiel
24cb0 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20 75  d[i].ofst;.    u
24cc0 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c 20  nsigned int val 
24cd0 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61 48  = get4byteInt(aH
24ce0 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20 20  dr + ofst);.    
24cf0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
24d00 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c 20  ut, "%-20s %u", 
24d10 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  aField[i].zName,
24d20 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74 63   val);.    switc
24d30 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20 20  h( ofst ){.     
24d40 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20 20   case 56: {.    
24d50 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 29      if( val==1 )
24d60 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
24d70 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b 0a  ut, " (utf8)");.
24d80 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d          if( val=
24d90 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  =2 ) raw_printf(
24da0 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31 36  p->out, " (utf16
24db0 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20 69  le)");.        i
24dc0 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77 5f  f( val==3 ) raw_
24dd0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24de0 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20 20   (utf16be)");.  
24df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
24e00 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
24e10 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  t, "\n");.  }.  
24e20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20  if( zDb==0 ){.  
24e30 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
24e40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24e50 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
24e60 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  er");.  }else if
24e70 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74 65  ( strcmp(zDb,"te
24e80 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  mp")==0 ){.    z
24e90 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69  SchemaTab = sqli
24ea0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
24eb0 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  , "sqlite_temp_m
24ec0 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
24ed0 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62  {.    zSchemaTab
24ee0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24ef0 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69 74  tf("\"%w\".sqlit
24f00 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29 3b  e_master", zDb);
24f10 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
24f20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75 65  i<ArraySize(aQue
24f30 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  ry); i++){.    c
24f40 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
24f50 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75 65  te3_mprintf(aQue
24f60 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68  ry[i].zSql, zSch
24f70 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e 74  emaTab);.    int
24f80 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70 2c   val = db_int(p,
24f90 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69   zSql);.    sqli
24fa0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
24fb0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24fc0 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
24fd0 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d 2e  d\n", aQuery[i].
24fe0 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 7d  zName, val);.  }
24ff0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25000 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 73  zSchemaTab);.  s
25010 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
25020 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  rol(p->db, zDb, 
25030 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41 54  SQLITE_FCNTL_DAT
25040 41 5f 56 45 52 53 49 4f 4e 2c 20 26 69 44 61 74  A_VERSION, &iDat
25050 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 75 74 66  aVersion);.  utf
25060 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
25070 20 22 25 2d 32 30 73 20 25 75 5c 6e 22 2c 20 22   "%-20s %u\n", "
25080 64 61 74 61 20 76 65 72 73 69 6f 6e 22 2c 20 69  data version", i
25090 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
250a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
250b0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
250c0 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
250d0 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
250e0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
250f0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
25100 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
25110 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
25120 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
25130 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
25140 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
25150 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
25160 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
25170 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
25180 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
25190 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72 6e  pare the pattern
251a0 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61 69   in zGlob[] agai
251b0 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e 20  nst the text in 
251c0 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52 55  z[].  Return TRU
251d0 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61 74  E.** if they mat
251e0 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30 29  ch and FALSE (0)
251f0 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   if they do not 
25200 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f  match..**.** Glo
25210 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  bbing rules:.**.
25220 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20 20  **      '*'     
25230 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65    Matches any se
25240 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f  quence of zero o
25250 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  r more character
25260 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 3f  s..**.**      '?
25270 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  '       Matches 
25280 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61 72  exactly one char
25290 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  acter..**.**    
252a0 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74 63   [...]      Matc
252b0 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65  hes one characte
252c0 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c 6f  r from the enclo
252d0 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20  sed list of.**  
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
252f0 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
25300 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d      [^...]     M
25310 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
25320 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65 20  cter not in the 
25330 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a 2a  enclosed list..*
25340 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20 20  *.**      '#'   
25350 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
25360 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65 20  sequence of one 
25370 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20 77  or more digits w
25380 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20 20  ith an.**       
25390 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 61           optiona
253a0 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69 6e  l + or - sign in
253b0 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20   front.**.**    
253c0 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79 20    ' '       Any 
253d0 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70 61  span of whitespa
253e0 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20 6f  ce matches any o
253f0 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a 20  ther span of.** 
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
25410 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  hitespace..**.**
25420 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61 63   Extra whitespac
25430 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
25440 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  z[] is ignored..
25450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
25460 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e 73  stcase_glob(cons
25470 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63  t char *zGlob, c
25480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
25490 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e   int c, c2;.  in
254a0 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20  t invert;.  int 
254b0 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20  seen;..  while( 
254c0 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29  (c = (*(zGlob++)
254d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ))!=0 ){.    if(
254e0 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a 20   IsSpace(c) ){. 
254f0 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61 63       if( !IsSpac
25500 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  e(*z) ) return 0
25510 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
25520 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20 29  sSpace(*zGlob) )
25530 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20 20   zGlob++;.      
25540 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
25550 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65  z) ) z++;.    }e
25560 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20 29  lse if( c=='*' )
25570 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
25580 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20  c=(*(zGlob++))) 
25590 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27  == '*' || c=='?'
255a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
255b0 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b  c=='?' && (*(z++
255c0 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
255d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
255e0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
255f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
25600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
25610 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
25620 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65 73  while( *z && tes
25630 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
25640 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  -1,z)==0 ){.    
25650 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
25660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
25670 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20  urn (*z)!=0;.   
25680 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
25690 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29  ( (c2 = (*(z++))
256a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
256b0 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a  while( c2!=c ){.
256c0 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a            c2 = *
256d0 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20  (z++);.         
256e0 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74   if( c2==0 ) ret
256f0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
25700 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 73  .        if( tes
25710 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62  tcase_glob(zGlob
25720 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ,z) ) return 1;.
25730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
25740 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
25750 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a  e if( c=='?' ){.
25760 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b        if( (*(z++
25770 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ))==0 ) return 0
25780 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25790 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
257a0 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b  int prior_c = 0;
257b0 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b  .      seen = 0;
257c0 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20  .      invert = 
257d0 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a  0;.      c = *(z
257e0 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ++);.      if( c
257f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
25800 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
25810 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  ob++);.      if(
25820 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20   c2=='^' ){.    
25830 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a      invert = 1;.
25840 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
25850 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
25860 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
25870 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
25880 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20  ( c==']' ) seen 
25890 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20  = 1;.        c2 
258a0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
258b0 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
258c0 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27  e( c2 && c2!=']'
258d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
258e0 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62  c2=='-' && zGlob
258f0 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f  [0]!=']' && zGlo
25900 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72  b[0]!=0 && prior
25910 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  _c>0 ){.        
25920 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
25930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25940 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63   c>=prior_c && c
25950 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b  <=c2 ) seen = 1;
25960 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
25970 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  _c = 0;.        
25980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25990 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20   if( c==c2 ){.  
259a0 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d            seen =
259b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
259c0 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f            prior_
259d0 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20  c = c2;.        
259e0 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  }.        c2 = *
259f0 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
25a00 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
25a10 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e  =0 || (seen ^ in
25a20 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72  vert)==0 ) retur
25a30 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
25a40 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20  f( c=='#' ){.   
25a50 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d     if( (z[0]=='-
25a60 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20  ' || z[0]=='+') 
25a70 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d 29  && IsDigit(z[1])
25a80 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) z++;.      if
25a90 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d 29  ( !IsDigit(z[0])
25aa0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25ab0 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68     z++;.      wh
25ac0 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b 30  ile( IsDigit(z[0
25ad0 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ z++; }.   
25ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
25af0 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20  ( c!=(*(z++)) ) 
25b00 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
25b10 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73 53    }.  while( IsS
25b20 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  pace(*z) ){ z++;
25b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d   }.  return *z==
25b40 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0;.}.../*.** Com
25b50 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  pare the string 
25b60 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  as a command-lin
25b70 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65 69  e option with ei
25b80 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  ther one or two.
25b90 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20 63  ** initial "-" c
25ba0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
25bb0 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e 4d  atic int optionM
25bc0 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
25bd0 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61  *zStr, const cha
25be0 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28 20  r *zOpt){.  if( 
25bf0 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20 72  zStr[0]!='-' ) r
25c00 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72 2b  eturn 0;.  zStr+
25c10 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30 5d  +;.  if( zStr[0]
25c20 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b 0a  =='-' ) zStr++;.
25c30 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70 28    return strcmp(
25c40 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a  zStr, zOpt)==0;.
25c50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
25c60 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  a file..*/.int s
25c70 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 63  hellDeleteFile(c
25c80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
25c90 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  name){.  int rc;
25ca0 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20  .#ifdef _WIN32. 
25cb0 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71   wchar_t *z = sq
25cc0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
25cd0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
25ce0 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20 5f  ename);.  rc = _
25cf0 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73 71  wunlink(z);.  sq
25d00 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23  lite3_free(z);.#
25d10 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c 69  else.  rc = unli
25d20 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  nk(zFilename);.#
25d30 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
25d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  c;.}../*.** Try 
25d50 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  to delete the te
25d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 28 69 66  mporary file (if
25d70 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 20 61   there is one) a
25d80 6e 64 20 66 72 65 65 20 74 68 65 0a 2a 2a 20 6d  nd free the.** m
25d90 65 6d 6f 72 79 20 75 73 65 64 20 74 6f 20 68 6f  emory used to ho
25da0 6c 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ld the name of t
25db0 68 65 20 74 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f  he temp file..*/
25dc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
25dd0 61 72 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  arTempFile(Shell
25de0 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 66 28  State *p){.  if(
25df0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
25e00 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e10 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29 20   p->doXdgOpen ) 
25e20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 68  return;.  if( sh
25e30 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 70 2d  ellDeleteFile(p-
25e40 3e 7a 54 65 6d 70 46 69 6c 65 29 20 29 20 72 65  >zTempFile) ) re
25e50 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
25e60 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c  free(p->zTempFil
25e70 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69  e);.  p->zTempFi
25e80 6c 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  le = 0;.}../*.**
25e90 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74 65   Create a new te
25ea0 6d 70 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 74  mp file name wit
25eb0 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
25ec0 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ix..*/.static vo
25ed0 69 64 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 53  id newTempFile(S
25ee0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
25ef0 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69  nst char *zSuffi
25f00 78 29 7b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46  x){.  clearTempF
25f10 69 6c 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ile(p);.  sqlite
25f20 33 5f 66 72 65 65 28 70 2d 3e 7a 54 65 6d 70 46  3_free(p->zTempF
25f30 69 6c 65 29 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70  ile);.  p->zTemp
25f40 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  File = 0;.  if( 
25f50 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c  p->db ){.    sql
25f60 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25f70 6c 28 70 2d 3e 64 62 2c 20 30 2c 20 53 51 4c 49  l(p->db, 0, SQLI
25f80 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
25f90 45 4e 41 4d 45 2c 20 26 70 2d 3e 7a 54 65 6d 70  ENAME, &p->zTemp
25fa0 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
25fb0 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
25fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
25fd0 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 73 71  uint64 r;.    sq
25fe0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
25ff0 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b  (sizeof(r), &r);
26000 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  .    p->zTempFil
26010 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
26020 6e 74 66 28 22 74 65 6d 70 25 6c 6c 78 2e 25 73  ntf("temp%llx.%s
26030 22 2c 20 72 2c 20 7a 53 75 66 66 69 78 29 3b 0a  ", r, zSuffix);.
26040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
26050 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69  zTempFile = sqli
26060 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2e  te3_mprintf("%z.
26070 25 73 22 2c 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  %s", p->zTempFil
26080 65 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d  e, zSuffix);.  }
26090 0a 20 20 69 66 28 20 70 2d 3e 7a 54 65 6d 70 46  .  if( p->zTempF
260a0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ile==0 ){.    ra
260b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
260c0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
260d0 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
260e0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
260f0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
26100 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
26110 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
26120 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
26130 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
26140 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
26150 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
26160 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
26170 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
26180 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
26190 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
261a0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
261b0 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
261c0 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
261d0 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
261e0 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
261f0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
26200 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
26210 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
26220 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
26230 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
26240 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
26250 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
26260 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
26270 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
26280 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
26290 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
262a0 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
262b0 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
262c0 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
262d0 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
262e0 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
262f0 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
26300 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
26310 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
26320 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
26330 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
26340 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
26350 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
26360 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
26370 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
26380 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
26390 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
263a0 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
263b0 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
263c0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
263d0 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
263e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
263f0 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
26400 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
26410 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
26420 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
26430 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
26440 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
26450 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
26460 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
26470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
26480 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
26490 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
264a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
264b0 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
264c0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
264d0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
264e0 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
264f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
26500 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
26510 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
26520 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
26530 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
26540 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
26550 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
26560 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
26570 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
26580 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
26590 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
265a0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
265b0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
265c0 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
265d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
265e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
265f0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
26600 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
26610 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
26620 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
26630 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
26640 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
26650 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
26660 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
26670 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
26680 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
26690 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
266a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
266b0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
266c0 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
266d0 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
266e0 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
266f0 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
26700 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
26710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26720 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26730 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
26740 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
26750 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
26760 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
26770 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
26780 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
26790 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
267a0 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
267b0 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
267c0 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
267d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
267e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
267f0 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
26800 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
26810 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26820 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
26830 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
26840 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
26850 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
26860 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
26870 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
26880 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
26890 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
268a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
268b0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
268c0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
268d0 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
268e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
268f0 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
26900 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
26930 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
26940 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
26950 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26970 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26980 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
26990 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
269a0 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
269b0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
269c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
269d0 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
269e0 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
269f0 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
26a00 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
26a10 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
26a20 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
26a30 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
26a40 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
26a50 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
26a60 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
26a70 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
26a80 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
26a90 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
26aa0 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
26ab0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
26ae0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
26af0 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
26b00 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
26b10 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
26b20 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
26b30 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
26b40 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26b70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
26b80 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
26b90 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
26ba0 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
26bb0 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
26bc0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
26bd0 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
26be0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
26bf0 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
26c00 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
26c10 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
26c20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
26c30 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
26c40 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
26c50 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
26c60 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
26c70 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
26c80 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
26c90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
26ca0 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
26cb0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
26cc0 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
26cd0 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
26ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
26cf0 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
26d00 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
26d10 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
26d20 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
26d30 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
26d40 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
26d50 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
26d60 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
26d70 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
26d80 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
26d90 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
26da0 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
26db0 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
26dc0 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
26dd0 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
26de0 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
26df0 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
26e00 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
26e10 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
26e20 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
26e30 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
26e40 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
26e50 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
26e60 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
26e70 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
26e80 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
26e90 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
26ea0 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
26eb0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
26ec0 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
26ed0 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
26ee0 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
26ef0 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
26f00 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
26f10 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
26f20 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
26f30 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
26f40 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
26f50 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
26f60 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
26f70 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
26f80 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
26f90 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
26fa0 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
26fb0 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
26fc0 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
26fd0 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
26fe0 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
26ff0 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
27000 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
27010 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
27020 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
27030 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
27040 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
27050 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
27060 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
27070 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
27080 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
27090 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
270a0 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
270b0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
270c0 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
270d0 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
270e0 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
270f0 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
27100 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
27110 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
27120 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
27130 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
27140 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
27150 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
27160 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
27170 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
27180 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
27190 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
271a0 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
271b0 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
271c0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
271d0 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
271e0 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
271f0 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
27200 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
27210 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
27220 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
27230 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
27240 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
27250 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
27260 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
27270 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
27280 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
27290 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
272a0 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
272b0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
272c0 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
272d0 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
272e0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
272f0 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
27300 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
27310 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
27320 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
27330 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
27340 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
27350 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
27360 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
27370 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
27380 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
27390 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
273a0 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
273b0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
273c0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
273d0 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
273e0 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
273f0 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
27400 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
27410 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
27420 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
27430 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
27440 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
27450 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
27460 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
27470 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
27480 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
27490 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
274a0 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
274b0 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
274c0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
274d0 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
274e0 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
274f0 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
27500 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
27510 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
27520 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
27530 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
27540 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
27550 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
27560 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
27570 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
27580 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
27590 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
275a0 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
275b0 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
275c0 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
275d0 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
275e0 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
275f0 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
27600 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
27610 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
27620 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
27630 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
27640 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
27650 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
27660 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
27670 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33   int n = strlen3
27680 30 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  0(azArg[i]);.   
27690 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
276a0 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76  te3_strnicmp("-v
276b0 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69  erbose", azArg[i
276c0 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
276d0 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a    bVerbose = 1;.
276e0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
276f0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
27700 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f  3_strnicmp("-gro
27710 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41  upbyparent", azA
27720 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rg[i], n)==0 ){.
27730 20 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61        bGroupByPa
27740 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rent = 1;.      
27750 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22  zIndent = "    "
27760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
27770 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27780 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
27790 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f  e: %s %s ?-verbo
277a0 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72  se? ?-groupbypar
277b0 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ent?\n",.       
277c0 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41     azArg[0], azA
277d0 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20  rg[1].      );. 
277e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
277f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
27800 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
27810 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c  er the fkey_coll
27820 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c  ate_clause() SQL
27830 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72   function */.  r
27840 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
27850 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
27860 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c  "fkey_collate_cl
27870 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45  ause", 4, SQLITE
27880 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20  _UTF8,.      0, 
27890 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65  shellFkeyCollate
278a0 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29  Clause, 0, 0.  )
278b0 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ;...  if( rc==SQ
278c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
278d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
278e0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
278f0 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a   -1, &pSql, 0);.
27900 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
27910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
27920 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
27930 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42  pSql, 1, bGroupB
27940 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  yParent);.  }.. 
27950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27960 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
27970 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  2;.    char *zPr
27980 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  ev = 0;.    whil
27990 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
279a0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
279b0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
279c0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73  es = -1;.      s
279d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
279e0 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  plain = 0;.     
279f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
27a00 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  P = (const char*
27a10 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
27a20 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20  text(pSql, 0);. 
27a30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
27a40 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20  *zGlob = (const 
27a50 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
27a60 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
27a70 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
27a80 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
27a90 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
27aa0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
27ab0 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  Sql, 2);.      c
27ac0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67  onst char *zTarg
27ad0 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  et = (const char
27ae0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
27af0 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a  _text(pSql, 3);.
27b00 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
27b10 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63   *zCI = (const c
27b20 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
27b30 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34  umn_text(pSql, 4
27b40 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
27b50 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28  har *zParent = (
27b60 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
27b70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
27b80 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20  pSql, 5);..     
27b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
27ba0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
27bb0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
27bc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
27bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27be0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
27bf0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
27c00 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
27c10 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  in) ){.        c
27c20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e  onst char *zPlan
27c30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
27c40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27c50 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
27c60 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
27c70 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
27c80 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  0==sqlite3_strgl
27c90 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29  ob(zGlob, zPlan)
27ca0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
27cb0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
27cc0 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61  b(zGlobIPK, zPla
27cd0 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  n).        );.  
27ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
27cf0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27d00 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
27d10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27d20 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
27d30 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
27d40 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
27d50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
27d60 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72  ror: internal er
27d70 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62  ror");.        b
27d80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
27d90 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  e{.        if( b
27da0 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20  GroupByParent.  
27db0 20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f        && (bVerbo
27dc0 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20  se || res==0).  
27dd0 20 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d        && (zPrev=
27de0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
27df0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a  ricmp(zParent, z
27e00 50 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29  Prev)).        )
27e10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
27e20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
27e30 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c  Parent table %s\
27e40 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  n", zParent);.  
27e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27e60 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20  free(zPrev);.   
27e70 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73         zPrev = s
27e80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
27e90 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20  %s", zParent);. 
27ea0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27eb0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
27ec0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
27ed0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20  intf(out, "%s%s 
27ee0 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65  --> %s\n", zInde
27ef0 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74  nt, zCI, zTarget
27f00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
27f10 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
27f20 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
27f30 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a  rintf(out, "%s/*
27f40 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65   no extra indexe
27f50 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25  s required for %
27f60 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  s -> %s */\n",. 
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e               zIn
27f80 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61  dent, zFrom, zTa
27f90 72 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29  rget.          )
27fa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27fb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
27fc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76  lite3_free(zPrev
27fd0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d  );..    if( rc!=
27fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ff0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28000 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
28010 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
28020 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  );.    }..    rc
28030 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
28040 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20  lize(pSql);.    
28050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28060 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45  K && rc2!=SQLITE
28070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
28080 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77  = rc2;.      raw
28090 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
280a0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
280b0 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
280c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
280d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
280e0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
280f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
28100 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
28110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
28120 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c  mentation of ".l
28130 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  int" dot command
28140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28150 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  lintDotCommand(.
28160 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
28170 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
28180 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
28190 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
281a0 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
281d0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
281e0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
281f0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28210 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28220 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
28230 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
28240 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d  n;.  n = (nArg>=
28250 32 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 ? strlen30(azA
28260 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69  rg[1]) : 0);.  i
28270 66 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65  f( n<1 || sqlite
28280 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67  3_strnicmp(azArg
28290 5b 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78  [1], "fkey-index
282a0 65 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75  es", n) ) goto u
282b0 73 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c  sage;.  return l
282c0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70  intFkeyIndexes(p
282d0 53 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41  State, azArg, nA
282e0 72 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20  rg);.. usage:.  
282f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
28300 72 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62  r, "Usage %s sub
28310 2d 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68  -command ?switch
28320 65 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67  es...?\n", azArg
28330 5b 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e  [0]);.  raw_prin
28340 74 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72  tf(stderr, "Wher
28350 65 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61  e sub-commands a
28360 72 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70  re:\n");.  raw_p
28370 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20  rintf(stderr, " 
28380 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c     fkey-indexes\
28390 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
283a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23  LITE_ERROR;.}..#
283b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
283c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
283d0 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
283e0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
283f0 42 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  B)./************
28400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28440 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61  *****.** The ".a
28450 72 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22  rchive" or ".ar"
28460 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
28470 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
28480 65 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  epare(.  sqlite3
28490 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52   *db, .  int *pR
284a0 63 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c, .  const char
284b0 20 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74   *zSql, .  sqlit
284c0 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
284d0 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
284e0 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  0;.  if( *pRc==S
284f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28500 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
28510 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
28520 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
28530 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
28540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28550 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28560 73 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72  stderr, "sql err
28570 6f 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20  or: %s (%d)\n", 
28580 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28590 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73  e3_errmsg(db), s
285a0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
285b0 62 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  b).      );.    
285c0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
285d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
285e0 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61   void shellPrepa
285f0 72 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69  rePrintf(.  sqli
28600 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
28610 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
28620 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
28630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
28640 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mt, .  ....){.  
28650 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
28660 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
28670 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73  OK ){.    va_lis
28680 74 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a  t ap;.    char *
28690 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  z;.    va_start(
286a0 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
286b0 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
286c0 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20  ntf(zFmt, ap);. 
286d0 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
286e0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
286f0 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
28700 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
28710 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c  lse{.      shell
28720 50 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c  Prepare(db, pRc,
28730 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20   z, ppStmt);.   
28740 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28750 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  z);.    }.  }.}.
28760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
28770 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e  llFinalize(.  in
28780 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74  t *pRc, .  sqlit
28790 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29  e3_stmt *pStmt.)
287a0 7b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  {.  if( pStmt ){
287b0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
287c0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61   = sqlite3_db_ha
287d0 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  ndle(pStmt);.   
287e0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
287f0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
28800 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d  );.    if( *pRc=
28810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28840 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
28850 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
28860 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
28870 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
28880 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d    }.      *pRc =
28890 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   rc;.    }.  }.}
288a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  ..static void sh
288b0 65 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20  ellReset(.  int 
288c0 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
288d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
288e0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
288f0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
28900 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
28910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28940 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64   *db = sqlite3_d
28950 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b  b_handle(pStmt);
28960 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
28970 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65  f(stderr, "SQL e
28980 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
28990 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
289a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
289b0 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a   = rc;.  }.}./*.
289c0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70  ** Structure rep
289d0 72 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67  resenting a sing
289e0 6c 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64  le ".ar" command
289f0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
28a00 75 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72  uct ArCommand Ar
28a10 43 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20  Command;.struct 
28a20 41 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38  ArCommand {.  u8
28a30 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20   eCmd;          
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a50 20 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c   An AR_CMD_* val
28a60 75 65 20 2a 2f 0a 20 20 75 38 20 62 56 65 72 62  ue */.  u8 bVerb
28a70 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ose;            
28a80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28a90 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a  if --verbose */.
28aa0 20 20 75 38 20 62 5a 69 70 3b 20 20 20 20 20 20    u8 bZip;      
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
28ad0 20 61 72 63 68 69 76 65 20 69 73 20 61 20 5a 49   archive is a ZI
28ae0 50 20 2a 2f 0a 20 20 75 38 20 62 44 72 79 52 75  P */.  u8 bDryRu
28af0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
28b00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28b10 66 20 2d 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20  f --dry-run */. 
28b20 20 75 38 20 62 41 70 70 65 6e 64 3b 20 20 20 20   u8 bAppend;    
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 61 70   /* True if --ap
28b50 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f  pend */.  u8 fro
28b60 6d 43 6d 64 4c 69 6e 65 3b 20 20 20 20 20 20 20  mCmdLine;       
28b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
28b80 20 66 72 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64   from -A instead
28b90 20 6f 66 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a   of .archive */.
28ba0 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
28bd0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28be0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 72 63   */.  char *zSrc
28bf0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
28c00 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61 72 22        /* "sqlar"
28c10 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69 6c 65  , "zipfile($file
28c20 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20  )" or "zip" */. 
28c30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
28c40 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
28c50 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d   /* --file argum
28c60 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
28c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
28c80 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ir;             
28c90 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79    /* --directory
28ca0 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
28cb0 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  LL */.  char **a
28cc0 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  zArg;           
28cd0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
28ce0 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75   of command argu
28cf0 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c  ments */.  Shell
28d00 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20 20 20  State *p;       
28d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
28d20 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  ell state */.  s
28d30 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d50 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * Database conta
28d60 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68 69 76  ining the archiv
28d70 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50  e */.};../*.** P
28d80 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73  rint a usage mes
28d90 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72  sage for the .ar
28da0 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65   command to stde
28db0 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  rr and return SQ
28dc0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73  LITE_ERROR..*/.s
28dd0 74 61 74 69 63 20 69 6e 74 20 61 72 55 73 61 67  tatic int arUsag
28de0 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68  e(FILE *f){.  sh
28df0 6f 77 48 65 6c 70 28 66 2c 22 61 72 63 68 69 76  owHelp(f,"archiv
28e00 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e");.  return SQ
28e10 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
28e20 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72  *.** Print an er
28e30 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
28e40 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20  the .ar command 
28e50 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72 65  to stderr and re
28e60 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
28e70 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63  ERROR..*/.static
28e80 20 69 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28   int arErrorMsg(
28e90 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
28ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
28eb0 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
28ec0 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
28ed0 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
28ee0 7a 46 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  zFmt);.  z = sql
28ef0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
28f00 6d 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mt, ap);.  va_en
28f10 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72  d(ap);.  utf8_pr
28f20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
28f30 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  ror: %s\n", z);.
28f40 20 20 69 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43    if( pAr->fromC
28f50 6d 64 4c 69 6e 65 20 29 7b 0a 20 20 20 20 75 74  mdLine ){.    ut
28f60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
28f70 2c 20 22 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f  , "Use \"-A\" fo
28f80 72 20 6d 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b  r more help\n");
28f90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
28fa0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
28fb0 2c 20 22 55 73 65 20 5c 22 2e 61 72 63 68 69 76  , "Use \".archiv
28fc0 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d  e --help\" for m
28fd0 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20  ore help\n");.  
28fe0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
28ff0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (z);.  return SQ
29000 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
29010 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  *.** Values for 
29020 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a  ArCommand.eCmd..
29030 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d  */.#define AR_CM
29040 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31  D_CREATE       1
29050 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
29060 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a 23  EXTRACT      2.#
29070 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
29080 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64 65  ST         3.#de
29090 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41  fine AR_CMD_UPDA
290a0 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69  TE       4.#defi
290b0 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20  ne AR_CMD_HELP  
290c0 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20         5../*.** 
290d0 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61  Other (non-comma
290e0 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f  nd) switches..*/
290f0 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
29100 43 48 5f 56 45 52 42 4f 53 45 20 20 20 20 20 36  CH_VERBOSE     6
29110 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
29120 43 48 5f 46 49 4c 45 20 20 20 20 20 20 20 20 37  CH_FILE        7
29130 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
29140 43 48 5f 44 49 52 45 43 54 4f 52 59 20 20 20 38  CH_DIRECTORY   8
29150 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
29160 43 48 5f 41 50 50 45 4e 44 20 20 20 20 20 20 39  CH_APPEND      9
29170 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
29180 43 48 5f 44 52 59 52 55 4e 20 20 20 20 20 31 30  CH_DRYRUN     10
29190 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50  ..static int arP
291a0 72 6f 63 65 73 73 53 77 69 74 63 68 28 41 72 43  rocessSwitch(ArC
291b0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74  ommand *pAr, int
291c0 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73 74 20   eSwitch, const 
291d0 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
291e0 77 69 74 63 68 28 20 65 53 77 69 74 63 68 20 29  witch( eSwitch )
291f0 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  {.    case AR_CM
29200 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 63 61  D_CREATE:.    ca
29210 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  se AR_CMD_EXTRAC
29220 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  T:.    case AR_C
29230 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63 61 73  MD_LIST:.    cas
29240 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a  e AR_CMD_UPDATE:
29250 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
29260 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69 66 28  _HELP:.      if(
29270 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20   pAr->eCmd ){.  
29280 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
29290 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6d 75  rrorMsg(pAr, "mu
292a0 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f  ltiple command o
292b0 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20  ptions");.      
292c0 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65 43 6d  }.      pAr->eCm
292d0 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20 20 20  d = eSwitch;.   
292e0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
292f0 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52  ase AR_SWITCH_DR
29300 59 52 55 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d  YRUN:.      pAr-
29310 3e 62 44 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20  >bDryRun = 1;.  
29320 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
29330 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ase AR_SWITCH_VE
29340 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70 41 72  RBOSE:.      pAr
29350 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a  ->bVerbose = 1;.
29360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29370 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
29380 41 50 50 45 4e 44 3a 0a 20 20 20 20 20 20 70 41  APPEND:.      pA
29390 72 2d 3e 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a  r->bAppend = 1;.
293a0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
293b0 72 75 20 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a  ru into --file *
293c0 2f 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  /.    case AR_SW
293d0 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20  ITCH_FILE:.     
293e0 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41   pAr->zFile = zA
293f0 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
29400 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
29410 54 43 48 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20  TCH_DIRECTORY:. 
29420 20 20 20 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d       pAr->zDir =
29430 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65   zArg;.      bre
29440 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
29450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29460 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68 65 20  /*.** Parse the 
29470 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72  command line for
29480 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   an ".ar" comman
29490 64 2e 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  d. The results a
294a0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  re written into.
294b0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 28 2a 70  ** structure (*p
294c0 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  Ar). SQLITE_OK i
294d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
294e0 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69  e command line i
294f0 73 20 70 61 72 73 65 64 0a 2a 2a 20 73 75 63 63  s parsed.** succ
29500 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77  essfully, otherw
29510 69 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ise an error mes
29520 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
29530 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 0a 2a  to stderr and .*
29540 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72  * SQLITE_ERROR r
29550 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29560 69 63 20 69 6e 74 20 61 72 50 61 72 73 65 43 6f  ic int arParseCo
29570 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a  mmand(.  char **
29580 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
29590 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
295a0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
295b0 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
295c0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
295d0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
295e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
295f0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
29600 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41  n azArg[] */.  A
29610 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20  rCommand *pAr   
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29630 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
29640 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73  object */.){.  s
29650 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 7b  truct ArSwitch {
29660 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
29670 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72  *zLong;.    char
29680 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 75 38 20   cShort;.    u8 
29690 65 53 77 69 74 63 68 3b 0a 20 20 20 20 75 38 20  eSwitch;.    u8 
296a0 62 41 72 67 3b 0a 20 20 7d 20 61 53 77 69 74 63  bArg;.  } aSwitc
296b0 68 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63  h[] = {.    { "c
296c0 72 65 61 74 65 22 2c 20 20 20 20 27 63 27 2c 20  reate",    'c', 
296d0 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 2c 20 20  AR_CMD_CREATE,  
296e0 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20       0 },.    { 
296f0 22 65 78 74 72 61 63 74 22 2c 20 20 20 27 78 27  "extract",   'x'
29700 2c 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  , AR_CMD_EXTRACT
29710 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
29720 7b 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20 27  { "list",      '
29730 74 27 2c 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c  t', AR_CMD_LIST,
29740 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
29750 20 20 7b 20 22 75 70 64 61 74 65 22 2c 20 20 20    { "update",   
29760 20 27 75 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44   'u', AR_CMD_UPD
29770 41 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ATE,       0 },.
29780 20 20 20 20 7b 20 22 68 65 6c 70 22 2c 20 20 20      { "help",   
29790 20 20 20 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48     'h', AR_CMD_H
297a0 45 4c 50 2c 20 20 20 20 20 20 20 20 20 30 20 7d  ELP,         0 }
297b0 2c 0a 20 20 20 20 7b 20 22 76 65 72 62 6f 73 65  ,.    { "verbose
297c0 22 2c 20 20 20 27 76 27 2c 20 41 52 5f 53 57 49  ",   'v', AR_SWI
297d0 54 43 48 5f 56 45 52 42 4f 53 45 2c 20 20 20 30  TCH_VERBOSE,   0
297e0 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65 22   },.    { "file"
297f0 2c 20 20 20 20 20 20 27 66 27 2c 20 41 52 5f 53  ,      'f', AR_S
29800 57 49 54 43 48 5f 46 49 4c 45 2c 20 20 20 20 20  WITCH_FILE,     
29810 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70   1 },.    { "app
29820 65 6e 64 22 2c 20 20 20 20 27 61 27 2c 20 41 52  end",    'a', AR
29830 5f 53 57 49 54 43 48 5f 41 50 50 45 4e 44 2c 20  _SWITCH_APPEND, 
29840 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64     1 },.    { "d
29850 69 72 65 63 74 6f 72 79 22 2c 20 27 43 27 2c 20  irectory", 'C', 
29860 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
29870 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20  ORY, 1 },.    { 
29880 22 64 72 79 72 75 6e 22 2c 20 20 20 20 27 6e 27  "dryrun",    'n'
29890 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52  , AR_SWITCH_DRYR
298a0 55 4e 2c 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b  UN,    0 },.  };
298b0 0a 20 20 69 6e 74 20 6e 53 77 69 74 63 68 20 3d  .  int nSwitch =
298c0 20 73 69 7a 65 6f 66 28 61 53 77 69 74 63 68 29   sizeof(aSwitch)
298d0 20 2f 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74   / sizeof(struct
298e0 20 41 72 53 77 69 74 63 68 29 3b 0a 20 20 73 74   ArSwitch);.  st
298f0 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
29900 45 6e 64 20 3d 20 26 61 53 77 69 74 63 68 5b 6e  End = &aSwitch[n
29910 53 77 69 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20  Switch];..  if( 
29920 6e 41 72 67 3c 3d 31 20 29 7b 0a 20 20 20 20 75  nArg<=1 ){.    u
29930 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
29940 72 2c 20 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72  r, "Wrong number
29950 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
29960 55 73 61 67 65 3a 5c 6e 22 29 3b 0a 20 20 20 20  Usage:\n");.    
29970 72 65 74 75 72 6e 20 61 72 55 73 61 67 65 28 73  return arUsage(s
29980 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  tderr);.  }else{
29990 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
299a0 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28  zArg[1];.    if(
299b0 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[0]!='-' ){.  
299c0 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e      /* Tradition
299d0 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20 69  al style [tar] i
299e0 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  nvocation */.   
299f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29a00 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20 20  int iArg = 2;.  
29a10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
29a20 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
29a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
29a40 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  g = 0;.        s
29a50 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
29a60 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  pOpt;.        fo
29a70 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b  r(pOpt=&aSwitch[
29a80 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70  0]; pOpt<pEnd; p
29a90 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Opt++){.        
29aa0 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74    if( z[i]==pOpt
29ab0 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b  ->cShort ) break
29ac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29ad0 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45      if( pOpt==pE
29ae0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
29af0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
29b00 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e  g(pAr, "unrecogn
29b10 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22  ized option: %c"
29b20 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  , z[i]);.       
29b30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
29b40 4f 70 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  Opt->bArg ){.   
29b50 20 20 20 20 20 20 20 69 66 28 20 69 41 72 67 3e         if( iArg>
29b60 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  =nArg ){.       
29b70 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
29b80 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74  rorMsg(pAr, "opt
29b90 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
29ba0 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b  argument: %c",z[
29bb0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
29bc0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20  .          zArg 
29bd0 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b  = azArg[iArg++];
29be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29bf0 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
29c00 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
29c10 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
29c20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29c30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
29c40 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67 20        pAr->nArg 
29c50 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20 20  = nArg-iArg;.   
29c60 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
29c70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  >0 ){.        pA
29c80 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
29c90 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d  g[iArg];.      }
29ca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29cb0 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69    /* Non-traditi
29cc0 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  onal invocation 
29cd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41 72  */.      int iAr
29ce0 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41 72  g;.      for(iAr
29cf0 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20  g=1; iArg<nArg; 
29d00 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iArg++){.       
29d10 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
29d20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b  z = azArg[iArg];
29d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
29d40 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
29d50 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69      /* All remai
29d60 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ning command lin
29d70 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d  e words are comm
29d80 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a  and arguments. *
29d90 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  /.          pAr-
29da0 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b  >azArg = &azArg[
29db0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 20  iArg];.         
29dc0 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72   pAr->nArg = nAr
29dd0 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20 20  g-iArg;.        
29de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
29df0 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73   }.        n = s
29e00 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20 20  trlen30(z);..   
29e10 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27       if( z[1]!='
29e20 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
29e30 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
29e40 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20   /* One or more 
29e50 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f  short options */
29e60 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
29e70 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =1; i<n; i++){. 
29e80 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
29e90 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
29ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
29eb0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f  uct ArSwitch *pO
29ec0 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
29ed0 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63  for(pOpt=&aSwitc
29ee0 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b  h[0]; pOpt<pEnd;
29ef0 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20   pOpt++){.      
29f00 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d          if( z[i]
29f10 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29  ==pOpt->cShort )
29f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
29f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29f40 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64    if( pOpt==pEnd
29f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29f60 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
29f70 4d 73 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f  Msg(pAr, "unreco
29f80 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25  gnized option: %
29f90 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  c", z[i]);.     
29fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29fb0 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62       if( pOpt->b
29fc0 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
29fd0 20 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29       if( i<(n-1)
29fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29ff0 20 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b      zArg = &z[i+
2a000 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
2a010 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20      i = n;.     
2a020 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d  if( iArg>=(nArg-
2a050 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
2a060 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2a070 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2a080 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
2a090 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22  an argument: %c"
2a0a0 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ,z[i]);.        
2a0b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a0c0 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
2a0d0 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a   azArg[++iArg];.
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72            if( ar
2a110 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
2a120 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
2a130 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
2a140 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2a150 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32     }else if( z[2
2a170 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20  ]=='\0' ){.     
2a180 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74       /* A -- opt
2a190 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ion, indicating 
2a1a0 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69  that all remaini
2a1b0 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ng command line 
2a1c0 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20 20  words.          
2a1d0 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61  ** are command a
2a1e0 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20  rguments.  */.  
2a1f0 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
2a200 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
2a210 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  +1];.          p
2a220 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
2a230 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20 20  iArg-1;.        
2a240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2a250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a260 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69    /* A long opti
2a270 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
2a280 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2a290 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2a2a0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f    /* Argument fo
2a2b0 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79  r option, if any
2a2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74   */.          st
2a2d0 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
2a2e0 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20  Match = 0;      
2a2f0 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74 69  /* Matching opti
2a300 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
2a310 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
2a320 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20 20  *pOpt;          
2a330 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f    /* Iterator */
2a340 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70  .          for(p
2a350 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
2a360 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
2a370 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2a380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
2a390 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67  ng = pOpt->zLong
2a3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a3b0 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33  ( (n-2)<=strlen3
2a3c0 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d  0(zLong) && 0==m
2a3d0 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f  emcmp(&z[2], zLo
2a3e0 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20  ng, n-2) ){.    
2a3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2a400 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
2a410 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2a420 72 45 72 72 6f 72 4d 73 67 28 70 41 72 2c 20 22  rErrorMsg(pAr, "
2a430 61 6d 62 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e  ambiguous option
2a440 3a 20 25 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20  : %s",z);.      
2a450 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a470 4d 61 74 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20  Match = pOpt;.  
2a480 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2a490 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a4a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2a4b0 20 20 20 69 66 28 20 70 4d 61 74 63 68 3d 3d 30     if( pMatch==0
2a4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a4d0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2a4e0 67 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e  g(pAr, "unrecogn
2a4f0 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73 22  ized option: %s"
2a500 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
2a510 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2a520 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b 0a  pMatch->bArg ){.
2a530 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2a540 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
2a550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a560 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
2a570 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72  g(pAr, "option r
2a580 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
2a590 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ent: %s", z);.  
2a5a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a5b0 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61          zArg = a
2a5c0 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20  zArg[++iArg];.  
2a5d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a5e0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
2a5f0 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d 61  sSwitch(pAr, pMa
2a600 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  tch->eSwitch, zA
2a610 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
2a620 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2a630 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a640 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2a650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2a660 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a670 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
2a680 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77 69  all arguments wi
2a690 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61  thin the ArComma
2a6a0 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72  nd.azArg[].** ar
2a6b0 72 61 79 20 72 65 66 65 72 20 74 6f 20 61 72 63  ray refer to arc
2a6c0 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61 73  hive members, as
2a6d0 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72 61   for the --extra
2a6e0 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d  ct or --list com
2a6f0 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68  mands. .** It ch
2a700 65 63 6b 73 20 74 68 61 74 20 65 61 63 68 20 6f  ecks that each o
2a710 66 20 74 68 65 6d 20 61 72 65 20 70 72 65 73 65  f them are prese
2a720 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63 69  nt. If any speci
2a730 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f 74  fied file is not
2a740 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74  .** present in t
2a750 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20 65  he archive, an e
2a760 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64 20  rror is printed 
2a770 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61 6e  to stderr and an
2a780 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72   error.** code r
2a790 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
2a7a0 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63 69  se, if all speci
2a7b0 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20 61  fied arguments a
2a7c0 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  re present in.**
2a7d0 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 53 51   the archive, SQ
2a7e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a7f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
2a800 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73 20  function strips 
2a810 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f 27  any trailing '/'
2a820 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d   characters from
2a830 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a   each argument..
2a840 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73 69  ** This is consi
2a850 73 74 65 6e 74 20 77 69 74 68 20 74 68 65 20 77  stent with the w
2a860 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d  ay the [tar] com
2a870 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77 6f  mand seems to wo
2a880 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a  rk on.** Linux..
2a890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
2a8a0 43 68 65 63 6b 45 6e 74 72 69 65 73 28 41 72 43  CheckEntries(ArC
2a8b0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
2a8c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a8d0 4f 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e  OK;.  if( pAr->n
2a8e0 41 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Arg ){.    int i
2a8f0 2c 20 6a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  , j;.    sqlite3
2a900 5f 73 74 6d 74 20 2a 70 54 65 73 74 20 3d 20 30  _stmt *pTest = 0
2a910 3b 0a 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70  ;..    shellPrep
2a920 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64  arePrintf(pAr->d
2a930 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74 2c 0a  b, &rc, &pTest,.
2a940 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2a950 6e 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45  name FROM %s WHE
2a960 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20  RE name=$name", 
2a970 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 7a 53  .        pAr->zS
2a980 72 63 54 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20  rcTable.    );. 
2a990 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62     j = sqlite3_b
2a9a0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2a9b0 64 65 78 28 70 54 65 73 74 2c 20 22 24 6e 61 6d  dex(pTest, "$nam
2a9c0 65 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e");.    for(i=0
2a9d0 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26  ; i<pAr->nArg &&
2a9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2a9f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
2aa00 20 2a 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67   *z = pAr->azArg
2aa10 5b 69 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  [i];.      int n
2aa20 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a   = strlen30(z);.
2aa30 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20        int bOk = 
2aa40 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
2aa50 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
2aa60 2f 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  /' ) n--;.      
2aa70 7a 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  z[n] = '\0';.   
2aa80 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
2aa90 74 65 78 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a  text(pTest, j, z
2aaa0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
2aab0 54 49 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TIC);.      if( 
2aac0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2aad0 74 65 33 5f 73 74 65 70 28 70 54 65 73 74 29 20  te3_step(pTest) 
2aae0 29 7b 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d  ){.        bOk =
2aaf0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2ab00 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63    shellReset(&rc
2ab10 2c 20 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20  , pTest);.      
2ab20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ab30 4b 20 26 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20  K && bOk==0 ){. 
2ab40 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ab50 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 74 20  tf(stderr, "not 
2ab60 66 6f 75 6e 64 20 69 6e 20 61 72 63 68 69 76 65  found in archive
2ab70 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  : %s\n", z);.   
2ab80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ab90 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
2aba0 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46      }.    shellF
2abb0 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 54 65  inalize(&rc, pTe
2abc0 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
2abd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
2abe0 6f 72 6d 61 74 20 61 20 57 48 45 52 45 20 63 6c  ormat a WHERE cl
2abf0 61 75 73 65 20 74 68 61 74 20 63 61 6e 20 62 65  ause that can be
2ac00 20 75 73 65 64 20 61 67 61 69 6e 73 74 20 74 68   used against th
2ac10 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  e "sqlar" table 
2ac20 74 6f 0a 2a 2a 20 69 64 65 6e 74 69 66 79 20 61  to.** identify a
2ac30 6c 6c 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65  ll archive membe
2ac40 72 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  rs that match th
2ac50 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
2ac60 6e 74 73 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28  nts held.** in (
2ac70 2a 70 41 72 29 2e 20 4c 65 61 76 65 20 74 68 69  *pAr). Leave thi
2ac80 73 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  s WHERE clause i
2ac90 6e 20 28 2a 70 7a 57 68 65 72 65 29 20 62 65 66  n (*pzWhere) bef
2aca0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2acb0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
2acc0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2acd0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69  eventually calli
2ace0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
2acf0 29 20 6f 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d  ) on.** any non-
2ad00 4e 55 4c 4c 20 28 2a 70 7a 57 68 65 72 65 29 20  NULL (*pzWhere) 
2ad10 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
2ad20 20 76 6f 69 64 20 61 72 57 68 65 72 65 43 6c 61   void arWhereCla
2ad30 75 73 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  use(.  int *pRc,
2ad40 20 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70   .  ArCommand *p
2ad50 41 72 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Ar, .  char **pz
2ad60 57 68 65 72 65 20 20 20 20 20 20 20 20 20 20 20  Where           
2ad70 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
2ad80 65 77 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ew WHERE clause 
2ad90 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57  */.){.  char *zW
2ada0 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  here = 0;.  if( 
2adb0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2adc0 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e  ){.    if( pAr->
2add0 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nArg==0 ){.     
2ade0 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
2adf0 33 5f 6d 70 72 69 6e 74 66 28 22 31 22 29 3b 0a  3_mprintf("1");.
2ae00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ae10 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 6f   int i;.      co
2ae20 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
2ae30 20 22 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   "";.      for(i
2ae40 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b  =0; i<pAr->nArg;
2ae50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
2ae60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
2ae70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  Ar->azArg[i];.  
2ae80 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
2ae90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2aea0 20 20 20 20 20 20 20 20 20 20 22 25 7a 25 73 20            "%z%s 
2aeb0 6e 61 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 73  name = '%q' OR s
2aec0 75 62 73 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29  ubstr(name,1,%d)
2aed0 20 3d 20 27 25 71 2f 27 22 2c 20 0a 20 20 20 20   = '%q/'", .    
2aee0 20 20 20 20 20 20 7a 57 68 65 72 65 2c 20 7a 53        zWhere, zS
2aef0 65 70 2c 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28  ep, z, strlen30(
2af00 7a 29 2b 31 2c 20 7a 0a 20 20 20 20 20 20 20 20  z)+1, z.        
2af10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
2af20 57 68 65 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Where==0 ){.    
2af30 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
2af40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2af50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2af60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 53      }.        zS
2af70 65 70 20 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20  ep = " OR ";.   
2af80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2af90 20 2a 70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65   *pzWhere = zWhe
2afa0 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  re;.}../*.** Imp
2afb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
2afc0 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e  ar "lisT" comman
2afd0 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d. .*/.static in
2afe0 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28  t arListCommand(
2aff0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
2b000 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b010 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 25 73  Sql = "SELECT %s
2b020 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 25   FROM %s WHERE %
2b030 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  s"; .  const cha
2b040 72 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a  r *azCols[] = {.
2b050 20 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20      "name",.    
2b060 22 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73  "lsmode(mode), s
2b070 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  z, datetime(mtim
2b080 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c  e, 'unixepoch'),
2b090 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63   name".  };..  c
2b0a0 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
2b0b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2b0c0 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pSql = 0;.  int
2b0d0 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43   rc;..  rc = arC
2b0e0 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72 29  heckEntries(pAr)
2b0f0 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75 73  ;.  arWhereClaus
2b100 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57 68  e(&rc, pAr, &zWh
2b110 65 72 65 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72  ere);..  shellPr
2b120 65 70 61 72 65 50 72 69 6e 74 66 28 70 41 72 2d  eparePrintf(pAr-
2b130 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c  >db, &rc, &pSql,
2b140 20 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41   zSql, azCols[pA
2b150 72 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20  r->bVerbose],.  
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c     pAr->zSrcTabl
2b180 65 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66  e, zWhere);.  if
2b190 28 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29  ( pAr->bDryRun )
2b1a0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
2b1b0 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22  f(pAr->p->out, "
2b1c0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73  %s\n", sqlite3_s
2b1d0 71 6c 28 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c  ql(pSql));.  }el
2b1e0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  se{.    while( r
2b1f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b200 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2b210 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
2b220 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d  {.      if( pAr-
2b230 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
2b240 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2b250 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25  (pAr->p->out, "%
2b260 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73 5c  s % 10d  %s  %s\
2b270 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2b280 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2b290 65 78 74 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20  ext(pSql, 0),.  
2b2a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b2b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
2b2c0 6c 2c 20 31 29 2c 20 0a 20 20 20 20 20 20 20 20  l, 1), .        
2b2d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
2b2e0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32 29  mn_text(pSql, 2)
2b2f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
2b300 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2b310 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20 20  t(pSql, 3).     
2b320 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
2b330 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  e{.        utf8_
2b340 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2b350 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  ut, "%s\n", sqli
2b360 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2b370 70 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20  pSql, 0));.     
2b380 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
2b390 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
2b3a0 2c 20 70 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  , pSql);.  sqlit
2b3b0 65 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b  e3_free(zWhere);
2b3c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b3d0 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2b3e0 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65  tation of .ar "e
2b3f0 58 74 72 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e  Xtract" command.
2b400 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2b410 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64  arExtractCommand
2b420 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29  (ArCommand *pAr)
2b430 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2b440 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22 53 45  zSql1 = .    "SE
2b450 4c 45 43 54 20 22 0a 20 20 20 20 22 20 28 24 64  LECT ".    " ($d
2b460 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20  ir || name),".  
2b470 20 20 22 20 77 72 69 74 65 66 69 6c 65 28 28 24    " writefile(($
2b480 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73  dir || name), %s
2b490 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22  , mode, mtime) "
2b4a0 0a 20 20 20 20 22 46 52 4f 4d 20 25 73 20 57 48  .    "FROM %s WH
2b4b0 45 52 45 20 28 25 73 29 20 41 4e 44 20 28 64 61  ERE (%s) AND (da
2b4c0 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64  ta IS NULL OR $d
2b4d0 69 72 4f 6e 6c 79 20 3d 20 30 29 22 0a 20 20 20  irOnly = 0)".   
2b4e0 20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20   " AND name NOT 
2b4f0 47 4c 4f 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27  GLOB '*..[/\\]*'
2b500 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ";..  const char
2b510 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d   *azExtraArg[] =
2b520 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75   { .    "sqlar_u
2b530 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20  ncompress(data, 
2b540 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22  sz)",.    "data"
2b550 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  };..  sqlite3
2b560 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
2b570 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b580 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
2b590 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Dir = 0;.  char 
2b5a0 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69  *zWhere = 0;.  i
2b5b0 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49  nt i, j;..  /* I
2b5c0 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
2b5d0 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b  specified, check
2b5e0 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61   that they actua
2b5f0 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e  lly exist within
2b600 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76  .  ** the archiv
2b610 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64  e before proceed
2b620 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61  ing. And formula
2b630 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  te a WHERE claus
2b640 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20  e to.  ** match 
2b650 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  them.  */.  rc =
2b660 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
2b670 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43  pAr);.  arWhereC
2b680 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20  lause(&rc, pAr, 
2b690 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28  &zWhere);..  if(
2b6a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b6b0 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a  {.    if( pAr->z
2b6c0 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69  Dir ){.      zDi
2b6d0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
2b6e0 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e  ntf("%s/", pAr->
2b6f0 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zDir);.    }else
2b700 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
2b710 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2b720 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
2b730 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d  ( zDir==0 ) rc =
2b740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b750 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   }..  shellPrepa
2b760 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
2b770 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53  , &rc, &pSql, zS
2b780 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78  ql1, .      azEx
2b790 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70  traArg[pAr->bZip
2b7a0 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c  ], pAr->zSrcTabl
2b7b0 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a  e, zWhere.  );..
2b7c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b7d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73  _OK ){.    j = s
2b7e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2b7f0 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c  meter_index(pSql
2b800 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73  , "$dir");.    s
2b810 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
2b820 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20  (pSql, j, zDir, 
2b830 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
2b840 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  C);..    /* Run 
2b850 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
2b860 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20  ment twice. The 
2b870 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74  first time, writ
2b880 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  efile() is calle
2b890 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  d.    ** for all
2b8a0 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
2b8b0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
2b8c0 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73  extracted. The s
2b8d0 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20  econd time,.    
2b8e0 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20  ** only for the 
2b8f0 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69  directories. Thi
2b900 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
2b910 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a   timestamps for.
2b920 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
2b930 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73   directories mus
2b940 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72  t be reset after
2b950 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61   they are popula
2b960 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70  ted (as.    ** p
2b970 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63  opulating them c
2b980 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73  hanges the times
2b990 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66  tamp).  */.    f
2b9a0 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
2b9b0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c  ){.      j = sql
2b9c0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2b9d0 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20  ter_index(pSql, 
2b9e0 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20  "$dirOnly");.   
2b9f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
2ba00 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b  int(pSql, j, i);
2ba10 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
2ba20 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
2ba30 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2ba40 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2ba50 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  n", sqlite3_sql(
2ba60 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65  pSql));.      }e
2ba70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
2ba80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2ba90 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
2baa0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2bab0 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ql) ){.         
2bac0 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72   if( i==0 && pAr
2bad0 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
2bae0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2baf0 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
2bb00 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
2bb10 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2bb20 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  Sql, 0));.      
2bb30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2bb40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
2bb50 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53  ellReset(&rc, pS
2bb60 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ql);.    }.    s
2bb70 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
2bb80 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , pSql);.  }..  
2bb90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69  sqlite3_free(zDi
2bba0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2bbb0 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65  ee(zWhere);.  re
2bbc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bbd0 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74  * Run the SQL st
2bbe0 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e  atement in zSql.
2bbf0 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20    Or if doing a 
2bc00 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79  --dryrun, merely
2bc10 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a   print it out..*
2bc20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
2bc30 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64  xecSql(ArCommand
2bc40 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61   *pAr, const cha
2bc50 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20  r *zSql){.  int 
2bc60 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  rc;.  if( pAr->b
2bc70 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74  DryRun ){.    ut
2bc80 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
2bc90 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
2bca0 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Sql);.    rc = S
2bcb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2bcc0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  e{.    char *zEr
2bcd0 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
2bce0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72  sqlite3_exec(pAr
2bcf0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
2bd00 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
2bd10 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
2bd20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
2bd30 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e  ut, "ERROR: %s\n
2bd40 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
2bd50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2bd60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2bd70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2bd80 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2bd90 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61  ion of .ar "crea
2bda0 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22  te" and "update"
2bdb0 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   commands..**.**
2bdc0 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c   Create the "sql
2bdd0 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ar" table in the
2bde0 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20   database if it 
2bdf0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2be00 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20   exist..** Then 
2be10 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e  add each file in
2be20 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72   the azFile[] ar
2be30 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69  ray to the archi
2be40 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a  ve. Directories.
2be50 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63  ** are added rec
2be60 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67  ursively. If arg
2be70 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69  ument bVerbose i
2be80 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65  s non-zero, a me
2be90 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e  ssage is.** prin
2bea0 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f  ted on stdout fo
2beb0 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68  r each file arch
2bec0 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ived..**.** The 
2bed0 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69  create command i
2bee0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70  s the same as up
2bef0 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61  date, except tha
2bf00 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e  t it drops.** an
2bf10 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61  y existing "sqla
2bf20 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  r" table before 
2bf30 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  beginning..*/.st
2bf40 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74  atic int arCreat
2bf50 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
2bf60 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  (.  ArCommand *p
2bf70 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar,             
2bf80 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61      /* Command a
2bf90 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74  rguments and opt
2bfa0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55  ions */.  int bU
2bfb0 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  pdate           
2bfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75            /* tru
2bfd0 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65  e for a --create
2bfe0 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75  .  false for --u
2bff0 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  pdate */.){.  co
2c000 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
2c010 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41  e = .      "CREA
2c020 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
2c030 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22  EXISTS sqlar(\n"
2c040 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54  .      "  name T
2c050 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
2c060 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65    -- name of the
2c070 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22   file\n".      "
2c080 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20    mode INT,     
2c090 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63            -- acc
2c0a0 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c  ess permissions\
2c0b0 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d  n".      "  mtim
2c0c0 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  e INT,          
2c0d0 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69      -- last modi
2c0e0 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22  fication time\n"
2c0f0 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54  .      "  sz INT
2c100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c110 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69    -- original fi
2c120 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20  le size\n".     
2c130 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20   "  data BLOB   
2c140 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63              -- c
2c150 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e  ompressed conten
2c160 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a  t\n".      ")";.
2c170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c180 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c  rop = "DROP TABL
2c190 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61  E IF EXISTS sqla
2c1a0 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r";.  const char
2c1b0 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20   *zInsertFmt[2] 
2c1c0 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43  = {.     "REPLAC
2c1d0 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
2c1e0 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74  ode,mtime,sz,dat
2c1f0 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
2c200 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
2c210 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
2c220 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
2c230 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
2c240 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73       "    CASE s
2c250 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64  ubstr(lsmode(mod
2c260 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20  e),1,1)\n".     
2c270 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20  "      WHEN '-' 
2c280 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61  THEN length(data
2c290 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
2c2a0 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30   WHEN 'd' THEN 0
2c2b0 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
2c2c0 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a  ELSE -1 END,\n".
2c2d0 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f       "    sqlar_
2c2e0 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e  compress(data)\n
2c2f0 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66  ".     "  FROM f
2c300 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20  sdir(%Q,%Q)\n". 
2c310 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d      "  WHERE lsm
2c320 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49  ode(mode) NOT LI
2c330 4b 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20  KE '?%%';",.    
2c340 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
2c350 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
2c360 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  e,data)\n".     
2c370 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
2c380 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
2c390 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
2c3a0 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
2c3b0 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64  ,\n".     "    d
2c3c0 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ata\n".     "  F
2c3d0 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
2c3e0 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52  \n".     "  WHER
2c3f0 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e  E lsmode(mode) N
2c400 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a  OT LIKE '?%%';".
2c410 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20    };.  int i;   
2c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c430 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
2c440 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2c450 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e  azFile[] */.  in
2c460 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c480 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2c490 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2c4a0 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
2c4b0 20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69    /* SQL table i
2c4c0 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73  nto which to ins
2c4d0 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ert */.  char *z
2c4e0 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  Sql;.  char zTem
2c4f0 70 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63  p[50];..  arExec
2c500 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41  Sql(pAr, "PRAGMA
2c510 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29   page_size=512")
2c520 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53  ;.  rc = arExecS
2c530 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49  ql(pAr, "SAVEPOI
2c540 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20  NT ar;");.  if( 
2c550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65  return rc;.  zTe
2c570 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66  mp[0] = 0; .  if
2c580 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20  ( pAr->bZip ){. 
2c590 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2c5a0 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72   the zipfile vir
2c5b0 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e  tual table, if n
2c5c0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
2c5d0 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29  if( pAr->zFile )
2c5e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2c5f0 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20  uint64 r;.      
2c600 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2c610 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29  ss(sizeof(r),&r)
2c620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c630 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2c640 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69  zTemp),zTemp,"zi
2c650 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20  p%016llx",r);.  
2c660 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70      zTab = zTemp
2c670 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
2c680 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
2c690 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
2c6a0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
2c6b0 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70  emp.%s USING zip
2c6c0 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20  file(%Q)",.     
2c6d0 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a      zTab, pAr->z
2c6e0 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  File.      );.  
2c6f0 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
2c700 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
2c710 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c720 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  e(zSql);.    }el
2c730 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  se{.      zTab =
2c740 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20   "zip";.    }.  
2c750 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
2c760 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
2c770 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20  le for an SQLAR 
2c780 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73  */.    zTab = "s
2c790 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62  qlar";.    if( b
2c7a0 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  Update==0 ){.   
2c7b0 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
2c7c0 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20  l(pAr, zDrop);. 
2c7d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c7e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2c7f0 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
2c800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2c810 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2c820 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20  zCreate);.  }.  
2c830 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
2c840 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
2c850 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
2c860 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73   char *zSql2 = s
2c870 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a  qlite3_mprintf(z
2c880 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62  InsertFmt[pAr->b
2c890 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20  Zip], zTab,.    
2c8a0 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
2c8b0 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  e ? "shell_putsn
2c8c0 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65  l(name)" : "name
2c8d0 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  ",.        pAr->
2c8e0 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a  azArg[i], pAr->z
2c8f0 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  Dir);.    rc = a
2c900 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
2c910 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ql2);.    sqlite
2c920 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20  3_free(zSql2);. 
2c930 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61   }.end_ar_transa
2c940 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21  ction:.  if( rc!
2c950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c960 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2c970 41 72 2d 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43  Ar->db, "ROLLBAC
2c980 4b 20 54 4f 20 61 72 3b 20 52 45 4c 45 41 53 45  K TO ar; RELEASE
2c990 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b   ar;", 0, 0, 0);
2c9a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2c9b0 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
2c9c0 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29  , "RELEASE ar;")
2c9d0 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
2c9e0 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c  Zip && pAr->zFil
2c9f0 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  e ){.      zSql 
2ca00 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2ca10 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73  f("DROP TABLE %s
2ca20 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ", zTemp);.     
2ca30 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
2ca40 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
2ca50 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ca70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ca80 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2ca90 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d  of ".ar" dot com
2caa0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
2cab0 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  int arDotCommand
2cac0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
2cad0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
2cae0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
2caf0 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
2cb00 2a 2f 0a 20 20 69 6e 74 20 66 72 6f 6d 43 6d 64  */.  int fromCmd
2cb10 4c 69 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Line,           
2cb20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2cb30 2d 41 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  -A command-line 
2cb40 6f 70 74 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20  option, not .ar 
2cb50 63 6d 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  cmd */.  char **
2cb60 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
2cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
2cb80 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
2cb90 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
2cba0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
2cbb0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
2cbc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2cbd0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2cbe0 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
2cbf0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b    ArCommand cmd;
2cc00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d  .  int rc;.  mem
2cc10 73 65 74 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a  set(&cmd, 0, siz
2cc20 65 6f 66 28 63 6d 64 29 29 3b 0a 20 20 63 6d 64  eof(cmd));.  cmd
2cc30 2e 66 72 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20 66  .fromCmdLine = f
2cc40 72 6f 6d 43 6d 64 4c 69 6e 65 3b 0a 20 20 72 63  romCmdLine;.  rc
2cc50 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e   = arParseComman
2cc60 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26  d(azArg, nArg, &
2cc70 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  cmd);.  if( rc==
2cc80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cc90 20 69 6e 74 20 65 44 62 54 79 70 65 20 3d 20 53   int eDbType = S
2cca0 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
2ccb0 3b 0a 20 20 20 20 63 6d 64 2e 70 20 3d 20 70 53  ;.    cmd.p = pS
2ccc0 74 61 74 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62  tate;.    cmd.db
2ccd0 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20   = pState->db;. 
2cce0 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65     if( cmd.zFile
2ccf0 20 29 7b 0a 20 20 20 20 20 20 65 44 62 54 79 70   ){.      eDbTyp
2cd00 65 20 3d 20 64 65 64 75 63 65 44 61 74 61 62 61  e = deduceDataba
2cd10 73 65 54 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65  seType(cmd.zFile
2cd20 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
2cd30 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d  .      eDbType =
2cd40 20 70 53 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64   pState->openMod
2cd50 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
2cd60 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2cd70 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a  OPEN_ZIPFILE ){.
2cd80 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65 43        if( cmd.eC
2cd90 6d 64 3d 3d 41 52 5f 43 4d 44 5f 45 58 54 52 41  md==AR_CMD_EXTRA
2cda0 43 54 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  CT || cmd.eCmd==
2cdb0 41 52 5f 43 4d 44 5f 4c 49 53 54 20 29 7b 0a 20  AR_CMD_LIST ){. 
2cdc0 20 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a         if( cmd.z
2cdd0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2cde0 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62       cmd.zSrcTab
2cdf0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  le = sqlite3_mpr
2ce00 69 6e 74 66 28 22 7a 69 70 22 29 3b 0a 20 20 20  intf("zip");.   
2ce10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ce20 20 20 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61        cmd.zSrcTa
2ce30 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ble = sqlite3_mp
2ce40 72 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 28 25  rintf("zipfile(%
2ce50 51 29 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b  Q)", cmd.zFile);
2ce60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ce70 20 7d 0a 20 20 20 20 20 20 63 6d 64 2e 62 5a 69   }.      cmd.bZi
2ce80 70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 1;.    }else
2ce90 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29   if( cmd.zFile )
2cea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  {.      int flag
2ceb0 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64  s;.      if( cmd
2cec0 2e 62 41 70 70 65 6e 64 20 29 20 65 44 62 54 79  .bAppend ) eDbTy
2ced0 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  pe = SHELL_OPEN_
2cee0 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20  APPENDVFS;.     
2cef0 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
2cf00 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20  R_CMD_CREATE || 
2cf10 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2cf20 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
2cf30 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
2cf40 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2cf50 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2cf60 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
2cf70 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
2cf80 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2cf90 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  ADONLY;.      }.
2cfa0 20 20 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 30        cmd.db = 0
2cfb0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
2cfc0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
2cfd0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2cfe0 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20  State->out, "-- 
2cff0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 27 25  open database '%
2d000 73 27 25 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69  s'%s\n", cmd.zFi
2d010 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
2d020 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f   eDbType==SHELL_
2d030 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f  OPEN_APPENDVFS ?
2d040 20 22 20 75 73 69 6e 67 20 27 61 70 6e 64 76 66   " using 'apndvf
2d050 73 27 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  s'" : "");.     
2d060 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2d070 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d  lite3_open_v2(cm
2d080 64 2e 7a 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62  d.zFile, &cmd.db
2d090 2c 20 66 6c 61 67 73 2c 20 0a 20 20 20 20 20 20  , flags, .      
2d0a0 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d 3d         eDbType==
2d0b0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
2d0c0 44 56 46 53 20 3f 20 22 61 70 6e 64 76 66 73 22  DVFS ? "apndvfs"
2d0d0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28   : 0);.      if(
2d0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d0f0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2d100 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63  rintf(stderr, "c
2d110 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2d120 20 25 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20   %s (%s)\n", .  
2d130 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46            cmd.zF
2d140 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ile, sqlite3_err
2d150 6d 73 67 28 63 6d 64 2e 64 62 29 0a 20 20 20 20  msg(cmd.db).    
2d160 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 67      );.        g
2d170 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2d180 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2d190 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f    sqlite3_fileio
2d1a0 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c  _init(cmd.db, 0,
2d1b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
2d1c0 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d  e3_sqlar_init(cm
2d1d0 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d.db, 0, 0);.   
2d1e0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
2d1f0 65 5f 66 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64  e_function(cmd.d
2d200 62 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  b, "shell_putsnl
2d210 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
2d220 38 2c 20 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20  8, cmd.p,.      
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d240 20 20 20 20 20 20 20 20 73 68 65 6c 6c 50 75 74          shellPut
2d250 73 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20  sFunc, 0, 0);.. 
2d260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6d 64     }.    if( cmd
2d270 2e 7a 53 72 63 54 61 62 6c 65 3d 3d 30 20 26 26  .zSrcTable==0 &&
2d280 20 63 6d 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20   cmd.bZip==0 && 
2d290 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2d2a0 5f 48 45 4c 50 20 29 7b 0a 20 20 20 20 20 20 69  _HELP ){.      i
2d2b0 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f  f( cmd.eCmd!=AR_
2d2c0 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20  CMD_CREATE.     
2d2d0 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62    && sqlite3_tab
2d2e0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
2d2f0 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c  ta(cmd.db,0,"sql
2d300 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30  ar","name",0,0,0
2d310 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20  ,0,0).      ){. 
2d320 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2d330 74 66 28 73 74 64 65 72 72 2c 20 22 64 61 74 61  tf(stderr, "data
2d340 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  base does not co
2d350 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27  ntain an 'sqlar'
2d360 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20   table\n");.    
2d370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d380 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
2d390 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61  oto end_ar_comma
2d3a0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
2d3b0 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2d3c0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2d3d0 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20  f("sqlar");.    
2d3e0 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
2d3f0 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
2d400 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
2d410 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
2d420 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70 64 61  = arCreateOrUpda
2d430 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20  teCommand(&cmd, 
2d440 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
2d450 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2d460 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
2d470 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78         rc = arEx
2d480 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d  tractCommand(&cm
2d490 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
2d4a0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
2d4b0 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20  R_CMD_LIST:.    
2d4c0 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43      rc = arListC
2d4d0 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20  ommand(&cmd);.  
2d4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2d4f0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2d500 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72  HELP:.        ar
2d510 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75  Usage(pState->ou
2d520 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
2d530 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
2d540 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
2d550 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  t( cmd.eCmd==AR_
2d560 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20  CMD_UPDATE );.  
2d570 20 20 20 20 20 20 72 63 20 3d 20 61 72 43 72 65        rc = arCre
2d580 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61  ateOrUpdateComma
2d590 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20  nd(&cmd, 1);.   
2d5a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d5b0 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d  }.  }.end_ar_com
2d5c0 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e  mand:.  if( cmd.
2d5d0 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29  db!=pState->db )
2d5e0 7b 0a 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 63  {.    close_db(c
2d5f0 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  md.db);.  }.  sq
2d600 6c 69 74 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a  lite3_free(cmd.z
2d610 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65  SrcTable);..  re
2d620 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e  turn rc;.}./* En
2d630 64 20 6f 66 20 74 68 65 20 22 2e 61 72 63 68 69  d of the ".archi
2d640 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d  ve" or ".ar" com
2d650 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a  mand logic.*****
2d660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
2d6b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
2d6c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
2d6d0 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
2d6e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
2d6f0 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a  VE_ZLIB) */.../*
2d700 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74 20  .** If an input 
2d710 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74 68  line begins with
2d720 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65   "." then invoke
2d730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2d740 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
2d750 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   line..**.** Ret
2d760 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20  urn 1 on error, 
2d770 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30  2 to exit, and 0
2d780 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
2d790 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74  tatic int do_met
2d7a0 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a  a_command(char *
2d7b0 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74  zLine, ShellStat
2d7c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d  e *p){.  int h =
2d7d0 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d   1;.  int nArg =
2d7e0 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a   0;.  int n, c;.
2d7f0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
2d800 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b  char *azArg[50];
2d810 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2d820 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2d830 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65  LE.  if( p->expe
2d840 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20  rt.pExpert ){.  
2d850 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70    expertFinish(p
2d860 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
2d870 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  dif..  /* Parse 
2d880 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 20 69  the input line i
2d890 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  nto tokens..  */
2d8a0 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b  .  while( zLine[
2d8b0 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72 61 79  h] && nArg<Array
2d8c0 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b 0a 20  Size(azArg) ){. 
2d8d0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
2d8e0 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
2d8f0 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c  ++; }.    if( zL
2d900 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61  ine[h]==0 ) brea
2d910 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  k;.    if( zLine
2d920 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69  [h]=='\'' || zLi
2d930 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  ne[h]=='"' ){.  
2d940 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20      int delim = 
2d950 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20  zLine[h++];.    
2d960 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20    azArg[nArg++] 
2d970 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20  = &zLine[h];.   
2d980 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
2d990 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d  h] && zLine[h]!=
2d9a0 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
2d9b0 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27   if( zLine[h]=='
2d9c0 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22  \\' && delim=='"
2d9d0 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21  ' && zLine[h+1]!
2d9e0 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20  =0 ) h++;.      
2d9f0 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    h++;.      }. 
2da00 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68       if( zLine[h
2da10 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20  ]==delim ){.    
2da20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d      zLine[h++] =
2da30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2da40 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27    if( delim=='"'
2da50 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73   ) resolve_backs
2da60 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72  lashes(azArg[nAr
2da70 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g-1]);.    }else
2da80 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41  {.      azArg[nA
2da90 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68  rg++] = &zLine[h
2daa0 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ];.      while( 
2dab0 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49 73 53  zLine[h] && !IsS
2dac0 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29  pace(zLine[h]) )
2dad0 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { h++; }.      i
2dae0 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c  f( zLine[h] ) zL
2daf0 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20  ine[h++] = 0;.  
2db00 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b      resolve_back
2db10 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e 41  slashes(azArg[nA
2db20 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg-1]);.    }.  
2db30 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
2db40 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a  the input line..
2db50 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d    */.  if( nArg=
2db60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  =0 ) return 0; /
2db70 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20  * no tokens, no 
2db80 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73  error */.  n = s
2db90 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d  trlen30(azArg[0]
2dba0 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67 5b 30  );.  c = azArg[0
2dbb0 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d  ][0];.  clearTem
2dbc0 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64  pFile(p);..#ifnd
2dbd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2dbe0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
2dbf0 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
2dc00 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2dc10 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  auth", n)==0 ){.
2dc20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
2dc30 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2dc40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2dc50 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46  ge: .auth ON|OFF
2dc60 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2dc70 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
2dc80 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2dc90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
2dca0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
2dcb0 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  f( booleanValue(
2dcc0 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20  azArg[1]) ){.   
2dcd0 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61     sqlite3_set_a
2dce0 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c  uthorizer(p->db,
2dcf0 20 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a   shellAuth, p);.
2dd00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dd10 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
2dd20 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30  horizer(p->db, 0
2dd30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2dd40 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  lse.#endif..#if 
2dd50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2dd60 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2dd70 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
2dd80 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a  LITE_HAVE_ZLIB).
2dd90 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20    if( c=='a' && 
2dda0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ddb0 2c 20 22 61 72 63 68 69 76 65 22 2c 20 6e 29 3d  , "archive", n)=
2ddc0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
2ddd0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  b(p, 0);.    rc 
2dde0 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70  = arDotCommand(p
2ddf0 2c 20 30 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  , 0, azArg, nArg
2de00 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
2de10 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27  f..  if( (c=='b'
2de20 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2de30 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
2de40 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20  ackup", n)==0). 
2de50 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20    || (c=='s' && 
2de60 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2de70 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22  azArg[0], "save"
2de80 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  , n)==0).  ){.  
2de90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2dea0 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  estFile = 0;.   
2deb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2dec0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2ded0 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71  3 *pDest;.    sq
2dee0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
2def0 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a  ackup;.    int j
2df00 3b 0a 20 20 20 20 69 6e 74 20 62 41 73 79 6e 63  ;.    int bAsync
2df10 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
2df20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a  char *zVfs = 0;.
2df30 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e      for(j=1; j<n
2df40 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Arg; j++){.     
2df50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2df60 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
2df70 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
2df80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
2df90 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  1]=='-' ) z++;. 
2dfa0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
2dfb0 70 28 7a 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d  p(z, "-append")=
2dfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2dfd0 7a 56 66 73 20 3d 20 22 61 70 6e 64 76 66 73 22  zVfs = "apndvfs"
2dfe0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2dff0 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2e000 6d 70 28 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d  mp(z, "-async")=
2e010 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e020 62 41 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  bAsync = 1;.    
2e030 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
2e040 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74    {.          ut
2e050 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2e060 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "unknown optio
2e070 6e 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b  n: %s\n", azArg[
2e080 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  j]);.          r
2e090 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2e0a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2e0b0 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20  f( zDestFile==0 
2e0c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  ){.        zDest
2e0d0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
2e0e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e0f0 20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zDb==0 ){.     
2e100 20 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69     zDb = zDestFi
2e110 6c 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73  le;.        zDes
2e120 74 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d  tFile = azArg[j]
2e130 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e140 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2e150 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2e160 3a 20 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f  : .backup ?DB? ?
2e170 4f 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d  OPTIONS? FILENAM
2e180 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  E\n");.        r
2e190 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2e1a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2e1b0 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  DestFile==0 ){. 
2e1c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e1d0 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67  stderr, "missing
2e1e0 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65   FILENAME argume
2e1f0 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22  nt on .backup\n"
2e200 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2e210 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
2e220 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20   zDb==0 ) zDb = 
2e230 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d  "main";.    rc =
2e240 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
2e250 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65  (zDestFile, &pDe
2e260 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  st, .           
2e270 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
2e280 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
2e290 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
2e2a0 20 7a 56 66 73 29 3b 0a 20 20 20 20 69 66 28 20   zVfs);.    if( 
2e2b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e2c0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2e2d0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2e2e0 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2e2f0 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46  "%s\"\n", zDestF
2e300 69 6c 65 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ile);.      clos
2e310 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 20  e_db(pDest);.   
2e320 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2e330 20 7d 0a 20 20 20 20 69 66 28 20 62 41 73 79 6e   }.    if( bAsyn
2e340 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
2e350 65 33 5f 65 78 65 63 28 70 44 65 73 74 2c 20 22  e3_exec(pDest, "
2e360 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
2e370 75 73 3d 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a  us=OFF; PRAGMA j
2e380 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b  ournal_mode=OFF;
2e390 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e3a0 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a        0, 0, 0);.
2e3b0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
2e3c0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61  b(p, 0);.    pBa
2e3d0 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62  ckup = sqlite3_b
2e3e0 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74  ackup_init(pDest
2e3f0 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c  , "main", p->db,
2e400 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
2e410 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20  Backup==0 ){.   
2e420 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e430 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2e440 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2e450 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
2e460 20 20 20 20 63 6c 6f 73 65 5f 64 62 28 70 44 65      close_db(pDe
2e470 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  st);.      retur
2e480 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n 1;.    }.    w
2e490 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71 6c  hile(  (rc = sql
2e4a0 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65 70  ite3_backup_step
2e4b0 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d  (pBackup,100))==
2e4c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20  SQLITE_OK ){}.  
2e4d0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2e4e0 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
2e4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e500 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
2e510 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
2e520 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
2e530 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e540 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
2e550 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 44  qlite3_errmsg(pD
2e560 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20  est));.      rc 
2e570 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
2e580 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29 3b 0a  lose_db(pDest);.
2e590 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2e5a0 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='b' && n>=3 &&
2e5b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2e5c0 5d 2c 20 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30  ], "bail", n)==0
2e5d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2e5e0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 62 61 69  ==2 ){.      bai
2e5f0 6c 5f 6f 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f  l_on_error = boo
2e600 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
2e610 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2e620 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2e630 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2e640 20 2e 62 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22   .bail on|off\n"
2e650 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2e660 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2e670 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20    if( c=='b' && 
2e680 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2e690 61 7a 41 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72  azArg[0], "binar
2e6a0 79 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  y", n)==0 ){.   
2e6b0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2e6c0 20 20 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61        if( boolea
2e6d0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 42   ){.        setB
2e6f0 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74  inaryMode(p->out
2e700 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
2e710 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 54 65  e{.        setTe
2e720 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31  xtMode(p->out, 1
2e730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2e740 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2e750 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e760 55 73 61 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f  Usage: .binary o
2e770 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
2e780 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2e790 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2e7a0 3d 27 63 27 20 26 26 20 73 74 72 63 6d 70 28 61  ='c' && strcmp(a
2e7b0 7a 41 72 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30  zArg[0],"cd")==0
2e7c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
2e7d0 3d 3d 32 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==2 ){.#if defin
2e7e0 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2e7f0 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 20  fined(WIN32).   
2e800 20 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20     wchar_t *z = 
2e810 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
2e820 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a  f8_to_unicode(az
2e830 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[1]);.      r
2e840 63 20 3d 20 21 53 65 74 43 75 72 72 65 6e 74 44  c = !SetCurrentD
2e850 69 72 65 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20  irectoryW(z);.  
2e860 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e870 28 7a 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  (z);.#else.     
2e880 20 72 63 20 3d 20 63 68 64 69 72 28 61 7a 41 72   rc = chdir(azAr
2e890 67 5b 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  g[1]);.#endif.  
2e8a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e8b0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2e8c0 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f  f(stderr, "Canno
2e8d0 74 20 63 68 61 6e 67 65 20 74 6f 20 64 69 72 65  t change to dire
2e8e0 63 74 6f 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c  ctory \"%s\"\n",
2e8f0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2e900 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2e910 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e920 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e930 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2e940 2e 63 64 20 44 49 52 45 43 54 4f 52 59 5c 6e 22  .cd DIRECTORY\n"
2e950 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2e960 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2e970 20 20 2f 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d    /* The undocum
2e980 65 6e 74 65 64 20 22 2e 62 72 65 61 6b 70 6f 69  ented ".breakpoi
2e990 6e 74 22 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73  nt" command caus
2e9a0 65 73 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65  es a call to the
2e9b0 20 6e 6f 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74   no-op.  ** rout
2e9c0 69 6e 65 20 6e 61 6d 65 64 20 74 65 73 74 5f 62  ine named test_b
2e9d0 72 65 61 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a  reakpoint()..  *
2e9e0 2f 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26  /.  if( c=='b' &
2e9f0 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2ea00 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65  p(azArg[0], "bre
2ea10 61 6b 70 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20  akpoint", n)==0 
2ea20 29 7b 0a 20 20 20 20 74 65 73 74 5f 62 72 65 61  ){.    test_brea
2ea30 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73  kpoint();.  }els
2ea40 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
2ea50 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2ea60 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68  mp(azArg[0], "ch
2ea70 61 6e 67 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  anges", n)==0 ){
2ea80 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2ea90 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
2eaa0 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
2eab0 47 5f 43 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20  G_CountChanges, 
2eac0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2ead0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2eae0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2eaf0 55 73 61 67 65 3a 20 2e 63 68 61 6e 67 65 73 20  Usage: .changes 
2eb00 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2eb10 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2eb20 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61    }else..  /* Ca
2eb30 6e 63 65 6c 20 6f 75 74 70 75 74 20 72 65 64 69  ncel output redi
2eb40 72 65 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 69  rection, if it i
2eb50 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
2eb60 28 62 79 20 2e 74 65 73 74 63 61 73 65 29 0a 20  (by .testcase). 
2eb70 20 2a 2a 20 54 68 65 6e 20 72 65 61 64 20 74 68   ** Then read th
2eb80 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2eb90 20 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78   testcase-out.tx
2eba0 74 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61  t file and compa
2ebb0 72 65 20 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20  re against.  ** 
2ebc0 61 7a 41 72 67 5b 31 5d 2e 20 20 49 66 20 74 68  azArg[1].  If th
2ebd0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
2ebe0 63 65 73 2c 20 72 65 70 6f 72 74 20 61 6e 20 65  ces, report an e
2ebf0 72 72 6f 72 20 61 6e 64 20 65 78 69 74 2e 0a 20  rror and exit.. 
2ec00 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27   */.  if( c=='c'
2ec10 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2ec20 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63  cmp(azArg[0], "c
2ec30 68 65 63 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  heck", n)==0 ){.
2ec40 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20 3d      char *zRes =
2ec50 20 30 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72   0;.    output_r
2ec60 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28  eset(p);.    if(
2ec70 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20   nArg!=2 ){.    
2ec80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2ec90 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68  err, "Usage: .ch
2eca0 65 63 6b 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e  eck GLOB-PATTERN
2ecb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2ecc0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2ecd0 28 20 28 7a 52 65 73 20 3d 20 72 65 61 64 46 69  ( (zRes = readFi
2ece0 6c 65 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74  le("testcase-out
2ecf0 2e 74 78 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b  .txt", 0))==0 ){
2ed00 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2ed10 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2ed20 3a 20 63 61 6e 6e 6f 74 20 72 65 61 64 20 27 74  : cannot read 't
2ed30 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
2ed40 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2ed50 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
2ed60 28 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28  ( testcase_glob(
2ed70 61 7a 41 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d  azArg[1],zRes)==
2ed80 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
2ed90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edb0 22 74 65 73 74 63 61 73 65 2d 25 73 20 46 41 49  "testcase-%s FAI
2edc0 4c 45 44 5c 6e 20 45 78 70 65 63 74 65 64 3a 20  LED\n Expected: 
2edd0 5b 25 73 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a  [%s]\n      Got:
2ede0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
2edf0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54             p->zT
2ee00 65 73 74 63 61 73 65 2c 20 61 7a 41 72 67 5b 31  estcase, azArg[1
2ee10 5d 2c 20 7a 52 65 73 29 3b 0a 20 20 20 20 20 20  ], zRes);.      
2ee20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
2ee30 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2ee40 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65  intf(stdout, "te
2ee50 73 74 63 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c  stcase-%s ok\n",
2ee60 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a   p->zTestcase);.
2ee70 20 20 20 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b        p->nCheck+
2ee80 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
2ee90 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73 29 3b  ite3_free(zRes);
2eea0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2eeb0 63 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  c=='c' && strncm
2eec0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f  p(azArg[0], "clo
2eed0 6e 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ne", n)==0 ){.  
2eee0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2eef0 0a 20 20 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  .      tryToClon
2ef00 65 28 70 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  e(p, azArg[1]);.
2ef10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ef20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2ef30 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f  rr, "Usage: .clo
2ef40 6e 65 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b  ne FILENAME\n");
2ef50 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ef60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ef70 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e  if( c=='d' && n>
2ef80 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  1 && strncmp(azA
2ef90 72 67 5b 30 5d 2c 20 22 64 61 74 61 62 61 73 65  rg[0], "database
2efa0 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
2efb0 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
2efc0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
2efd0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65  Msg = 0;.    ope
2efe0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2eff0 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c  memcpy(&data, p,
2f000 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a   sizeof(data));.
2f010 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61      data.showHea
2f020 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74  der = 0;.    dat
2f030 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d  a.cMode = data.m
2f040 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
2f050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2f060 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74  rintf(sizeof(dat
2f070 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  a.colSeparator),
2f080 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f  data.colSeparato
2f090 72 2c 22 3a 20 22 29 3b 0a 20 20 20 20 64 61 74  r,": ");.    dat
2f0a0 61 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73  a.cnt = 0;.    s
2f0b0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2f0c0 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  b, "SELECT name,
2f0d0 20 66 69 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d   file FROM pragm
2f0e0 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22  a_database_list"
2f0f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f100 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61     callback, &da
2f110 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
2f120 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
2f130 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
2f140 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2f150 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
2f160 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2f170 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
2f180 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2f190 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2f1a0 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e  if( c=='d' && n>
2f1b0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2f1c0 41 72 67 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69  Arg[0], "dbconfi
2f1d0 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  g", n)==0 ){.   
2f1e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2f1f0 72 75 63 74 20 44 62 43 6f 6e 66 69 67 43 68 6f  ruct DbConfigCho
2f200 69 63 65 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ices {.      con
2f210 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
2f220 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20        int op;.  
2f230 20 20 7d 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20    } aDbConfig[] 
2f240 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 65  = {.        { "e
2f250 6e 61 62 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20  nable_fkey",    
2f260 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2f270 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20  G_ENABLE_FKEY   
2f280 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f290 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72      { "enable_tr
2f2a0 69 67 67 65 72 22 2c 20 20 20 53 51 4c 49 54 45  igger",   SQLITE
2f2b0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2f2c0 5f 54 52 49 47 47 45 52 20 20 20 20 20 20 20 20  _TRIGGER        
2f2d0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 66   },.        { "f
2f2e0 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20  ts3_tokenizer", 
2f2f0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2f300 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
2f310 4b 45 4e 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20  KENIZER  },.    
2f320 20 20 20 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65      { "load_exte
2f330 6e 73 69 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45  nsion",   SQLITE
2f340 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2f350 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
2f360 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 6e   },.        { "n
2f370 6f 5f 63 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22  o_ckpt_on_close"
2f380 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
2f390 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f  G_NO_CKPT_ON_CLO
2f3a0 53 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  SE       },.    
2f3b0 20 20 20 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70      { "enable_qp
2f3c0 73 67 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  sg",      SQLITE
2f3d0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2f3e0 5f 51 50 53 47 20 20 20 20 20 20 20 20 20 20 20  _QPSG           
2f3f0 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 74   },.        { "t
2f400 72 69 67 67 65 72 5f 65 71 70 22 2c 20 20 20 20  rigger_eqp",    
2f410 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2f420 47 5f 54 52 49 47 47 45 52 5f 45 51 50 20 20 20  G_TRIGGER_EQP   
2f430 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f440 20 20 20 20 7b 20 22 72 65 73 65 74 5f 64 61 74      { "reset_dat
2f450 61 62 61 73 65 22 2c 20 20 20 53 51 4c 49 54 45  abase",   SQLITE
2f460 5f 44 42 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f  _DBCONFIG_RESET_
2f470 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20 20  DATABASE        
2f480 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 22 64   },.        { "d
2f490 65 66 65 6e 73 69 76 65 22 2c 20 20 20 20 20 20  efensive",      
2f4a0 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49    SQLITE_DBCONFI
2f4b0 47 5f 44 45 46 45 4e 53 49 56 45 20 20 20 20 20  G_DEFENSIVE     
2f4c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f4d0 7d 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20 76  };.    int ii, v
2f4e0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2f4f0 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   0);.    for(ii=
2f500 30 3b 20 69 69 3c 41 72 72 61 79 53 69 7a 65 28  0; ii<ArraySize(
2f510 61 44 62 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b  aDbConfig); ii++
2f520 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
2f530 67 3e 31 20 26 26 20 73 74 72 63 6d 70 28 61 7a  g>1 && strcmp(az
2f540 41 72 67 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69  Arg[1], aDbConfi
2f550 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  g[ii].zName)!=0 
2f560 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f570 20 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b    if( nArg>=3 ){
2f580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f590 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62  _db_config(p->db
2f5a0 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e  , aDbConfig[ii].
2f5b0 6f 70 2c 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  op, booleanValue
2f5c0 28 61 7a 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a  (azArg[2]), 0);.
2f5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2f5e0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
2f5f0 70 2d 3e 64 62 2c 20 61 44 62 43 6f 6e 66 69 67  p->db, aDbConfig
2f600 5b 69 69 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29  [ii].op, -1, &v)
2f610 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
2f620 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38  ntf(p->out, "%18
2f630 73 20 25 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66  s %s\n", aDbConf
2f640 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20  ig[ii].zName, v 
2f650 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b  ? "on" : "off");
2f660 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e  .      if( nArg>
2f670 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  1 ) break;.    }
2f680 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
2f690 26 26 20 69 69 3d 3d 41 72 72 61 79 53 69 7a 65  && ii==ArraySize
2f6a0 28 61 44 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20  (aDbConfig) ){. 
2f6b0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f6c0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2f6d0 20 75 6e 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69   unknown dbconfi
2f6e0 67 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  g \"%s\"\n", azA
2f6f0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 75 74  rg[1]);.      ut
2f700 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2f710 2c 20 22 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f  , "Enter \".dbco
2f720 6e 66 69 67 5c 22 20 77 69 74 68 20 6e 6f 20 61  nfig\" with no a
2f730 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
2f740 69 73 74 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20  ist\n");.    }  
2f750 20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28   .  }else..  if(
2f760 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20   c=='d' && n>=3 
2f770 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2f780 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e  [0], "dbinfo", n
2f790 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
2f7a0 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
2f7b0 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61  mmand(p, nArg, a
2f7c0 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zArg);.  }else..
2f7d0 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26 20    if( c=='d' && 
2f7e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2f7f0 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20  , "dump", n)==0 
2f800 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2f810 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20  r *zLike = 0;.  
2f820 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
2f830 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
2f840 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
2f850 3b 0a 20 20 20 20 69 6e 74 20 73 61 76 65 64 53  ;.    int savedS
2f860 68 65 6c 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  hellFlags = p->s
2f870 68 65 6c 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68  hellFlgs;.    Sh
2f880 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20  ellClearFlag(p, 
2f890 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
2f8a0 77 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  wid|SHFLG_Newlin
2f8b0 65 73 7c 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a  es|SHFLG_Echo);.
2f8c0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2f8d0 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
2f8e0 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d   if( azArg[i][0]
2f8f0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
2f900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2f910 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20   azArg[i]+1;.   
2f920 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
2f930 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
2f940 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
2f950 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22  preserve-rowids"
2f960 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
2f970 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2f980 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2f990 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f9a0 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73  err, "The --pres
2f9b0 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69  erve-rowids opti
2f9c0 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  on is not compat
2f9d0 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  ible".          
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9f0 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45     " with SQLITE
2fa00 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2fa10 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
2fa20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2fa30 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2fa40 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73  mmand_exit;.#els
2fa50 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  e.          Shel
2fa60 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
2fa70 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
2fa80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
2fa90 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
2faa0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77  f( strcmp(z,"new
2fab0 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  lines")==0 ){.  
2fac0 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74          ShellSet
2fad0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
2fae0 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20  wlines);.       
2faf0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
2fb00 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
2fb10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2fb20 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
2fb30 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c  %s\" on \".dump\
2fb40 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "\n", azArg[i]);
2fb50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2fb60 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
2fb70 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2fb80 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2fb90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
2fba0 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
2fbb0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2fbc0 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70  r, "Usage: .dump
2fbd0 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77   ?--preserve-row
2fbe0 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20  ids? ".         
2fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc00 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20    "?--newlines? 
2fc10 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
2fc20 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2fc30 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2fc40 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2fc50 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
2fc60 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
2fc70 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
2fc80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65   }.    }.    ope
2fc90 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2fca0 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
2fcb0 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74  back a "dump", t
2fcc0 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74  he content might
2fcd0 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72   appear in an or
2fce0 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  der.    ** which
2fcf0 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74   causes immediat
2fd00 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2fd10 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20  nstraints to be 
2fd20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a  violated..    **
2fd30 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65   So disable fore
2fd40 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign-key constrai
2fd50 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74  nt enforcement t
2fd60 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65  o prevent proble
2fd70 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70  ms. */.    raw_p
2fd80 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
2fd90 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
2fda0 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ys=OFF;\n");.   
2fdb0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2fdc0 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53  ut, "BEGIN TRANS
2fdd0 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20  ACTION;\n");.   
2fde0 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
2fdf0 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  ma = 0;.    p->s
2fe00 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2fe10 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62     /* Set writab
2fe20 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e  le_schema=ON sin
2fe30 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63  ce doing so forc
2fe40 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69  es SQLite to ini
2fe50 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61  tialize.    ** a
2fe60 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63  s much of the sc
2fe70 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65  hema as it can e
2fe80 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74  ven if the sqlit
2fe90 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69  e_master table i
2fea0 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74  s.    ** corrupt
2feb0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2fec0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41  _exec(p->db, "SA
2fed0 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52  VEPOINT dump; PR
2fee0 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
2fef0 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
2ff00 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20  0);.    p->nErr 
2ff10 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  = 0;.    if( zLi
2ff20 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ke==0 ){.      r
2ff30 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
2ff40 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
2ff50 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
2ff60 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
2ff70 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2ff80 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
2ff90 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
2ffa0 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e  e=='table' AND n
2ffb0 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71  ame!='sqlite_seq
2ffc0 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b  uence'".      );
2ffd0 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
2ffe0 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
2fff0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
30000 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
30010 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
30020 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
30030 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74  ERE name=='sqlit
30040 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
30050 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
30060 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
30070 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
30080 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
30090 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
300a0 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
300b0 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
300c0 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
300d0 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
300e0 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
300f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
30100 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20  ar *zSql;.      
30110 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
30120 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
30130 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
30140 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
30150 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
30160 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f       "WHERE tbl_
30170 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44  name LIKE %Q AND
30180 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a   type=='table'".
30190 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73          "  AND s
301a0 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c  ql NOT NULL", zL
301b0 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
301c0 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
301d0 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20  y(p,zSql);.     
301e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
301f0 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  ql);.      zSql 
30200 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
30210 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  f(.        "SELE
30220 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
30230 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
30240 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
30250 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20  OT NULL".       
30260 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
30270 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
30280 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
30290 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e      "  AND tbl_n
302a0 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c  ame LIKE %Q", zL
302b0 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
302c0 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
302d0 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20  (p, zSql, 0);.  
302e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
302f0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
30300 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c    if( p->writabl
30310 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
30320 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
30330 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
30340 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
30350 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
30360 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
30370 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
30380 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
30390 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
303a0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
303b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
303c0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
303d0 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b  , "RELEASE dump;
303e0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
303f0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
30400 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52  ut, p->nErr ? "R
30410 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20  OLLBACK; -- due 
30420 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22  to errors\n" : "
30430 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20  COMMIT;\n");.   
30440 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
30450 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
30460 3b 0a 20 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c  ;.    p->shellFl
30470 67 73 20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46  gs = savedShellF
30480 6c 61 67 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  lags;.  }else.. 
30490 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
304a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
304b0 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29   "echo", n)==0 )
304c0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
304d0 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
304e0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
304f0 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31  LG_Echo, azArg[1
30500 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
30510 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30520 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
30530 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .echo on|off\n")
30540 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
30550 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
30560 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
30570 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
30580 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b   "eqp", n)==0 ){
30590 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
305a0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74   ){.      p->aut
305b0 6f 45 51 50 74 65 73 74 20 3d 20 30 3b 0a 20 20  oEQPtest = 0;.  
305c0 20 20 20 20 69 66 28 20 70 2d 3e 61 75 74 6f 45      if( p->autoE
305d0 51 50 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20  QPtrace ){.     
305e0 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 20 73     if( p->db ) s
305f0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
30600 62 2c 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f  b, "PRAGMA vdbe_
30610 74 72 61 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20  trace=OFF;", 0, 
30620 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
30630 2d 3e 61 75 74 6f 45 51 50 74 72 61 63 65 20 3d  ->autoEQPtrace =
30640 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
30650 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41    if( strcmp(azA
30660 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30  rg[1],"full")==0
30670 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
30680 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51 50  utoEQP = AUTOEQP
30690 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  _full;.      }el
306a0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a  se if( strcmp(az
306b0 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65 72 22  Arg[1],"trigger"
306c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
306d0 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54  p->autoEQP = AUT
306e0 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a 23 69  OEQP_trigger;.#i
306f0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
30700 47 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  G.      }else if
30710 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31  ( strcmp(azArg[1
30720 5d 2c 22 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a  ],"test")==0 ){.
30730 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
30740 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b  QP = AUTOEQP_on;
30750 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
30760 45 51 50 74 65 73 74 20 3d 20 31 3b 0a 20 20 20  EQPtest = 1;.   
30770 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
30780 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72  cmp(azArg[1],"tr
30790 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
307a0 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
307b0 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
307c0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
307d0 50 74 72 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  Ptrace = 1;.    
307e0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
307f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30800 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
30810 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
30820 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c   sqlite_master L
30830 49 4d 49 54 20 31 22 2c 20 30 2c 20 30 2c 20 30  IMIT 1", 0, 0, 0
30840 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30850 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
30860 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61 63  PRAGMA vdbe_trac
30870 65 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  e=ON;", 0, 0, 0)
30880 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
30890 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
308a0 3e 61 75 74 6f 45 51 50 20 3d 20 28 75 38 29 62  >autoEQP = (u8)b
308b0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
308c0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[1]);.      }. 
308d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
308e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
308f0 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 71 70 20  r, "Usage: .eqp 
30900 6f 66 66 7c 6f 6e 7c 74 72 61 63 65 7c 74 72 69  off|on|trace|tri
30910 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20  gger|full\n");. 
30920 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
30930 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
30940 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
30950 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
30960 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  xit", n)==0 ){. 
30970 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26     if( nArg>1 &&
30980 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e 74 65   (rc = (int)inte
30990 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  gerValue(azArg[1
309a0 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28 72 63  ]))!=0 ) exit(rc
309b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  );.    rc = 2;. 
309c0 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
309d0 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d   ".explain" comm
309e0 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74 69 63  and is automatic
309f0 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c 61 72   now.  It is lar
30a00 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20  gely pointless. 
30a10 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65   It.  ** retaine
30a20 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62 61 63  d purely for bac
30a30 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
30a40 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d  lity */.  if( c=
30a50 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
30a60 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61  azArg[0], "expla
30a70 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  in", n)==0 ){.  
30a80 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20    int val = 1;. 
30a90 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
30aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
30ab0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74  mp(azArg[1],"aut
30ac0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  o")==0 ){.      
30ad0 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20    val = 99;.    
30ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30af0 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56   val =  booleanV
30b00 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
30b10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30b20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26 26 20    if( val==1 && 
30b30 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78  p->mode!=MODE_Ex
30b40 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 70  plain ){.      p
30b50 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70  ->normalMode = p
30b60 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  ->mode;.      p-
30b70 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  >mode = MODE_Exp
30b80 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61  lain;.      p->a
30b90 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
30ba0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
30bb0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  l==0 ){.      if
30bc0 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
30bd0 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
30be0 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
30bf0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
30c00 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
30c10 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
30c20 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  99 ){.      if( 
30c30 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
30c40 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20  plain ) p->mode 
30c50 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b  = p->normalMode;
30c60 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78  .      p->autoEx
30c70 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  plain = 1;.    }
30c80 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
30c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
30ca0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
30cb0 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
30cc0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
30cd0 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  pert", n)==0 ){.
30ce0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
30cf0 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f 74  );.    expertDot
30d00 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67  Command(p, azArg
30d10 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65  , nArg);.  }else
30d20 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
30d30 3d 3d 27 66 27 20 26 26 20 73 74 72 6e 63 6d 70  =='f' && strncmp
30d40 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c  (azArg[0], "full
30d50 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29  schema", n)==0 )
30d60 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  {.    ShellState
30d70 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
30d80 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
30d90 20 20 69 6e 74 20 64 6f 53 74 61 74 73 20 3d 20    int doStats = 
30da0 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  0;.    memcpy(&d
30db0 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
30dc0 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
30dd0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
30de0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
30df0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
30e00 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 66 28 20  E_Semi;.    if( 
30e10 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f  nArg==2 && optio
30e20 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c  nMatch(azArg[1],
30e30 20 22 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20   "indent") ){.  
30e40 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
30e50 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
30e60 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
30e70 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nArg = 1;.    }.
30e80 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
30e90 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
30ea0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
30eb0 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  ge: .fullschema 
30ec0 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a  ?--indent?\n");.
30ed0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30ee0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
30ef0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
30f00 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
30f10 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
30f20 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
30f30 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
30f40 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20   sql FROM".     
30f50 20 20 22 20 20 28 53 45 4c 45 43 54 20 73 71 6c    "  (SELECT sql
30f60 20 73 71 6c 2c 20 74 79 70 65 20 74 79 70 65 2c   sql, type type,
30f70 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61   tbl_name tbl_na
30f80 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72  me, name name, r
30f90 6f 77 69 64 20 78 22 0a 20 20 20 20 20 20 20 22  owid x".       "
30fa0 20 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74 65       FROM sqlite
30fb0 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c  _master UNION AL
30fc0 4c 22 0a 20 20 20 20 20 20 20 22 20 20 20 53 45  L".       "   SE
30fd0 4c 45 43 54 20 73 71 6c 2c 20 74 79 70 65 2c 20  LECT sql, type, 
30fe0 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  tbl_name, name, 
30ff0 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74  rowid FROM sqlit
31000 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 29 20 22  e_temp_master) "
31010 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74  .       "WHERE t
31020 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
31030 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20  sql NOTNULL AND 
31040 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
31050 71 6c 69 74 65 5f 25 27 20 22 0a 20 20 20 20 20  qlite_%' ".     
31060 20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69    "ORDER BY rowi
31070 64 22 2c 0a 20 20 20 20 20 20 20 63 61 6c 6c 62  d",.       callb
31080 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
31090 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  rMsg.    );.    
310a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
310b0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
310c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
310d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
310e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
310f0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
31100 20 20 20 20 22 53 45 4c 45 43 54 20 72 6f 77 69      "SELECT rowi
31110 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  d FROM sqlite_ma
31120 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
31130 20 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d       " WHERE nam
31140 65 20 47 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73  e GLOB 'sqlite_s
31150 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20  tat[134]'",.    
31160 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
31170 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
31180 20 64 6f 53 74 61 74 73 20 3d 20 73 71 6c 69 74   doStats = sqlit
31190 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
311a0 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20  SQLITE_ROW;.    
311b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
311c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  ze(pStmt);.    }
311d0 0a 20 20 20 20 69 66 28 20 64 6f 53 74 61 74 73  .    if( doStats
311e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
311f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
31200 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74 61 62 6c  "/* No STAT tabl
31210 65 73 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c  es available */\
31220 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
31230 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31240 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a  (p->out, "ANALYZ
31250 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  E sqlite_master;
31260 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  \n");.      sqli
31270 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
31280 22 53 45 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45  "SELECT 'ANALYZE
31290 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 22   sqlite_master'"
312a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
312b0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
312c0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b  data, &zErrMsg);
312d0 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  .      data.cMod
312e0 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
312f0 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
31300 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62     data.zDestTab
31310 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61  le = "sqlite_sta
31320 74 31 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  t1";.      shell
31330 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45  _exec(&data, "SE
31340 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
31350 74 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72 72  te_stat1", &zErr
31360 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
31370 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73  .zDestTable = "s
31380 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20  qlite_stat3";.  
31390 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 26      shell_exec(&
313a0 64 61 74 61 2c 20 22 53 45 4c 45 43 54 20 2a 20  data, "SELECT * 
313b0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
313c0 33 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  3", &zErrMsg);. 
313d0 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54       data.zDestT
313e0 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73  able = "sqlite_s
313f0 74 61 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65  tat4";.      she
31400 6c 6c 5f 65 78 65 63 28 26 64 61 74 61 2c 20 22  ll_exec(&data, "
31410 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
31420 6c 69 74 65 5f 73 74 61 74 34 22 2c 20 26 7a 45  lite_stat4", &zE
31430 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61  rrMsg);.      ra
31440 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
31450 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
31460 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
31470 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
31480 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
31490 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
314a0 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20  headers", n)==0 
314b0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
314c0 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
314d0 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c  howHeader = bool
314e0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
314f0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
31500 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31510 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
31520 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c  .headers on|off\
31530 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
31540 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
31550 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
31560 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
31570 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
31580 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
31590 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 6e 20  g>=2 ){.      n 
315a0 3d 20 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75  = showHelp(p->ou
315b0 74 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  t, azArg[1]);.  
315c0 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
315d0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
315e0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74  ntf(p->out, "Not
315f0 68 69 6e 67 20 6d 61 74 63 68 65 73 20 27 25 73  hing matches '%s
31600 27 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  '\n", azArg[1]);
31610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31620 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 48 65  se{.      showHe
31630 6c 70 28 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20  lp(p->out, 0);. 
31640 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
31650 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74  if( c=='i' && st
31660 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31670 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20  "import", n)==0 
31680 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 61  ){.    char *zTa
31690 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
316a0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
316b0 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62 6c  a into this tabl
316c0 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
316d0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
316e0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
316f0 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63 6f  file to extra co
31700 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  ntent from */.  
31710 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
31720 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a  pStmt = NULL; /*
31730 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a   A statement */.
31740 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
31770 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
31780 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  e */.    int nBy
31790 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
317a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
317b0 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53 51  f bytes in an SQ
317c0 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  L string */.    
317d0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
317e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
317f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
31800 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d      int needComm
31810 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
31820 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49  /* True to COMMI
31830 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74  T or ROLLBACK at
31840 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
31850 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  nSep;           
31860 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31870 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70 2d  r of bytes in p-
31880 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20  >colSeparator[] 
31890 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
318a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
318b0 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61     /* An SQL sta
318c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d  tement */.    Im
318d0 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20 20  portCtx sCtx;   
318e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
318f0 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  der context */. 
31900 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54 45     char *(SQLITE
31910 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28 49  _CDECL *xRead)(I
31920 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46  mportCtx*); /* F
31930 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65 20  unc to read one 
31940 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
31950 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a   (SQLITE_CDECL *
31960 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b  xCloser)(FILE*);
31970 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f        /* Func to
31980 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a   close file */..
31990 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
319a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
319b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
319c0 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45  ge: .import FILE
319d0 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20   TABLE\n");.    
319e0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
319f0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
31a00 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72      zFile = azAr
31a10 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65  g[1];.    zTable
31a20 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
31a30 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20 3d   seenInterrupt =
31a40 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   0;.    memset(&
31a50 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
31a60 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e  sCtx));.    open
31a70 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e  _db(p, 0);.    n
31a80 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
31a90 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
31aa0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 30  .    if( nSep==0
31ab0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
31ac0 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20  intf(stderr,.   
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
31ae0 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63  rror: non-null c
31af0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
31b00 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
31b10 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
31b20 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
31b30 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29 7b     if( nSep>1 ){
31b40 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
31b50 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
31b60 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74 65  : multi-characte
31b70 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  r column separat
31b80 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22  ors not allowed"
31b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31ba0 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70         " for imp
31bb0 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
31bc0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
31bd0 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
31be0 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
31bf0 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  or);.    if( nSe
31c00 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  p==0 ){.      ra
31c10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31c20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c   "Error: non-nul
31c30 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  l row separator 
31c40 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d 70  required for imp
31c50 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ort\n");.      r
31c60 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
31c70 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20 26     if( nSep==2 &
31c80 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  & p->mode==MODE_
31c90 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70 2d  Csv && strcmp(p-
31ca0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
31cb0 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20  EP_CrLf)==0 ){. 
31cc0 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70       /* When imp
31cd0 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79  orting CSV (only
31ce0 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73 65  ), if the row se
31cf0 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  parator is set t
31d00 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
31d10 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72 6f  efault output ro
31d20 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68 61  w separator, cha
31d30 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64 65  nge it to the de
31d40 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20 20  fault input.    
31d50 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61 74    ** row separat
31d60 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73  or.  This avoids
31d70 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74   having to maint
31d80 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69 6e  ain different in
31d90 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  put.      ** and
31da0 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70 61   output row sepa
31db0 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20  rators. */.     
31dc0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
31dd0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
31de0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
31df0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
31e00 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65 70  Row);.      nSep
31e10 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72   = strlen30(p->r
31e20 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
31e30 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65 70    }.    if( nSep
31e40 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  >1 ){.      raw_
31e50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31e60 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61  Error: multi-cha
31e70 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61 72  racter row separ
31e80 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ators not allowe
31e90 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
31ea0 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69           " for i
31eb0 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20  mport\n");.     
31ec0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
31ed0 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20  .    sCtx.zFile 
31ee0 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43 74  = zFile;.    sCt
31ef0 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20  x.nLine = 1;.   
31f00 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b   if( sCtx.zFile[
31f10 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65  0]=='|' ){.#ifde
31f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  f SQLITE_OMIT_PO
31f30 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72  PEN.      raw_pr
31f40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31f50 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e  ror: pipes are n
31f60 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20  ot supported in 
31f70 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20  this OS\n");.   
31f80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c     return 1;.#el
31f90 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e  se.      sCtx.in
31fa0 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46   = popen(sCtx.zF
31fb0 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20  ile+1, "r");.   
31fc0 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20     sCtx.zFile = 
31fd0 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20 20  "<pipe>";.      
31fe0 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65  xCloser = pclose
31ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
32000 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e 69  se{.      sCtx.i
32010 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a  n = fopen(sCtx.z
32020 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20 20  File, "rb");.   
32030 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c     xCloser = fcl
32040 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ose;.    }.    i
32050 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
32060 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20 20  _Ascii ){.      
32070 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72 65  xRead = ascii_re
32080 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20  ad_one_field;.  
32090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 78    }else{.      x
320a0 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64 5f  Read = csv_read_
320b0 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
320c0 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69 6e  .    if( sCtx.in
320d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
320e0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
320f0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
32100 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
32110 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  zFile);.      re
32120 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
32130 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d    sCtx.cColSep =
32140 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
32150 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63 52  [0];.    sCtx.cR
32160 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
32170 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
32180 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
32190 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a  printf("SELECT *
321a0 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c   FROM %s", zTabl
321b0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  e);.    if( zSql
321c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 43 6c  ==0 ){.      xCl
321d0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
321e0 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f       shell_out_o
321f0 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20  f_memory();.    
32200 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74  }.    nByte = st
32210 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
32220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
32230 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
32240 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
32250 74 2c 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72  t, 0);.    impor
32260 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73  t_append_char(&s
32270 43 74 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54  Ctx, 0);    /* T
32280 6f 20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20  o ensure sCtx.z 
32290 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  is allocated */.
322a0 20 20 20 20 69 66 28 20 72 63 20 26 26 20 73 71      if( rc && sq
322b0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e  lite3_strglob("n
322c0 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22  o such table: *"
322d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
322e0 28 70 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20  (p->db))==0 ){. 
322f0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61       char *zCrea
32300 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
32310 69 6e 74 66 28 22 43 52 45 41 54 45 20 54 41 42  intf("CREATE TAB
32320 4c 45 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  LE %s", zTable);
32330 0a 20 20 20 20 20 20 63 68 61 72 20 63 53 65 70  .      char cSep
32340 20 3d 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68   = '(';.      wh
32350 69 6c 65 28 20 78 52 65 61 64 28 26 73 43 74 78  ile( xRead(&sCtx
32360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72  ) ){.        zCr
32370 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  eate = sqlite3_m
32380 70 72 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20  printf("%z%c\n  
32390 5c 22 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43  \"%w\" TEXT", zC
323a0 72 65 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74  reate, cSep, sCt
323b0 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53  x.z);.        cS
323c0 65 70 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  ep = ',';.      
323d0 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d    if( sCtx.cTerm
323e0 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  !=sCtx.cColSep )
323f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
32400 20 20 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d        if( cSep==
32410 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73  '(' ){.        s
32420 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
32430 61 74 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ate);.        sq
32440 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
32450 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f  z);.        xClo
32460 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
32470 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32480 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d  f(stderr,"%s: em
32490 70 74 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74  pty file\n", sCt
324a0 78 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  x.zFile);.      
324b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
324c0 20 20 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74    }.      zCreat
324d0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
324e0 6e 74 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72  ntf("%z\n)", zCr
324f0 65 61 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20  eate);.      rc 
32500 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
32510 2d 3e 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30  ->db, zCreate, 0
32520 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
32530 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65  qlite3_free(zCre
32540 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
32550 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
32560 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32570 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
32580 25 73 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20  %s(...) failed: 
32590 25 73 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20  %s\n", zTable,. 
325a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
325b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
325c0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  >db));.        s
325d0 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78  qlite3_free(sCtx
325e0 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c  .z);.        xCl
325f0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
32600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
32610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
32620 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
32630 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
32640 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
32650 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
32660 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
32670 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
32680 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
32690 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
326a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
326b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
326c0 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
326d0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
326e0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
326f0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
32700 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
32710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
32720 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
32730 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
32740 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
32750 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
32760 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
32770 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65  if( nCol==0 ) re
32780 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f  turn 0; /* no co
32790 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20  lumns, no error 
327a0 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  */.    zSql = sq
327b0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
327c0 6e 42 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e  nByte*2 + 20 + n
327d0 43 6f 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  Col*2 );.    if(
327e0 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
327f0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
32800 6e 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  n);.      shell_
32810 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
32820 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32830 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74  e3_snprintf(nByt
32840 65 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53  e+20, zSql, "INS
32850 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20  ERT INTO \"%w\" 
32860 56 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c  VALUES(?", zTabl
32870 65 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  e);.    j = strl
32880 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
32890 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b  for(i=1; i<nCol;
328a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71   i++){.      zSq
328b0 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  l[j++] = ',';.  
328c0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
328d0 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  '?';.    }.    z
328e0 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a  Sql[j++] = ')';.
328f0 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
32900 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32910 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
32920 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
32930 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
32940 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
32950 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
32960 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32970 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32980 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
32990 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
329a0 0a 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74  .      if (pStmt
329b0 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
329c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
329d0 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
329e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
329f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65  1;.    }.    nee
32a00 64 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65  dCommit = sqlite
32a10 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
32a20 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28  (p->db);.    if(
32a30 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
32a40 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
32a50 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c  , "BEGIN", 0, 0,
32a60 20 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20   0);.    do{.   
32a70 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
32a80 20 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20   = sCtx.nLine;. 
32a90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
32aa0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
32ab0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52      char *z = xR
32ac0 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20  ead(&sCtx);.    
32ad0 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a      /*.        *
32ae0 2a 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65  * Did we reach e
32af0 6e 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72  nd-of-file befor
32b00 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f  e finding any co
32b10 6c 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a  lumns?.        *
32b20 2a 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e  * If so, stop in
32b30 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
32b40 6c 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e  lling the remain
32b50 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ing columns..   
32b60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32b70 69 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30  if( z==0 && i==0
32b80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32b90 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    /*.        ** 
32ba0 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64  Did we reach end
32bb0 2d 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d  -of-file OR end-
32bc0 6f 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66  of-line before f
32bd0 69 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20  inding any.     
32be0 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e     ** columns in
32bf0 20 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66   ASCII mode?  If
32c00 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61   so, stop instea
32c10 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e  d of NULL fillin
32c20 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
32c30 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d   remaining colum
32c40 6e 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ns..        */. 
32c50 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f         if( p->mo
32c60 64 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26  de==MODE_Ascii &
32c70 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  & (z==0 || z[0]=
32c80 3d 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72  =0) && i==0 ) br
32c90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
32ca0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
32cb0 53 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31  Stmt, i+1, z, -1
32cc0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
32cd0 4e 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  NT);.        if(
32ce0 20 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74   i<nCol-1 && sCt
32cf0 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43  x.cTerm!=sCtx.cC
32d00 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
32d10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
32d20 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65  tderr, "%s:%d: e
32d30 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
32d40 6e 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20  ns but found %d 
32d50 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  - ".            
32d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66                "f
32d70 69 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20  illing the rest 
32d80 77 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20  with NULL\n",.  
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32da0 20 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69          sCtx.zFi
32db0 6c 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e  le, startLine, n
32dc0 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  Col, i+1);.     
32dd0 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
32de0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c         while( i<
32df0 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33  =nCol ){ sqlite3
32e00 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
32e10 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20  , i); i++; }.   
32e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32e30 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54       if( sCtx.cT
32e40 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65  erm==sCtx.cColSe
32e50 70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  p ){.        do{
32e60 0a 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64  .          xRead
32e70 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
32e80 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
32e90 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
32ea0 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
32eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38   );.        utf8
32ec0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
32ed0 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64  "%s:%d: expected
32ee0 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20   %d columns but 
32ef0 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20  found %d - ".   
32f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f10 20 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e       "extras ign
32f20 6f 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ored\n",.       
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f40 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61   sCtx.zFile, sta
32f50 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29  rtLine, nCol, i)
32f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32f70 69 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20  if( i>=nCol ){. 
32f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
32f90 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
32fa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32fb0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
32fc0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32fe0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32ff0 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
33000 3a 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a  : INSERT failed:
33010 20 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69   %s\n", sCtx.zFi
33020 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
33030 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c            startL
33040 69 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ine, sqlite3_err
33050 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
33060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33070 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e     }while( sCtx.
33080 63 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20  cTerm!=EOF );.. 
33090 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
330a0 69 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  in);.    sqlite3
330b0 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20  _free(sCtx.z);. 
330c0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
330d0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
330e0 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29  if( needCommit )
330f0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
33100 3e 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  >db, "COMMIT", 0
33110 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
33120 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
33130 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66  _UNTESTABLE.  if
33140 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
33150 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
33160 6d 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20  mposter", n)==0 
33170 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
33180 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  l;.    char *zCo
33190 6c 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73  llist = 0;.    s
331a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
331b0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d  mt;.    int tnum
331c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
331d0 0a 20 20 20 20 69 66 28 20 21 28 6e 41 72 67 3d  .    if( !(nArg=
331e0 3d 33 20 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26  =3 || (nArg==2 &
331f0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
33200 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22  p(azArg[1],"off"
33210 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20  )==0)) ){.      
33220 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
33230 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70  rr, "Usage: .imp
33240 6f 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f  oster INDEX IMPO
33250 53 54 45 52 5c 6e 22 0a 20 20 20 20 20 20 20 20  STER\n".        
33260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33270 20 20 22 20 20 20 20 20 20 20 2e 69 6d 70 6f 73    "       .impos
33280 74 65 72 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20  ter off\n");.   
33290 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
332a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
332b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
332c0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
332d0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
332e0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
332f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
33300 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
33310 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c  IMPOSTER, p->db,
33320 20 22 6d 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a   "main", 0, 1);.
33330 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
33340 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
33350 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73    }.    zSql = s
33360 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
33370 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
33380 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
33390 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
333b0 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27   WHERE name='%q'
333c0 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
333d0 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
333e0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
333f0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
33400 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
33410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
33420 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
33430 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
33440 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
33450 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d  OW ){.      tnum
33460 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
33470 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
33480 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33490 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
334a0 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d  t);.    if( tnum
334b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
334c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
334d0 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
334e0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
334f0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
33500 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
33510 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
33520 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  t;.    }.    zSq
33530 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
33540 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65  ntf("PRAGMA inde
33550 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61  x_xinfo='%q'", a
33560 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63  zArg[1]);.    rc
33570 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
33580 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
33590 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
335a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
335b0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
335c0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
335d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
335e0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
335f0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
33600 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20  Label[20];.     
33610 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
33620 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
33630 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33640 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20  text(pStmt,2);. 
33650 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
33660 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  if( zCol==0 ){. 
33670 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
33680 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
33690 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20  tmt,1)==-1 ){.  
336a0 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
336b0 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20  _ROWID_";.      
336c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
336d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
336e0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  ntf(sizeof(zLabe
336f0 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25  l),zLabel,"expr%
33700 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  d",i);.         
33710 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a   zCol = zLabel;.
33720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33730 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  }.      if( zCol
33740 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  list==0 ){.     
33750 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
33760 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
33770 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20  "%w\"", zCol);. 
33780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33790 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73      zCollist = s
337a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
337b0 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  %z,\"%w\"", zCol
337c0 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  list, zCol);.   
337d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
337e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
337f0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
33800 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
33810 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43  tf(.          "C
33820 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77  REATE TABLE \"%w
33830 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45  \"(%s,PRIMARY KE
33840 59 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f  Y(%s))WITHOUT RO
33850 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20  WID",.          
33860 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69  azArg[2], zColli
33870 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  st, zCollist);. 
33880 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
33890 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72  zCollist);.    r
338a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
338b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
338c0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
338d0 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
338e0 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
338f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33900 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
33910 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
33920 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
33930 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
33940 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
33950 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
33960 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
33970 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
33980 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
33990 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
339a0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
339b0 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22  r in [%s]: %s\n"
339c0 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f  , zSql, sqlite3_
339d0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
339e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
339f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33a00 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (stdout, "%s;\n"
33a10 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
33a20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f   raw_printf(stdo
33a30 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  ut,.           "
33a40 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67  WARNING: writing
33a50 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20   to an imposter 
33a60 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75  table will corru
33a70 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22  pt the index!\n"
33a80 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
33a90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
33aa0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
33ab0 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f  stderr, "SQLITE_
33ac0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
33ad0 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  R returns %d\n",
33ae0 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc);.      rc =
33af0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
33b00 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
33b10 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
33b20 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
33b30 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f  ITE_OMIT_TEST_CO
33b40 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65  NTROL) */..#ifde
33b50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
33b60 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d  IOTRACE.  if( c=
33b70 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
33b80 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61  azArg[0], "iotra
33b90 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
33ba0 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74    SQLITE_API ext
33bb0 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45  ern void (SQLITE
33bc0 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49  _CDECL *sqlite3I
33bd0 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68  oTrace)(const ch
33be0 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69  ar*, ...);.    i
33bf0 66 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f  f( iotrace && io
33c00 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20  trace!=stdout ) 
33c10 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b  fclose(iotrace);
33c20 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30  .    iotrace = 0
33c30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
33c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33c50 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
33c60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
33c70 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22  mp(azArg[1], "-"
33c80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
33c90 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
33ca0 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
33cb0 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74      iotrace = st
33cc0 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dout;.    }else{
33cd0 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d  .      iotrace =
33ce0 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
33cf0 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
33d00 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20   iotrace==0 ){. 
33d10 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
33d20 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
33d30 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
33d40 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
33d50 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
33d60 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b  ite3IoTrace = 0;
33d70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
33d80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
33da0 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
33db0 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  intf;.      }.  
33dc0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
33dd0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
33de0 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e   && n>=5 && strn
33df0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
33e00 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  imits", n)==0 ){
33e10 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
33e20 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
33e30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
33e40 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  imitName;   /* N
33e50 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a  ame of a limit *
33e60 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  /.       int lim
33e70 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  itCode;         
33e80 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
33e90 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69  de for that limi
33ea0 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69  t */.    } aLimi
33eb0 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  t[] = {.      { 
33ec0 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20  "length",       
33ed0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
33ee0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20  LIMIT_LENGTH    
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f00 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f  },.      { "sql_
33f10 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
33f20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
33f30 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
33f40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
33f50 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20      { "column", 
33f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
33f70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
33f80 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
33f90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
33fa0 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20   "expr_depth",  
33fb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
33fc0 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
33fd0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
33fe0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d   },.      { "com
33ff0 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20  pound_select",  
34000 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
34010 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
34020 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  T           },. 
34030 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22       { "vdbe_op"
34040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34050 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
34060 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
34070 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
34080 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22  { "function_arg"
34090 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
340a0 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
340b0 5f 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20  _ARG            
340c0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74    },.      { "at
340d0 74 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20  tached",        
340e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
340f0 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20  IT_ATTACHED     
34100 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
34110 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61        { "like_pa
34120 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20  ttern_length",  
34130 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49   SQLITE_LIMIT_LI
34140 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
34150 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  H       },.     
34160 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d   { "variable_num
34170 62 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ber",       SQLI
34180 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
34190 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20  E_NUMBER        
341a0 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74     },.      { "t
341b0 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20  rigger_depth",  
341c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
341d0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
341e0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  H             },
341f0 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72  .      { "worker
34200 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20  _threads",      
34210 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57    SQLITE_LIMIT_W
34220 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20  ORKER_THREADS   
34230 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
34240 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32  };.    int i, n2
34250 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
34260 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
34270 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f  g==1 ){.      fo
34280 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
34290 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29  ze(aLimit); i++)
342a0 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
342b0 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
342c0 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
342d0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
342e0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
342f0 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
34300 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
34310 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34320 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20  else if( nArg>3 
34330 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
34340 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34350 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20  ge: .limit NAME 
34360 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b  ?NEW-VALUE?\n");
34370 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
34380 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
34390 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
343a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
343b0 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  t iLimit = -1;. 
343c0 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e       n2 = strlen
343d0 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  30(azArg[1]);.  
343e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
343f0 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29  rraySize(aLimit)
34400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
34410 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
34420 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a  icmp(aLimit[i].z
34430 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67  LimitName, azArg
34440 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20  [1], n2)==0 ){. 
34450 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69           if( iLi
34460 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  mit<0 ){.       
34470 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b       iLimit = i;
34480 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
34490 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
344a0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
344b0 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d  , "ambiguous lim
344c0 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  it: \"%s\"\n", a
344d0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
344e0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
344f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
34500 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
34510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
34520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34530 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
34540 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  <0 ){.        ut
34550 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
34560 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74  , "unknown limit
34570 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20  : \"%s\"\n".    
34580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34590 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69      "enter \".li
345a0 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61  mits\" with no a
345b0 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
345c0 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ist.\n",.       
345d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345e0 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
345f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34600 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
34610 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
34620 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
34630 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
34640 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
34650 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c  p->db, aLimit[iL
34660 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  imit].limitCode,
34670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34680 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65         (int)inte
34690 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  gerValue(azArg[2
346a0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
346b0 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
346c0 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c  %d\n", aLimit[iL
346d0 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  imit].zLimitName
346e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
346f0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
34700 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
34710 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31  t].limitCode, -1
34720 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
34730 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  e..  if( c=='l' 
34740 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  && n>2 && strncm
34750 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e  p(azArg[0], "lin
34760 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
34770 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
34780 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61      lintDotComma
34790 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
347a0 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  g);.  }else..#if
347b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
347c0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
347d0 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
347e0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
347f0 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20  , "load", n)==0 
34800 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
34810 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63  r *zFile, *zProc
34820 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
34830 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
34840 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
34850 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34860 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61  rr, "Usage: .loa
34870 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49  d FILE ?ENTRYPOI
34880 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  NT?\n");.      r
34890 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
348a0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
348b0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
348c0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
348d0 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72  .    zProc = nAr
348e0 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
348f0 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  : 0;.    open_db
34900 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
34910 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
34920 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a  tension(p->db, z
34930 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
34940 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
34950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34960 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
34970 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
34980 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
34990 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
349a0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
349b0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
349c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
349d0 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  dif..  if( c=='l
349e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
349f0 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29  rg[0], "log", n)
34a00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
34a10 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
34a20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
34a30 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20  r, "Usage: .log 
34a40 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
34a50 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
34a70 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
34a80 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20   azArg[1];.     
34a90 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
34aa0 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  se(p->pLog);.   
34ab0 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74     p->pLog = out
34ac0 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46  put_file_open(zF
34ad0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ile, 0);.    }. 
34ae0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34af0 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
34b00 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
34b10 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
34b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
34b30 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
34b40 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20  rg[1] : "";.    
34b50 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33  int n2 = strlen3
34b60 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  0(zMode);.    in
34b70 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b  t c2 = zMode[0];
34b80 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27  .    if( c2=='l'
34b90 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
34ba0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
34bb0 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  nes",n2)==0 ){. 
34bc0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
34bd0 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20  ODE_Line;.      
34be0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34bf0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
34c00 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
34c10 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
34c20 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
34c30 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74  f( c2=='c' && st
34c40 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
34c50 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
34c60 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
34c70 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
34c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
34c90 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
34ca0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
34cb0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
34cc0 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
34cd0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27  else if( c2=='l'
34ce0 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
34cf0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
34d00 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  st",n2)==0 ){.  
34d10 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
34d20 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
34d30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34d40 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
34d50 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
34d60 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
34d70 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
34d80 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
34d90 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
34da0 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
34db0 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
34dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34dd0 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63  c2=='h' && strnc
34de0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d  mp(azArg[1],"htm
34df0 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
34e00 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
34e10 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
34e20 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
34e30 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
34e40 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29  ],"tcl",n2)==0 )
34e50 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
34e60 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20  = MODE_Tcl;.    
34e70 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34e80 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
34e90 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
34ea0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
34eb0 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73  _Space);.      s
34ec0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34ed0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
34ee0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
34ef0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
34f00 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
34f10 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
34f20 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
34f30 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
34f40 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
34f50 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
34f60 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
34f70 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
34f80 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
34f90 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d  parator, SEP_Com
34fa0 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
34fb0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
34fc0 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
34fd0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
34fe0 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
34ff0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
35000 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
35010 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
35020 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
35030 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
35040 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
35050 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
35060 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
35070 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
35080 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29  arator, SEP_Tab)
35090 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
350a0 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63  c2=='i' && strnc
350b0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
350c0 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
350d0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
350e0 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
350f0 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
35100 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  (p, nArg>=3 ? az
35110 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22  Arg[2] : "table"
35120 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
35130 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e   c2=='q' && strn
35140 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75  cmp(azArg[1],"qu
35150 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ote",n2)==0 ){. 
35160 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
35170 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d  ODE_Quote;.    }
35180 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27  else if( c2=='a'
35190 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
351a0 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29  g[1],"ascii",n2)
351b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
351c0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69  mode = MODE_Asci
351d0 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
351e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
351f0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
35200 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
35210 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20  or, SEP_Unit);. 
35220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
35230 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
35240 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
35250 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
35260 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20  SEP_Record);.   
35270 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
35280 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
35290 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
352a0 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d  current output m
352b0 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65  ode: %s\n", mode
352c0 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
352d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
352e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
352f0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64  err, "Error: mod
35300 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
35310 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22  of: ".         "
35320 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76  ascii column csv
35330 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e   html insert lin
35340 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62  e list quote tab
35350 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20  s tcl\n");.     
35360 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
35370 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
35380 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a  >mode;.  }else..
35390 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20    if( c=='n' && 
353a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
353b0 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e  , "nullvalue", n
353c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
353d0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
353e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
353f0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c  f(sizeof(p->null
35400 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56  Value), p->nullV
35410 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
35420 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
35430 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
35440 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ize(p->nullValue
35450 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
35460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35470 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
35480 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c  rr, "Usage: .nul
35490 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22  lvalue STRING\n"
354a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
354b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
354c0 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
354d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
354e0 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20  , "open", n)==0 
354f0 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63  && n>=2 ){.    c
35500 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d  har *zNewFilenam
35510 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
35520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35530 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
35540 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20  int iName = 1;  
35550 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
35560 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20   azArg[] of the 
35570 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  filename */.    
35580 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b  int newFlag = 0;
35590 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
355a0 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f  delete file befo
355b0 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  re opening */.  
355c0 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65    /* Close the e
355d0 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
355e0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
355f0 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20  close_all(p);.  
35600 20 20 63 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62    close_db(p->db
35610 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30  );.    p->db = 0
35620 3b 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65  ;.    p->zDbFile
35630 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  name = 0;.    sq
35640 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46  lite3_free(p->zF
35650 72 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20  reeOnClose);.   
35660 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
35670 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65   = 0;.    p->ope
35680 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50  nMode = SHELL_OP
35690 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 70  EN_UNSPEC;.    p
356a0 2d 3e 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  ->szMax = 0;.   
356b0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
356c0 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d  mmand-line argum
356d0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ents */.    for(
356e0 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e  iName=1; iName<n
356f0 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69 4e 61  Arg && azArg[iNa
35700 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61  me][0]=='-'; iNa
35710 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e  me++){.      con
35720 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41  st char *z = azA
35730 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20  rg[iName];.     
35740 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
35750 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20 20 20  (z,"new") ){.   
35760 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d 20 31       newFlag = 1
35770 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
35780 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20  HAVE_ZLIB.      
35790 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
357a0 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70 22 29 20  Match(z, "zip") 
357b0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
357c0 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
357d0 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e  PEN_ZIPFILE;.#en
357e0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
357f0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
35800 7a 2c 20 22 61 70 70 65 6e 64 22 29 20 29 7b 0a  z, "append") ){.
35810 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
35820 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
35830 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 20 20  _APPENDVFS;.    
35840 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
35850 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72 65 61 64  onMatch(z, "read
35860 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20 20 20 20  only") ){.      
35870 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
35880 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f  SHELL_OPEN_READO
35890 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
358a0 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
358b0 41 4c 49 5a 45 0a 20 20 20 20 20 20 7d 65 6c 73  ALIZE.      }els
358c0 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63  e if( optionMatc
358d0 68 28 7a 2c 20 22 64 65 73 65 72 69 61 6c 69 7a  h(z, "deserializ
358e0 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  e") ){.        p
358f0 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
35900 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41 4c  LL_OPEN_DESERIAL
35910 49 5a 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IZE;.      }else
35920 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
35930 28 7a 2c 20 22 68 65 78 64 62 22 29 20 29 7b 0a  (z, "hexdb") ){.
35940 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
35950 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
35960 5f 48 45 58 44 42 3b 0a 20 20 20 20 20 20 7d 65  _HEXDB;.      }e
35970 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61  lse if( optionMa
35980 74 63 68 28 7a 2c 20 22 6d 61 78 73 69 7a 65 22  tch(z, "maxsize"
35990 29 20 26 26 20 69 4e 61 6d 65 2b 31 3c 6e 41 72  ) && iName+1<nAr
359a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  g ){.        p->
359b0 73 7a 4d 61 78 20 3d 20 69 6e 74 65 67 65 72 56  szMax = integerV
359c0 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 4e 61  alue(azArg[++iNa
359d0 6d 65 5d 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  me]);.#endif /* 
359e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
359f0 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a 20 20 20  SERIALIZE */.   
35a00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30     }else if( z[0
35a10 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
35a20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35a30 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  derr, "unknown o
35a40 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29  ption: %s\n", z)
35a50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
35a60 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
35a70 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
35a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35a90 20 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65      /* If a file
35aa0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
35ab0 64 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69  d, try to open i
35ac0 74 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a  t first */.    z
35ad0 4e 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41  NewFilename = nA
35ae0 72 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74  rg>iName ? sqlit
35af0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
35b00 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a   azArg[iName]) :
35b10 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77   0;.    if( zNew
35b20 46 69 6c 65 6e 61 6d 65 20 7c 7c 20 70 2d 3e 6f  Filename || p->o
35b30 70 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f  penMode==SHELL_O
35b40 50 45 4e 5f 48 45 58 44 42 20 29 7b 0a 20 20 20  PEN_HEXDB ){.   
35b50 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
35b60 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
35b70 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a  (zNewFilename);.
35b80 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65        p->zDbFile
35b90 6e 61 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e  name = zNewFilen
35ba0 61 6d 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f  ame;.      open_
35bb0 64 62 28 70 2c 20 4f 50 45 4e 5f 44 42 5f 4b 45  db(p, OPEN_DB_KE
35bc0 45 50 41 4c 49 56 45 29 3b 0a 20 20 20 20 20 20  EPALIVE);.      
35bd0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
35be0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
35bf0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
35c00 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
35c10 27 25 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c  '%s'\n", zNewFil
35c20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
35c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
35c40 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
35c50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35c60 20 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65   p->zFreeOnClose
35c70 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b   = zNewFilename;
35c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c90 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
35ca0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61  ){.      /* As a
35cb0 20 66 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20   fall-back open 
35cc0 61 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  a TEMP database 
35cd0 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46  */.      p->zDbF
35ce0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
35cf0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
35d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
35d10 0a 20 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20  .  if( (c=='o'. 
35d20 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6e 63         && (strnc
35d30 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75  mp(azArg[0], "ou
35d40 74 70 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74  tput", n)==0||st
35d50 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
35d60 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a  "once", n)==0)).
35d70 20 20 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26     || (c=='e' &&
35d80 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28   n==5 && strcmp(
35d90 61 7a 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22  azArg[0],"excel"
35da0 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
35db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
35dc0 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
35dd0 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22  rg[1] : "stdout"
35de0 3b 0a 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f  ;.    int bTxtMo
35df0 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  de = 0;.    if( 
35e00 61 7a 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27  azArg[0][0]=='e'
35e10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61   ){.      /* Tra
35e20 6e 73 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63  nsform the ".exc
35e30 65 6c 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f  el" command into
35e40 20 22 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20   ".once -x" */. 
35e50 20 20 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20       nArg = 2;. 
35e60 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20       azArg[0] = 
35e70 22 6f 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46  "once";.      zF
35e80 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d  ile = azArg[1] =
35e90 20 22 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d   "-x";.      n =
35ea0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   4;.    }.    if
35eb0 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20  ( nArg>2 ){.    
35ec0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35ed0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25  derr, "Usage: .%
35ee0 73 20 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e  s [-e|-x|FILE]\n
35ef0 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
35f00 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35f10 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35f20 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
35f30 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
35f40 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
35f50 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29   "once", n)==0 )
35f60 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
35f70 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  <2 ){.        ra
35f80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35f90 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28   "Usage: .once (
35fa0 2d 65 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b  -e|-x|FILE)\n");
35fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
35fc0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
35fd0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
35fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
35ff0 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a  ->outCount = 2;.
36000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36010 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30   p->outCount = 0
36020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70  ;.    }.    outp
36030 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  ut_reset(p);.   
36040 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27   if( zFile[0]=='
36050 2d 27 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d  -' && zFile[1]==
36060 27 2d 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23  '-' ) zFile++;.#
36070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
36080 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20  HAVE_SYSTEM.    
36090 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
360a0 2c 20 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74  , "-e")==0 || st
360b0 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22  rcmp(zFile, "-x"
360c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
360d0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a  >doXdgOpen = 1;.
360e0 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
360f0 50 75 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69  Push(p);.      i
36100 66 28 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27  f( zFile[1]=='x'
36110 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54   ){.        newT
36120 65 6d 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22  empFile(p, "csv"
36130 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f  );.        p->mo
36140 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
36150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
36160 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
36170 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
36180 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
36190 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20  , SEP_Comma);.  
361a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
361b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
361c0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
361d0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
361e0 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20   SEP_CrLf);.    
361f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36200 20 6e 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20   newTempFile(p, 
36210 22 74 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20  "txt");.        
36220 62 54 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  bTxtMode = 1;.  
36230 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c      }.      zFil
36240 65 20 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  e = p->zTempFile
36250 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
36260 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
36270 53 59 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66  SYSTEM */.    if
36280 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20  ( zFile[0]=='|' 
36290 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
362a0 5f 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20  _OMIT_POPEN.    
362b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
362c0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70  err, "Error: pip
362d0 65 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f  es are not suppo
362e0 72 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c  rted in this OS\
362f0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
36300 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  1;.      p->out 
36310 3d 20 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a  = stdout;.#else.
36320 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70        p->out = p
36330 6f 70 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20  open(zFile + 1, 
36340 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  "w");.      if( 
36350 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  p->out==0 ){.   
36360 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
36370 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
36380 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65  cannot open pipe
36390 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
363a0 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20  e + 1);.        
363b0 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
363c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
363d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
363e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
363f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
36400 3e 6f 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75  >outfile), p->ou
36410 74 66 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69  tfile, "%s", zFi
36420 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  le);.      }.#en
36430 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
36440 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75       p->out = ou
36450 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a  tput_file_open(z
36460 46 69 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b  File, bTxtMode);
36470 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
36480 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
36490 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
364a0 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20  ,"off")!=0 ){.  
364b0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
364c0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
364d0 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20  r: cannot write 
364e0 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  to \"%s\"\n", zF
364f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ile);.        }.
36500 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d          p->out =
36510 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20   stdout;.       
36520 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
36530 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
36540 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36550 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
36560 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
36570 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
36580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
36590 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
365a0 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  p' && n>=3 && st
365b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
365c0 22 70 61 72 61 6d 65 74 65 72 22 2c 20 6e 29 3d  "parameter", n)=
365d0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
365e0 62 28 70 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  b(p,0);.    if( 
365f0 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 70  nArg<=1 ) goto p
36600 61 72 61 6d 65 74 65 72 5f 73 79 6e 74 61 78 5f  arameter_syntax_
36610 65 72 72 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 2e  error;..    /* .
36620 70 61 72 61 6d 65 74 65 72 20 63 6c 65 61 72 0a  parameter clear.
36630 20 20 20 20 2a 2a 20 43 6c 65 61 72 20 61 6c 6c      ** Clear all
36640 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 73   bind parameters
36650 20 62 79 20 64 72 6f 70 70 69 6e 67 20 74 68 65   by dropping the
36660 20 54 45 4d 50 20 74 61 62 6c 65 20 74 68 61 74   TEMP table that
36670 20 68 6f 6c 64 73 20 74 68 65 6d 2e 0a 20 20 20   holds them..   
36680 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67   */.    if( nArg
36690 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==2 && strcmp(az
366a0 41 72 67 5b 31 5d 2c 22 63 6c 65 61 72 22 29 3d  Arg[1],"clear")=
366b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
366c0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
366d0 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
366e0 58 49 53 54 53 20 74 65 6d 70 2e 5b 22 20 42 49  XISTS temp.[" BI
366f0 4e 44 5f 50 41 52 41 4d 5f 54 41 42 4c 45 20 22  ND_PARAM_TABLE "
36700 5d 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ];",.           
36710 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 29          0, 0, 0)
36720 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
36730 20 2f 2a 20 2e 70 61 72 61 6d 65 74 65 72 20 6c   /* .parameter l
36740 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20  ist.    ** List 
36750 61 6c 6c 20 62 69 6e 64 20 70 61 72 61 6d 65 74  all bind paramet
36760 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
36770 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 73  if( nArg==2 && s
36780 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
36790 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
367a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
367b0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
367c0 20 20 69 6e 74 20 72 78 3b 0a 20 20 20 20 20 20    int rx;.      
367d0 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  int len = 0;.   
367e0 20 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33 5f     rx = sqlite3_
367f0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
36800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
36810 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 6e 67 74  SELECT max(lengt
36820 68 28 6b 65 79 29 29 20 22 0a 20 20 20 20 20 20  h(key)) ".      
36830 20 20 20 20 20 20 20 22 46 52 4f 4d 20 74 65 6d         "FROM tem
36840 70 2e 5b 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f  p.[" BIND_PARAM_
36850 54 41 42 4c 45 20 22 5d 3b 22 2c 20 2d 31 2c 20  TABLE "];", -1, 
36860 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
36870 20 20 69 66 28 20 72 78 3d 3d 53 51 4c 49 54 45    if( rx==SQLITE
36880 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73  _OK && sqlite3_s
36890 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
368a0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
368b0 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
368c0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
368d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
368e0 28 20 6c 65 6e 3e 34 30 20 29 20 6c 65 6e 20 3d  ( len>40 ) len =
368f0 20 34 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   40;.      }.   
36900 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
36910 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
36920 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
36930 20 20 20 69 66 28 20 6c 65 6e 20 29 7b 0a 20 20     if( len ){.  
36940 20 20 20 20 20 20 72 78 20 3d 20 73 71 6c 69 74        rx = sqlit
36950 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
36960 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
36970 20 20 22 53 45 4c 45 43 54 20 6b 65 79 2c 20 71    "SELECT key, q
36980 75 6f 74 65 28 76 61 6c 75 65 29 20 22 0a 20 20  uote(value) ".  
36990 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
369a0 20 74 65 6d 70 2e 5b 22 20 42 49 4e 44 5f 50 41   temp.[" BIND_PA
369b0 52 41 4d 5f 54 41 42 4c 45 20 22 5d 3b 22 2c 20  RAM_TABLE "];", 
369c0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
369d0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
369e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
369f0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
36a00 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
36a10 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
36a20 22 25 2d 2a 73 20 25 73 5c 6e 22 2c 20 6c 65 6e  "%-*s %s\n", len
36a30 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
36a40 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29 2c 0a  _text(pStmt,0),.
36a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
36a70 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
36a80 31 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1));.        }. 
36a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
36aa0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
36ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36ac0 65 0a 0a 20 20 20 20 2f 2a 20 2e 70 61 72 61 6d  e..    /* .param
36ad0 65 74 65 72 20 69 6e 69 74 0a 20 20 20 20 2a 2a  eter init.    **
36ae0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
36af0 45 4d 50 20 74 61 62 6c 65 20 75 73 65 64 20 74  EMP table used t
36b00 6f 20 68 6f 6c 64 20 62 69 6e 64 20 70 61 72 61  o hold bind para
36b10 6d 65 74 65 72 73 20 65 78 69 73 74 73 2e 0a 20  meters exists.. 
36b20 20 20 20 2a 2a 20 43 72 65 61 74 65 20 69 74 20     ** Create it 
36b30 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
36b40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72    */.    if( nAr
36b50 67 3d 3d 32 20 26 26 20 73 74 72 63 6d 70 28 61  g==2 && strcmp(a
36b60 7a 41 72 67 5b 31 5d 2c 22 69 6e 69 74 22 29 3d  zArg[1],"init")=
36b70 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 69 6e 64  =0 ){.      bind
36b80 5f 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b 0a  _table_init(p);.
36b90 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
36ba0 2a 20 2e 70 61 72 61 6d 65 74 65 72 20 73 65 74  * .parameter set
36bb0 20 4e 41 4d 45 20 56 41 4c 55 45 0a 20 20 20 20   NAME VALUE.    
36bc0 2a 2a 20 53 65 74 20 6f 72 20 72 65 73 65 74 20  ** Set or reset 
36bd0 61 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72  a bind parameter
36be0 2e 20 20 4e 41 4d 45 20 73 68 6f 75 6c 64 20 62  .  NAME should b
36bf0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 72 61 6d  e the full param
36c00 65 74 65 72 0a 20 20 20 20 2a 2a 20 6e 61 6d 65  eter.    ** name
36c10 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 61   exactly as it a
36c20 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 71 75  ppears in the qu
36c30 65 72 79 2e 20 20 28 65 78 3a 20 24 61 62 63 2c  ery.  (ex: $abc,
36c40 20 40 64 65 66 29 2e 20 20 54 68 65 0a 20 20 20   @def).  The.   
36c50 20 2a 2a 20 56 41 4c 55 45 20 63 61 6e 20 62 65   ** VALUE can be
36c60 20 69 6e 20 65 69 74 68 65 72 20 53 51 4c 20 6c   in either SQL l
36c70 69 74 65 72 61 6c 20 6e 6f 74 61 74 69 6f 6e 2c  iteral notation,
36c80 20 6f 72 20 69 66 20 6e 6f 74 20 69 74 20 77 69   or if not it wi
36c90 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 64  ll be.    ** und
36ca0 65 72 73 74 6f 6f 64 20 74 6f 20 62 65 20 61 20  erstood to be a 
36cb0 74 65 78 74 20 73 74 72 69 6e 67 2e 0a 20 20 20  text string..   
36cc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 41 72 67   */.    if( nArg
36cd0 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==4 && strcmp(az
36ce0 41 72 67 5b 31 5d 2c 22 73 65 74 22 29 3d 3d 30  Arg[1],"set")==0
36cf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 78   ){.      int rx
36d00 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  ;.      char *zS
36d10 71 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ql;.      sqlite
36d20 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
36d30 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
36d40 2a 7a 4b 65 79 20 3d 20 61 7a 41 72 67 5b 32 5d  *zKey = azArg[2]
36d50 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
36d60 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 61 7a 41  ar *zValue = azA
36d70 72 67 5b 33 5d 3b 0a 20 20 20 20 20 20 62 69 6e  rg[3];.      bin
36d80 64 5f 74 61 62 6c 65 5f 69 6e 69 74 28 70 29 3b  d_table_init(p);
36d90 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
36da0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dc0 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74   "REPLACE INTO t
36dd0 65 6d 70 2e 5b 22 20 42 49 4e 44 5f 50 41 52 41  emp.[" BIND_PARA
36de0 4d 5f 54 41 42 4c 45 20 22 5d 28 6b 65 79 2c 76  M_TABLE "](key,v
36df0 61 6c 75 65 29 22 0a 20 20 20 20 20 20 20 20 20  alue)".         
36e00 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53           "VALUES
36e10 28 25 51 2c 25 73 29 3b 22 2c 20 7a 4b 65 79 2c  (%Q,%s);", zKey,
36e20 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20   zValue);.      
36e30 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 73 68  if( zSql==0 ) sh
36e40 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
36e50 79 28 29 3b 0a 20 20 20 20 20 20 70 53 74 6d 74  y();.      pStmt
36e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 78 20 3d   = 0;.      rx =
36e70 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
36e80 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
36e90 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
36ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
36eb0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20  ree(zSql);.     
36ec0 20 69 66 28 20 72 78 21 3d 53 51 4c 49 54 45 5f   if( rx!=SQLITE_
36ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
36ee0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
36ef0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
36f00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
36f10 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
36f20 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
36f30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45               "RE
36f40 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 6d 70 2e  PLACE INTO temp.
36f50 5b 22 20 42 49 4e 44 5f 50 41 52 41 4d 5f 54 41  [" BIND_PARAM_TA
36f60 42 4c 45 20 22 5d 28 6b 65 79 2c 76 61 6c 75 65  BLE "](key,value
36f70 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
36f80 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 51        "VALUES(%Q
36f90 2c 25 51 29 3b 22 2c 20 7a 4b 65 79 2c 20 7a 56  ,%Q);", zKey, zV
36fa0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
36fb0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 73 68 65  f( zSql==0 ) she
36fc0 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79  ll_out_of_memory
36fd0 28 29 3b 0a 20 20 20 20 20 20 20 20 72 78 20 3d  ();.        rx =
36fe0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
36ff0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
37000 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
37010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37020 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
37030 20 20 20 20 20 69 66 28 20 72 78 21 3d 53 51 4c       if( rx!=SQL
37040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37050 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
37060 70 2d 3e 6f 75 74 2c 20 22 45 72 72 6f 72 3a 20  p->out, "Error: 
37070 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
37080 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
37090 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
370a0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
370b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 6d  ;.          pStm
370c0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
370d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
370e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
370f0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
37100 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tmt);.      sqli
37110 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
37120 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  mt);.    }else..
37130 20 20 20 20 2f 2a 20 2e 70 61 72 61 6d 65 74 65      /* .paramete
37140 72 20 75 6e 73 65 74 20 4e 41 4d 45 0a 20 20 20  r unset NAME.   
37150 20 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 4e   ** Remove the N
37160 41 4d 45 20 62 69 6e 64 69 6e 67 20 66 72 6f 6d  AME binding from
37170 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 62   the parameter b
37180 69 6e 64 69 6e 67 20 74 61 62 6c 65 2c 20 69 66  inding table, if
37190 20 69 74 0a 20 20 20 20 2a 2a 20 65 78 69 73 74   it.    ** exist
371a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
371b0 28 20 6e 41 72 67 3d 3d 33 20 26 26 20 73 74 72  ( nArg==3 && str
371c0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 75 6e  cmp(azArg[1],"un
371d0 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  set")==0 ){.    
371e0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
371f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
37200 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
37210 45 20 46 52 4f 4d 20 74 65 6d 70 2e 5b 22 20 42  E FROM temp.[" B
37220 49 4e 44 5f 50 41 52 41 4d 5f 54 41 42 4c 45 20  IND_PARAM_TABLE 
37230 22 5d 20 57 48 45 52 45 20 6b 65 79 3d 25 51 22  "] WHERE key=%Q"
37240 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20  , azArg[2]);.   
37250 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
37260 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65   shell_out_of_me
37270 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20 73 71  mory();.      sq
37280 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
37290 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
372a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
372b0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
372c0 7d 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  }else.    /* If 
372d0 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  no command name 
372e0 6d 61 74 63 68 65 73 2c 20 73 68 6f 77 20 61 20  matches, show a 
372f0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a  syntax error */.
37300 20 20 20 20 70 61 72 61 6d 65 74 65 72 5f 73 79      parameter_sy
37310 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 20 20  ntax_error:.    
37320 73 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c  showHelp(p->out,
37330 20 22 70 61 72 61 6d 65 74 65 72 22 29 3b 0a 20   "parameter");. 
37340 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
37350 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='p' && n>=3 && 
37360 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
37370 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30  , "print", n)==0
37380 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
37390 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
373a0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
373b0 69 66 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72  if( i>1 ) raw_pr
373c0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
373d0 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
373e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
373f0 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
37400 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
37410 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
37420 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64  ;.  }else..#ifnd
37430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
37440 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
37450 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26  .  if( c=='p' &&
37460 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
37470 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 67  (azArg[0], "prog
37480 72 65 73 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ress", n)==0 ){.
37490 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
374a0 6e 74 20 6e 6e 20 3d 20 30 3b 0a 20 20 20 20 70  nt nn = 0;.    p
374b0 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 3d 20  ->flgProgress = 
374c0 30 3b 0a 20 20 20 20 70 2d 3e 6d 78 50 72 6f 67  0;.    p->mxProg
374d0 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 70 2d  ress = 0;.    p-
374e0 3e 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >nProgress = 0;.
374f0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
37500 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
37510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
37520 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
37530 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
37540 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  {.        z++;. 
37550 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d         if( z[0]=
37560 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
37570 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
37580 2c 22 71 75 69 65 74 22 29 3d 3d 30 20 7c 7c 20  ,"quiet")==0 || 
37590 73 74 72 63 6d 70 28 7a 2c 22 71 22 29 3d 3d 30  strcmp(z,"q")==0
375a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
375b0 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 7c 3d 20  >flgProgress |= 
375c0 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 51  SHELL_PROGRESS_Q
375d0 55 49 45 54 3b 0a 20 20 20 20 20 20 20 20 20 20  UIET;.          
375e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
375f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
37600 73 74 72 63 6d 70 28 7a 2c 22 72 65 73 65 74 22  strcmp(z,"reset"
37610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
37620 20 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73    p->flgProgress
37630 20 7c 3d 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45   |= SHELL_PROGRE
37640 53 53 5f 52 45 53 45 54 3b 0a 20 20 20 20 20 20  SS_RESET;.      
37650 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
37660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37670 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6f 6e  if( strcmp(z,"on
37680 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
37690 20 20 20 20 20 70 2d 3e 66 6c 67 50 72 6f 67 72       p->flgProgr
376a0 65 73 73 20 7c 3d 20 53 48 45 4c 4c 5f 50 52 4f  ess |= SHELL_PRO
376b0 47 52 45 53 53 5f 4f 4e 43 45 3b 0a 20 20 20 20  GRESS_ONCE;.    
376c0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
376d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
376e0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
376f0 6c 69 6d 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20  limit")==0 ){.  
37700 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 31 3e          if( i+1>
37710 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  =nArg ){.       
37720 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
37730 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
37740 20 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e   missing argumen
37750 74 20 6f 6e 20 2d 2d 6c 69 6d 69 74 5c 6e 22 29  t on --limit\n")
37760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
37770 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
37780 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
37790 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
377a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
377b0 20 20 20 20 20 20 20 70 2d 3e 6d 78 50 72 6f 67         p->mxProg
377c0 72 65 73 73 20 3d 20 28 69 6e 74 29 69 6e 74 65  ress = (int)inte
377d0 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b  gerValue(azArg[+
377e0 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +i]);.          
377f0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  }.          cont
37800 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
37810 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
37820 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
37830 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  or: unknown opti
37840 6f 6e 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  on: \"%s\"\n", a
37850 7a 41 72 67 5b 69 5d 29 3b 0a 20